37 Double_t TCurlyLine::fgDefaultWaveLength = 0.02;
38 Double_t TCurlyLine::fgDefaultAmplitude = 0.01;
39 Bool_t TCurlyLine::fgDefaultIsCurly = kTRUE;
46 TCurlyLine::TCurlyLine()
54 fIsCurly = fgDefaultIsCurly;
62 TCurlyLine::TCurlyLine(Double_t x1, Double_t y1, Double_t x2, Double_t y2, Double_t wl, Double_t amp)
70 fIsCurly = fgDefaultIsCurly;
77 void TCurlyLine::Build()
79 Double_t pixeltoX = 1;
80 Double_t pixeltoY = 1;
82 Double_t wavelengthPix,amplitudePix, lengthPix, hPix;
83 Double_t px1, py1, px2, py2;
85 Double_t ww = (Double_t)gPad->GetWw();
86 Double_t wh = (Double_t)gPad->GetWh();
87 Double_t pxrange = gPad->GetAbsWNDC()*ww;
88 Double_t pyrange = - gPad->GetAbsHNDC()*wh;
89 Double_t xrange = gPad->GetX2() - gPad->GetX1();
90 Double_t yrange = gPad->GetY2() - gPad->GetY1();
91 pixeltoX = xrange / pxrange;
92 pixeltoY = yrange/pyrange;
93 hPix = TMath::Max(gPad->GetAbsHNDC() * gPad->GetWh(), gPad->GetAbsWNDC() * gPad->GetWw());
94 px1 = gPad->XtoAbsPixel(fX1);
95 py1 = gPad->YtoAbsPixel(fY1);
96 px2 = gPad->XtoAbsPixel(fX2);
97 py2 = gPad->YtoAbsPixel(fY2);
99 lengthPix = TMath::Sqrt((px2-px1)*(px2-px1) + (py1-py2)*(py1-py2));
100 wavelengthPix = hPix*fWaveLength;
101 amplitudePix = hPix*fAmplitude;
103 wavelengthPix = fWaveLength;
104 amplitudePix = fAmplitude;
109 lengthPix = TMath::Sqrt((px2-px1)*(px2-px1) + (py1-py2)*(py1-py2));
112 Double_t anglestep = 40;
113 Double_t phimaxle = TMath::Pi() * 2. / anglestep ;
114 Double_t dx = wavelengthPix / 40;
115 Double_t len2pi = dx * anglestep;
119 Double_t lengthcycle = 0.5 * len2pi + 2 * amplitudePix;
121 Int_t nperiods = (Int_t)((lengthPix - lengthcycle) / len2pi);
122 Double_t restlength = 0.5 * (lengthPix - nperiods * len2pi - lengthcycle);
123 fNsteps = (Int_t)(anglestep * nperiods + anglestep / 2 + 4);
124 if (fNsteps < 2) fNsteps = 2;
125 SetPolyLine(fNsteps);
126 Double_t *xv = GetX();
127 Double_t *yv = GetY();
128 xv[0] = 0; yv[0] = 0;
129 xv[1] = restlength; yv[1] = 0;
130 Double_t phase = 1.5 * TMath::Pi();
131 Double_t x0 = amplitudePix + restlength;
133 for(i = 2; i < fNsteps-1; i++){
135 if (fIsCurly) xv[i] = x0 + amplitudePix * TMath::Sin(phase);
137 yv[i] = amplitudePix*TMath::Cos(phase);
141 xv[fNsteps-1] = lengthPix; yv[fNsteps-1] = 0;
143 if (InheritsFrom(
"TCurlyArc"))
return;
146 Double_t angle = TMath::ATan2(py2-py1, px2-px1);
147 if (angle < 0) angle += 2*TMath::Pi();
149 Double_t cosang = TMath::Cos(angle);
150 Double_t sinang = TMath::Sin(angle);
153 for(i = 0; i < fNsteps; i++){
154 xx = xv[i] * cosang - yv[i] * sinang;
155 yy = xv[i] * sinang + yv[i] * cosang;
163 if (gPad) gPad->Modified();
169 Int_t TCurlyLine::DistancetoPrimitive(Int_t px, Int_t py)
171 return DistancetoLine(px,py,fX1,fY1,fX2,fY2);
185 void TCurlyLine::ExecuteEvent(Int_t event, Int_t px, Int_t py)
190 static Int_t d1,d2,px1,px2,py1,py2;
191 static Int_t pxold, pyold, px1old, py1old, px2old, py2old;
192 static Bool_t p1, p2, pL;
195 Bool_t opaque = gPad->OpaqueMoving();
202 gVirtualX->SetLineColor(-1);
210 px1 = gPad->XtoAbsPixel(fX1);
211 py1 = gPad->YtoAbsPixel(fY1);
212 px2 = gPad->XtoAbsPixel(fX2);
213 py2 = gPad->YtoAbsPixel(fY2);
215 p1 = p2 = pL = kFALSE;
217 d1 = TMath::Abs(px1 - px) + TMath::Abs(py1-py);
219 px1old = px1; py1old = py1;
221 gPad->SetCursor(kPointer);
224 d2 = TMath::Abs(px2 - px) + TMath::Abs(py2-py);
226 px2old = px2; py2old = py2;
228 gPad->SetCursor(kPointer);
233 pxold = px; pyold = py;
234 gPad->SetCursor(kMove);
238 case kArrowKeyRelease:
243 gVirtualX->DrawLine(px1old, py1old, px2, py2);
244 gVirtualX->DrawLine(px, py, px2, py2);
246 else this->SetStartPoint(gPad->AbsPixeltoX(px),gPad->AbsPixeltoY(py));
252 gVirtualX->DrawLine(px1, py1, px2old, py2old);
253 gVirtualX->DrawLine(px1, py1, px, py);
255 else this->SetEndPoint(gPad->AbsPixeltoX(px), gPad->AbsPixeltoY(py));
260 if (!opaque) gVirtualX->DrawLine(px1, py1, px2, py2);
261 dx = px-pxold; dy = py-pyold;
262 px1 += dx; py1 += dy; px2 += dx; py2 += dy;
263 if (!opaque) gVirtualX->DrawLine(px1, py1, px2, py2);
267 this->SetStartPoint(gPad->AbsPixeltoX(px1),gPad->AbsPixeltoY(py1));
268 this->SetEndPoint(gPad->AbsPixeltoX(px2), gPad->AbsPixeltoY(py2));
277 gPad->ShowGuidelines(
this, event,
'2',
true);
279 gPad->ShowGuidelines(
this, event,
'3',
true);
283 gPad->ShowGuidelines(
this, event,
'1',
true);
285 gPad->ShowGuidelines(
this, event,
'4',
true);
292 gPad->ShowGuidelines(
this, event,
'4',
true);
294 gPad->ShowGuidelines(
this, event,
'1',
true);
298 gPad->ShowGuidelines(
this, event,
'3',
true);
300 gPad->ShowGuidelines(
this, event,
'2',
true);
304 gPad->ShowGuidelines(
this, event,
'i',
true);
306 gPad->Modified(kTRUE);
314 gPad->ShowGuidelines(
this, event);
317 fX1 = gPad->AbsPixeltoX(px);
318 fY1 = gPad->AbsPixeltoY(py);
321 fX2 = gPad->AbsPixeltoX(px);
322 fY2 = gPad->AbsPixeltoY(py);
325 fX1 = gPad->AbsPixeltoX(px1);
326 fY1 = gPad->AbsPixeltoY(py1);
327 fX2 = gPad->AbsPixeltoX(px2);
328 fY2 = gPad->AbsPixeltoY(py2);
333 if (!opaque) gVirtualX->SetLineColor(-1);
340 void TCurlyLine::SavePrimitive(std::ostream &out, Option_t * )
342 if (gROOT->ClassSaved(TCurlyLine::Class())) {
345 out<<
" TCurlyLine *";
347 out<<
"curlyline = new TCurlyLine("
348 <<fX1<<
","<<fY1<<
","<<fX2<<
","<<fY2<<
","
349 <<fWaveLength<<
","<<fAmplitude<<
");"<<std::endl;
351 out<<
" curlyline->SetWavy();"<<std::endl;
353 SaveLineAttributes(out,
"curlyline",1,1,1);
354 out<<
" curlyline->Draw();"<<std::endl;
360 void TCurlyLine::SetCurly()
369 void TCurlyLine::SetWavy()
378 void TCurlyLine::SetWaveLength(Double_t x)
387 void TCurlyLine::SetAmplitude(Double_t x)
396 void TCurlyLine::SetStartPoint(Double_t x, Double_t y)
406 void TCurlyLine::SetEndPoint(Double_t x, Double_t y)
416 void TCurlyLine::SetDefaultWaveLength(Double_t WaveLength)
418 fgDefaultWaveLength = WaveLength;
424 void TCurlyLine::SetDefaultAmplitude(Double_t Amplitude)
426 fgDefaultAmplitude = Amplitude;
432 void TCurlyLine::SetDefaultIsCurly(Bool_t IsCurly)
434 fgDefaultIsCurly = IsCurly;
440 Double_t TCurlyLine::GetDefaultWaveLength()
442 return fgDefaultWaveLength;
448 Double_t TCurlyLine::GetDefaultAmplitude()
450 return fgDefaultAmplitude;
456 Bool_t TCurlyLine::GetDefaultIsCurly()
458 return fgDefaultIsCurly;
464 Rectangle_t TCurlyLine::GetBBox()
467 Int_t px1, py1, px2, py2;
468 px1 = gPad->XtoPixel(fX1);
469 px2 = gPad->XtoPixel(fX2);
470 py1 = gPad->YtoPixel(fY1);
471 py2 = gPad->YtoPixel(fY2);
474 if (px1>px2) { tmp = px1; px1 = px2; px2 = tmp;}
475 if (py1>py2) { tmp = py1; py1 = py2; py2 = tmp;}
479 BBox.fWidth = px2-px1;
480 BBox.fHeight = py2-py1;
488 TPoint TCurlyLine::GetBBoxCenter()
491 p.SetX(gPad->XtoPixel(TMath::Min(fX1,fX2)+0.5*(TMath::Max(fX1, fX2)-TMath::Min(fX1, fX2))));
492 p.SetY(gPad->YtoPixel(TMath::Min(fY1,fY2)+0.5*(TMath::Max(fY1, fY2)-TMath::Min(fY1, fY2))));
499 void TCurlyLine::SetBBoxCenter(
const TPoint &p)
501 Double_t w = TMath::Max(fX1, fX2)-TMath::Min(fX1, fX2);
502 Double_t h = TMath::Max(fY1, fY2)-TMath::Min(fY1, fY2);
503 Double_t x1, x2, y1, y2;
504 x1 = x2 = y1 = y2 = 0;
507 x1 = gPad->PixeltoX(p.GetX())-0.5*w;
508 x2 = gPad->PixeltoX(p.GetX())+0.5*w;
511 x2 = gPad->PixeltoX(p.GetX())-0.5*w;
512 x1 = gPad->PixeltoX(p.GetX())+0.5*w;
515 y1 = gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0))-0.5*h;
516 y2 = gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0))+0.5*h;
519 y2 = gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0))-0.5*h;
520 y1 = gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0))+0.5*h;
522 this->SetStartPoint(x1, y1);
523 this->SetEndPoint(x2, y2);
529 void TCurlyLine::SetBBoxCenterX(
const Int_t x)
531 Double_t w = TMath::Max(fX1, fX2)-TMath::Min(fX1, fX2);
533 this->SetStartPoint(gPad->PixeltoX(x)-0.5*w, fY1);
534 this->SetEndPoint(gPad->PixeltoX(x)+0.5*w, fY2);
537 this->SetEndPoint(gPad->PixeltoX(x)-0.5*w, fY2);
538 this->SetStartPoint(gPad->PixeltoX(x)+0.5*w, fY1);
545 void TCurlyLine::SetBBoxCenterY(
const Int_t y)
547 Double_t h = TMath::Max(fY1, fY2)-TMath::Min(fY1, fY2);
549 this->SetStartPoint(fX1, gPad->PixeltoY(y-gPad->VtoPixel(0))-0.5*h);
550 this->SetEndPoint(fX2, gPad->PixeltoY(y-gPad->VtoPixel(0))+0.5*h);
553 this->SetEndPoint(fX2, gPad->PixeltoY(y-gPad->VtoPixel(0))-0.5*h);
554 this->SetStartPoint(fX1, gPad->PixeltoY(y-gPad->VtoPixel(0))+0.5*h);
562 void TCurlyLine::SetBBoxX1(
const Int_t x)
565 this->SetStartPoint(gPad->PixeltoX(x), fY1);
567 this->SetEndPoint(gPad->PixeltoX(x), fY2);
574 void TCurlyLine::SetBBoxX2(
const Int_t x)
577 this->SetEndPoint(gPad->PixeltoX(x), fY2);
579 this->SetStartPoint(gPad->PixeltoX(x), fY1);
585 void TCurlyLine::SetBBoxY1(
const Int_t y)
588 this->SetEndPoint(fX2, gPad->PixeltoY(y - gPad->VtoPixel(0)));
590 this->SetStartPoint(fX1, gPad->PixeltoY(y - gPad->VtoPixel(0)));
597 void TCurlyLine::SetBBoxY2(
const Int_t y)
600 this->SetStartPoint(fX1, gPad->PixeltoY(y - gPad->VtoPixel(0)));
602 this->SetEndPoint(fX2, gPad->PixeltoY(y - gPad->VtoPixel(0)));