36 Double_t TCurlyArc::fgDefaultWaveLength = 0.02;
37 Double_t TCurlyArc::fgDefaultAmplitude = 0.01;
38 Bool_t TCurlyArc::fgDefaultIsCurly = kTRUE;
45 TCurlyArc::TCurlyArc()
58 TCurlyArc::TCurlyArc(Double_t x1, Double_t y1,
59 Double_t rad, Double_t phimin, Double_t phimax,
60 Double_t wl, Double_t amp)
61 : fR1(rad), fPhimin(phimin),fPhimax(phimax)
65 fIsCurly = fgDefaultIsCurly;
75 void TCurlyArc::Build()
77 Double_t pixeltoX = 1;
78 Double_t pixeltoY = 1;
81 Double_t ww = (Double_t)gPad->GetWw();
82 Double_t wh = (Double_t)gPad->GetWh();
83 Double_t pxrange = gPad->GetAbsWNDC()*ww;
84 Double_t pyrange = - gPad->GetAbsHNDC()*wh;
85 Double_t xrange = gPad->GetX2() - gPad->GetX1();
86 Double_t yrange = gPad->GetY2() - gPad->GetY1();
87 pixeltoX = xrange / pxrange;
88 pixeltoY = yrange/pyrange;
89 rPix = fR1 / pixeltoX;
91 Double_t dang = fPhimax - fPhimin;
92 if (dang < 0) dang += 360;
93 Double_t length = TMath::Pi() * fR1 * dang/180;
102 Double_t *xv= GetX();
103 Double_t *yv= GetY();
104 Double_t xx, yy, angle;
105 for(Int_t i = 0; i < fNsteps; i++){
106 angle = xv[i] / rPix + fPhimin * TMath::Pi()/180;
107 xx = (yv[i] + rPix) * cos(angle);
108 yy = (yv[i] + rPix) * sin(angle);
110 yy *= TMath::Abs(pixeltoY);
114 if (gPad) gPad->Modified();
123 Int_t TCurlyArc::DistancetoPrimitive(Int_t px, Int_t py)
126 Int_t pxc = gPad->XtoAbsPixel(fX1);
127 Int_t pyc = gPad->YtoAbsPixel(fY1);
128 Double_t dist = TMath::Sqrt(Double_t((pxc-px)*(pxc-px)+(pyc-py)*(pyc-py)));
129 Double_t cosa = (px - pxc)/dist;
130 Double_t sina = (pyc - py)/dist;
131 Double_t phi = TMath::ATan2(sina,cosa);
132 if (phi < 0) phi += 2 * TMath::Pi();
133 phi = phi * 180 / TMath::Pi();
134 if (fPhimax > fPhimin){
135 if (phi < fPhimin || phi > fPhimax)
return 9999;
137 if (phi > fPhimin && phi < fPhimax)
return 9999;
139 Int_t pxr = gPad->XtoPixel(fR1)- gPad->XtoPixel(0);
140 Double_t distr = TMath::Abs(dist-pxr);
155 void TCurlyArc::ExecuteEvent(Int_t event, Int_t px, Int_t py)
161 const Double_t pi = TMath::Pi();
162 static Int_t x[np+3], y[np+3];
163 static Int_t px1,py1,npe,r1;
164 static Int_t pxold, pyold;
166 Double_t angle,dx,dy,dphi,rLx,rRx;
168 static Bool_t pTop, pL, pR, pBot, pINSIDE;
169 static Int_t pTx,pTy,pLx,pLy,pRx,pRy,pBx,pBy;
171 Bool_t opaque = gPad->OpaqueMoving();
178 gVirtualX->SetLineColor(-1);
180 dphi = (fPhimax-fPhimin) * pi / 180;
181 if (dphi<0) dphi += 2 * pi;
183 phi0 = fPhimin * pi / 180;
184 for (i=0;i<=np;i++) {
185 angle = Double_t(i)*dphi + phi0;
186 dx = fR1*TMath::Cos(angle);
187 dy = fR1*TMath::Sin(angle);
188 Int_t rpixY = gPad->XtoAbsPixel(dy) - gPad->XtoAbsPixel(0);
189 x[i] = gPad->XtoAbsPixel(fX1 + dx);
190 y[i] = gPad->YtoAbsPixel(fY1) + rpixY;
192 if (fPhimax-fPhimin >= 360 ) {
197 x[np+1] = gPad->XtoAbsPixel(fX1);
198 y[np+1] = gPad->YtoAbsPixel(fY1);
204 px1 = gPad->XtoAbsPixel(fX1);
205 py1 = gPad->YtoAbsPixel(fY1);
208 pLx = gPad->XtoAbsPixel(-fR1+fX1);
209 pRx = gPad->XtoAbsPixel( fR1+fX1);
210 r1 = TMath::Abs(pLx-pRx)/2;
212 pTy = gPad->YtoAbsPixel(fY1) + r1;
213 pBy = gPad->YtoAbsPixel(fY1) - r1;
216 gVirtualX->DrawLine(pRx+4, py1+4, pRx-4, py1+4);
217 gVirtualX->DrawLine(pRx-4, py1+4, pRx-4, py1-4);
218 gVirtualX->DrawLine(pRx-4, py1-4, pRx+4, py1-4);
219 gVirtualX->DrawLine(pRx+4, py1-4, pRx+4, py1+4);
220 gVirtualX->DrawLine(pLx+4, py1+4, pLx-4, py1+4);
221 gVirtualX->DrawLine(pLx-4, py1+4, pLx-4, py1-4);
222 gVirtualX->DrawLine(pLx-4, py1-4, pLx+4, py1-4);
223 gVirtualX->DrawLine(pLx+4, py1-4, pLx+4, py1+4);
224 gVirtualX->DrawLine(px1+4, pBy+4, px1-4, pBy+4);
225 gVirtualX->DrawLine(px1-4, pBy+4, px1-4, pBy-4);
226 gVirtualX->DrawLine(px1-4, pBy-4, px1+4, pBy-4);
227 gVirtualX->DrawLine(px1+4, pBy-4, px1+4, pBy+4);
228 gVirtualX->DrawLine(px1+4, pTy+4, px1-4, pTy+4);
229 gVirtualX->DrawLine(px1-4, pTy+4, px1-4, pTy-4);
230 gVirtualX->DrawLine(px1-4, pTy-4, px1+4, pTy-4);
231 gVirtualX->DrawLine(px1+4, pTy-4, px1+4, pTy+4);
236 px1 = gPad->XtoAbsPixel(fX1);
237 py1 = gPad->YtoAbsPixel(fY1);
240 pLx = gPad->XtoAbsPixel(-fR1+fX1);
241 pRx = gPad->XtoAbsPixel( fR1+fX1);
243 pTy = gPad->YtoAbsPixel(fY1) + TMath::Abs(pLx-pRx)/2;
244 pBy = gPad->YtoAbsPixel(fY1) - TMath::Abs(pLx-pRx)/2;
246 pTop = pL = pR = pBot = pINSIDE = kFALSE;
247 if ((TMath::Abs(px - pTx) < kMaxDiff) &&
248 (TMath::Abs(py - pTy) < kMaxDiff)) {
250 gPad->SetCursor(kTopSide);
253 if ((TMath::Abs(px - pBx) < kMaxDiff) &&
254 (TMath::Abs(py - pBy) < kMaxDiff)) {
256 gPad->SetCursor(kBottomSide);
259 if ((TMath::Abs(py - pLy) < kMaxDiff) &&
260 (TMath::Abs(px - pLx) < kMaxDiff)) {
262 gPad->SetCursor(kLeftSide);
265 if ((TMath::Abs(py - pRy) < kMaxDiff) &&
266 (TMath::Abs(px - pRx) < kMaxDiff)) {
268 gPad->SetCursor(kRightSide);
270 else {pINSIDE= kTRUE; gPad->SetCursor(kMove); }
271 pxold = px; pyold = py;
275 case kArrowKeyRelease:
278 gVirtualX->DrawLine(pRx+4, py1+4, pRx-4, py1+4);
279 gVirtualX->DrawLine(pRx-4, py1+4, pRx-4, py1-4);
280 gVirtualX->DrawLine(pRx-4, py1-4, pRx+4, py1-4);
281 gVirtualX->DrawLine(pRx+4, py1-4, pRx+4, py1+4);
282 gVirtualX->DrawLine(pLx+4, py1+4, pLx-4, py1+4);
283 gVirtualX->DrawLine(pLx-4, py1+4, pLx-4, py1-4);
284 gVirtualX->DrawLine(pLx-4, py1-4, pLx+4, py1-4);
285 gVirtualX->DrawLine(pLx+4, py1-4, pLx+4, py1+4);
286 gVirtualX->DrawLine(px1+4, pBy+4, px1-4, pBy+4);
287 gVirtualX->DrawLine(px1-4, pBy+4, px1-4, pBy-4);
288 gVirtualX->DrawLine(px1-4, pBy-4, px1+4, pBy-4);
289 gVirtualX->DrawLine(px1+4, pBy-4, px1+4, pBy+4);
290 gVirtualX->DrawLine(px1+4, pTy+4, px1-4, pTy+4);
291 gVirtualX->DrawLine(px1-4, pTy+4, px1-4, pTy-4);
292 gVirtualX->DrawLine(px1-4, pTy-4, px1+4, pTy-4);
293 gVirtualX->DrawLine(px1+4, pTy-4, px1+4, pTy+4);
294 for (i=0;i<npe;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
308 if (pTop || pBot || pL || pR) {
310 gVirtualX->SetLineColor(-1);
312 dphi = (fPhimax-fPhimin) * pi / 180;
313 if (dphi<0) dphi += 2 * pi;
315 phi0 = fPhimin * pi / 180;
317 Int_t pX1 = gPad->XtoAbsPixel(fX1);
318 Int_t pY1 = gPad->YtoAbsPixel(fY1);
319 for (i=0;i<=np;i++) {
320 angle = Double_t(i)*dphi + phi0;
321 dx = ur1 * TMath::Cos(angle);
322 dy = ur1 * TMath::Sin(angle);
323 x[i] = pX1 + (Int_t)dx;
324 y[i] = pY1 + (Int_t)dy;
326 if (fPhimax-fPhimin >= 360 ) {
337 for (i=0;i<npe;i++) {
338 gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
342 this->SetStartPoint(gPad->AbsPixeltoX(px1), gPad->AbsPixeltoY(py1));
343 this->SetRadius(TMath::Abs(gPad->AbsPixeltoX(px1-r1)-gPad->AbsPixeltoX(px1+r1))/2);
344 if (pTop) gPad->ShowGuidelines(
this, event,
't',
true);
345 if (pBot) gPad->ShowGuidelines(
this, event,
'b',
true);
346 if (pL) gPad->ShowGuidelines(
this, event,
'l',
true);
347 if (pR) gPad->ShowGuidelines(
this, event,
'r',
true);
348 gPad->Modified(kTRUE);
353 dpx = px-pxold; dpy = py-pyold;
354 px1 += dpx; py1 += dpy;
356 for (i=0;i<=npe;i++) { x[i] += dpx; y[i] += dpy;}
357 for (i=0;i<npe;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
359 this->SetStartPoint(gPad->AbsPixeltoX(px1), gPad->AbsPixeltoY(py1));
360 gPad->ShowGuidelines(
this, event,
'i',
true);
361 gPad->Modified(kTRUE);
372 gVirtualX->DrawLine(pRx+4, py1+4, pRx-4, py1+4);
373 gVirtualX->DrawLine(pRx-4, py1+4, pRx-4, py1-4);
374 gVirtualX->DrawLine(pRx-4, py1-4, pRx+4, py1-4);
375 gVirtualX->DrawLine(pRx+4, py1-4, pRx+4, py1+4);
376 gVirtualX->DrawLine(pLx+4, py1+4, pLx-4, py1+4);
377 gVirtualX->DrawLine(pLx-4, py1+4, pLx-4, py1-4);
378 gVirtualX->DrawLine(pLx-4, py1-4, pLx+4, py1-4);
379 gVirtualX->DrawLine(pLx+4, py1-4, pLx+4, py1+4);
380 gVirtualX->DrawLine(px1+4, pBy+4, px1-4, pBy+4);
381 gVirtualX->DrawLine(px1-4, pBy+4, px1-4, pBy-4);
382 gVirtualX->DrawLine(px1-4, pBy-4, px1+4, pBy-4);
383 gVirtualX->DrawLine(px1+4, pBy-4, px1+4, pBy+4);
384 gVirtualX->DrawLine(px1+4, pTy+4, px1-4, pTy+4);
385 gVirtualX->DrawLine(px1-4, pTy+4, px1-4, pTy-4);
386 gVirtualX->DrawLine(px1-4, pTy-4, px1+4, pTy-4);
387 gVirtualX->DrawLine(px1+4, pTy-4, px1+4, pTy+4);
395 gPad->ShowGuidelines(
this, event);
397 fX1 = gPad->AbsPixeltoX(px1);
398 fY1 = gPad->AbsPixeltoY(py1);
399 rLx = gPad->AbsPixeltoX(px1+r1);
400 rRx = gPad->AbsPixeltoX(px1-r1);
401 fR1 = TMath::Abs(rRx-rLx)/2;
404 gPad->Modified(kTRUE);
405 if (!opaque) gVirtualX->SetLineColor(-1);
412 void TCurlyArc::SavePrimitive(std::ostream &out, Option_t * )
414 if (gROOT->ClassSaved(TCurlyArc::Class())) {
419 out<<
"curlyarc = new TCurlyArc("
420 <<fX1<<
","<<fY1<<
","<<fR1<<
","<<fPhimin<<
","<<fPhimax<<
","
421 <<fWaveLength<<
","<<fAmplitude<<
");"<<std::endl;
423 out<<
" curlyarc->SetWavy();"<<std::endl;
425 SaveLineAttributes(out,
"curlyarc",1,1,1);
426 out<<
" curlyarc->Draw();"<<std::endl;
432 void TCurlyArc::SetCenter(Double_t x, Double_t y)
442 void TCurlyArc::SetRadius(Double_t x)
451 void TCurlyArc::SetPhimin(Double_t x)
460 void TCurlyArc::SetPhimax(Double_t x)
469 void TCurlyArc::SetDefaultWaveLength(Double_t WaveLength)
471 fgDefaultWaveLength = WaveLength;
477 void TCurlyArc::SetDefaultAmplitude(Double_t Amplitude)
479 fgDefaultAmplitude = Amplitude ;
485 void TCurlyArc::SetDefaultIsCurly(Bool_t IsCurly)
487 fgDefaultIsCurly = IsCurly;
493 Double_t TCurlyArc::GetDefaultWaveLength()
495 return fgDefaultWaveLength;
501 Double_t TCurlyArc::GetDefaultAmplitude()
503 return fgDefaultAmplitude;
509 Bool_t TCurlyArc::GetDefaultIsCurly()
511 return fgDefaultIsCurly;
517 Rectangle_t TCurlyArc::GetBBox()
519 Double_t R2 = fR1 * TMath::Abs(gPad->GetY2()-gPad->GetY1())/TMath::Abs(gPad->GetX2()-gPad->GetX1());
522 BBox.fX = gPad->XtoPixel(fX1-fR1);
523 BBox.fY = gPad->YtoPixel(fY1+R2);
524 BBox.fWidth = gPad->XtoPixel(fX1+fR1)-gPad->XtoPixel(fX1-fR1);
525 BBox.fHeight = gPad->YtoPixel(fY1-R2)-gPad->YtoPixel(fY1+R2);
532 TPoint TCurlyArc::GetBBoxCenter()
535 p.SetX(gPad->XtoPixel(fX1));
536 p.SetY(gPad->YtoPixel(fY1));
543 void TCurlyArc::SetBBoxCenter(
const TPoint &p)
545 fX1 = gPad->PixeltoX(p.GetX());
546 fY1 = gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0));
553 void TCurlyArc::SetBBoxCenterX(
const Int_t x)
555 fX1 = gPad->PixeltoX(x);
562 void TCurlyArc::SetBBoxCenterY(
const Int_t y)
564 fY1 = gPad->PixeltoY(y-gPad->VtoPixel(0));
572 void TCurlyArc::SetBBoxX1(
const Int_t x)
574 Double_t x1 = gPad->PixeltoX(x);
575 if (x1>fX1+fR1)
return;
577 fR1 = (fX1+fR1-x1)*0.5;
585 void TCurlyArc::SetBBoxX2(
const Int_t x)
587 Double_t x2 = gPad->PixeltoX(x);
588 if (x2<fX1-fR1)
return;
590 fR1 = (x2-fX1+fR1)*0.5;
597 void TCurlyArc::SetBBoxY1(
const Int_t y)
599 Double_t R2 = fR1 * TMath::Abs(gPad->GetY2()-gPad->GetY1())/TMath::Abs(gPad->GetX2()-gPad->GetX1());
601 Double_t y1 = gPad->PixeltoY(y-gPad->VtoPixel(0));
602 if (y1<fY1-R2)
return;
604 fR1 = (y1-fY1+R2)*0.5 / (TMath::Abs(gPad->GetY2()-gPad->GetY1())/TMath::Abs(gPad->GetX2()-gPad->GetX1()));
612 void TCurlyArc::SetBBoxY2(
const Int_t y)
614 Double_t R2 = fR1 * TMath::Abs(gPad->GetY2()-gPad->GetY1())/TMath::Abs(gPad->GetX2()-gPad->GetX1());
616 Double_t y2 = gPad->PixeltoY(y-gPad->VtoPixel(0));
618 if (y2>fY1+R2)
return;
620 fR1 = (fY1+R2-y2)*0.5 / (TMath::Abs(gPad->GetY2()-gPad->GetY1())/TMath::Abs(gPad->GetX2()-gPad->GetX1()));