Logo ROOT  
Reference Guide
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Loading...
Searching...
No Matches
TCurlyLine.cxx
Go to the documentation of this file.
1// @(#)root/graf:$Id$
2// Author: Otto Schaile 20/11/99
3
4/*************************************************************************
5 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12/** \class TCurlyLine
13\ingroup BasicGraphics
14
15Implements curly or wavy polylines used to draw Feynman diagrams.
16
17Amplitudes and wavelengths may be specified in the constructors,
18via commands or interactively from popup menus.
19The class make use of TPolyLine by inheritance, ExecuteEvent methods
20are highly inspired from the methods used in TPolyLine and TArc.
21The picture below has been generated by the tutorial feynman.
22
23Begin_Macro(source)
24../../../tutorials/visualisation/graphics/feynman.C
25End_Macro
26*/
27
28#include "TCurlyLine.h"
29#include "TVirtualPad.h"
30#include "TVirtualX.h"
31#include "TMath.h"
32#include "TPoint.h"
33
34#include <iostream>
35
39
41
42////////////////////////////////////////////////////////////////////////////////
43/// Default constructor.
44
46{
47 fX1 = 0.;
48 fY1 = 0.;
49 fX2 = 0.;
50 fY2 = 0.;
51 fWaveLength = 0.;
52 fAmplitude = 0.;
54 fNsteps = 0;
55}
56
57////////////////////////////////////////////////////////////////////////////////
58/// Create a new TCurlyLine with starting point (x1, y1), end point (x2,y2).
59/// The wavelength and amplitude are given in percent of the pad height.
60
72
73////////////////////////////////////////////////////////////////////////////////
74/// Create a curly (Gluon) or wavy (Gamma) line.
75
77{
80
82 Double_t px1, py1, px2, py2;
83 if (gPad) {
84 Double_t ww = (Double_t)gPad->GetWw();
85 Double_t wh = (Double_t)gPad->GetWh();
86 Double_t pxrange = gPad->GetAbsWNDC()*ww;
87 Double_t pyrange = - gPad->GetAbsHNDC()*wh;
88 Double_t xrange = gPad->GetX2() - gPad->GetX1();
89 Double_t yrange = gPad->GetY2() - gPad->GetY1();
92 hPix = TMath::Max(gPad->GetAbsHNDC() * gPad->GetWh(), gPad->GetAbsWNDC() * gPad->GetWw());
93 px1 = gPad->XtoAbsPixel(fX1);
94 py1 = gPad->YtoAbsPixel(fY1);
95 px2 = gPad->XtoAbsPixel(fX2);
96 py2 = gPad->YtoAbsPixel(fY2);
97
98 lengthPix = TMath::Sqrt((px2-px1)*(px2-px1) + (py1-py2)*(py1-py2));
101 } else {
104 px1 = fX1;
105 py1 = fY1;
106 px2 = fX2;
107 py2 = fY2;
108 lengthPix = TMath::Sqrt((px2-px1)*(px2-px1) + (py1-py2)*(py1-py2));
109 }
110 // construct the curly / wavy line in pixel coordinates at angle 0
111 Double_t anglestep = 40;
115
116 // make sure there is a piece of straight line a both ends
117
119 // if (fIsCurly) lengthcycle += amplitudePix;
122 fNsteps = (Int_t)(anglestep * nperiods + anglestep / 2 + 4);
123 if (fNsteps < 2) fNsteps = 2;
125 Double_t *xv = GetX();
126 Double_t *yv = GetY();
127 xv[0] = 0; yv[0] = 0;
128 xv[1] = restlength; yv[1] = 0;
129 Double_t phase = 1.5 * TMath::Pi();
131 Int_t i;
132 for(i = 2; i < fNsteps-1; i++){
133 // distinguish between curly and wavy
134 if (fIsCurly) xv[i] = x0 + amplitudePix * TMath::Sin(phase);
135 else xv[i] = x0;
137 phase += phimaxle;
138 x0 += dx;
139 }
140 xv[fNsteps-1] = lengthPix; yv[fNsteps-1] = 0;
141
142 if (InheritsFrom("TCurlyArc")) return; // called by TCurlyArc
143
144 // rotate object and transform back to user coordinates
145 Double_t angle = TMath::ATan2(py2-py1, px2-px1);
146 if (angle < 0) angle += 2*TMath::Pi();
147
150 Double_t xx, yy;
151
152 for(i = 0; i < fNsteps; i++){
153 xx = xv[i] * cosang - yv[i] * sinang;
154 yy = xv[i] * sinang + yv[i] * cosang;
155 if (gPad) {
156 xx *= pixeltoX;
157 yy *= pixeltoY;
158 }
159 xv[i] = xx + fX1;
160 yv[i] = yy + fY1;
161 }
162 if (gPad) gPad->Modified();
163}
164
165////////////////////////////////////////////////////////////////////////////////
166/// Compute distance from point px,py to a line.
167
172
173////////////////////////////////////////////////////////////////////////////////
174/// Execute action corresponding to one event.
175///
176/// This member function is called when a TCurlyLine is clicked with the locator
177///
178/// If Left button clicked on one of the line end points, this point
179/// follows the cursor until button is released.
180///
181/// if Middle button clicked, the line is moved parallel to itself
182/// until the button is released.
183
185{
186 if (!gPad) return;
187
188 Int_t kMaxDiff = 20;
189 static Int_t d1,d2,px1,px2,py1,py2;
191 static Bool_t p1, p2, pL;
192 Int_t dx, dy;
193
194 Bool_t opaque = gPad->OpaqueMoving();
195
196 switch (event) {
197
198 case kArrowKeyPress:
199 case kButton1Down:
200 if (!opaque) {
201 gVirtualX->SetLineColor(-1);
202 TAttLine::Modify(); //Change line attributes only if necessary
203 }
204
205 // No break !!!
206
207 case kMouseMotion:
208
209 px1 = gPad->XtoAbsPixel(fX1);
210 py1 = gPad->YtoAbsPixel(fY1);
211 px2 = gPad->XtoAbsPixel(fX2);
212 py2 = gPad->YtoAbsPixel(fY2);
213
214 p1 = p2 = pL = kFALSE;
215
216 d1 = TMath::Abs(px1 - px) + TMath::Abs(py1-py); //simply take sum of pixels differences
217 if (d1 < kMaxDiff) { //*-*================>OK take point number 1
218 px1old = px1; py1old = py1;
219 p1 = kTRUE;
220 gPad->SetCursor(kPointer);
221 return;
222 }
223 d2 = TMath::Abs(px2 - px) + TMath::Abs(py2-py); //simply take sum of pixels differences
224 if (d2 < kMaxDiff) { //*-*================>OK take point number 2
225 px2old = px2; py2old = py2;
226 p2 = kTRUE;
227 gPad->SetCursor(kPointer);
228 return;
229 }
230
231 pL = kTRUE;
232 pxold = px; pyold = py;
233 gPad->SetCursor(kMove);
234
235 break;
236
237 case kArrowKeyRelease:
238 case kButton1Motion:
239
240 if (p1) {
241 if (!opaque) {
242 gVirtualX->DrawLine(px1old, py1old, px2, py2);
243 gVirtualX->DrawLine(px, py, px2, py2);
244 }
245 else this->SetStartPoint(gPad->AbsPixeltoX(px),gPad->AbsPixeltoY(py));
246 px1old = px;
247 py1old = py;
248 }
249 if (p2) {
250 if (!opaque) {
251 gVirtualX->DrawLine(px1, py1, px2old, py2old);
252 gVirtualX->DrawLine(px1, py1, px, py);
253 }
254 else this->SetEndPoint(gPad->AbsPixeltoX(px), gPad->AbsPixeltoY(py));
255 px2old = px;
256 py2old = py;
257 }
258 if (pL) {
259 if (!opaque) gVirtualX->DrawLine(px1, py1, px2, py2);
260 dx = px-pxold; dy = py-pyold;
261 px1 += dx; py1 += dy; px2 += dx; py2 += dy;
262 if (!opaque) gVirtualX->DrawLine(px1, py1, px2, py2);
263 pxold = px;
264 pyold = py;
265 if (opaque) {
266 this->SetStartPoint(gPad->AbsPixeltoX(px1),gPad->AbsPixeltoY(py1));
267 this->SetEndPoint(gPad->AbsPixeltoX(px2), gPad->AbsPixeltoY(py2));
268 }
269 }
270
271 if (opaque) {
272 if (p1) {
273 //check in which corner the BBox is edited
274 if (fX1>fX2) {
275 if (fY1>fY2)
276 gPad->ShowGuidelines(this, event, '2', true);
277 else
278 gPad->ShowGuidelines(this, event, '3', true);
279 }
280 else {
281 if (fY1>fY2)
282 gPad->ShowGuidelines(this, event, '1', true);
283 else
284 gPad->ShowGuidelines(this, event, '4', true);
285 }
286 }
287 if (p2) {
288 //check in which corner the BBox is edited
289 if (fX1>fX2) {
290 if (fY1>fY2)
291 gPad->ShowGuidelines(this, event, '4', true);
292 else
293 gPad->ShowGuidelines(this, event, '1', true);
294 }
295 else {
296 if (fY1>fY2)
297 gPad->ShowGuidelines(this, event, '3', true);
298 else
299 gPad->ShowGuidelines(this, event, '2', true);
300 }
301 }
302 if (pL) {
303 gPad->ShowGuidelines(this, event, 'i', true);
304 }
305 gPad->Modified(kTRUE);
306 gPad->Update();
307 }
308 break;
309
310 case kButton1Up:
311
312 if (opaque) {
313 gPad->ShowGuidelines(this, event);
314 } else {
315 if (p1) {
316 fX1 = gPad->AbsPixeltoX(px);
317 fY1 = gPad->AbsPixeltoY(py);
318 }
319 if (p2) {
320 fX2 = gPad->AbsPixeltoX(px);
321 fY2 = gPad->AbsPixeltoY(py);
322 }
323 if (pL) {
324 fX1 = gPad->AbsPixeltoX(px1);
325 fY1 = gPad->AbsPixeltoY(py1);
326 fX2 = gPad->AbsPixeltoX(px2);
327 fY2 = gPad->AbsPixeltoY(py2);
328 }
329 }
330 Build();
331 gPad->Modified();
332 if (!opaque) gVirtualX->SetLineColor(-1);
333 }
334}
335
336////////////////////////////////////////////////////////////////////////////////
337/// Save primitive as a C++ statement(s) on output stream out
338
340{
341 SavePrimitiveConstructor(out, Class(), "curlyline",
342 TString::Format("%g, %g, %g, %g, %g, %g", fX1, fY1, fX2, fY2, fWaveLength, fAmplitude));
343
344 SaveLineAttributes(out, "curlyline", 1, 1, 1);
345
346 if (!fIsCurly)
347 out << " curlyline->SetWavy();\n";
348
349 SavePrimitiveDraw(out, "curlyline", option);
350}
351
352////////////////////////////////////////////////////////////////////////////////
353/// Set curly.
354
356{
357 fIsCurly = kTRUE;
358 Build();
359}
360
361////////////////////////////////////////////////////////////////////////////////
362/// Set wavy.
363
365{
367 Build();
368}
369
370////////////////////////////////////////////////////////////////////////////////
371/// Set wave length.
372
378
379////////////////////////////////////////////////////////////////////////////////
380/// Set amplitude.
381
383{
384 fAmplitude = x;
385 Build();
386}
387
388////////////////////////////////////////////////////////////////////////////////
389/// Set start point.
390
392{
393 fX1 = x;
394 fY1 = y;
395 Build();
396}
397
398////////////////////////////////////////////////////////////////////////////////
399/// Set end point.
400
402{
403 fX2 = x;
404 fY2 = y;
405 Build();
406}
407
408////////////////////////////////////////////////////////////////////////////////
409/// Set default wave length.
410
415
416////////////////////////////////////////////////////////////////////////////////
417/// Set default amplitude.
418
423
424////////////////////////////////////////////////////////////////////////////////
425/// Set default "IsCurly".
426
431
432////////////////////////////////////////////////////////////////////////////////
433/// Get default wave length.
434
439
440////////////////////////////////////////////////////////////////////////////////
441/// Get default amplitude.
442
447
448////////////////////////////////////////////////////////////////////////////////
449/// Get default "IsCurly".
450
455
456////////////////////////////////////////////////////////////////////////////////
457/// Return the bounding Box of the CurlyLine
458
460{
461 Rectangle_t BBox{0,0,0,0};
462 if (gPad) {
463 Int_t px1 = gPad->XtoPixel(fX1);
464 Int_t px2 = gPad->XtoPixel(fX2);
465 Int_t py1 = gPad->YtoPixel(fY1);
466 Int_t py2 = gPad->YtoPixel(fY2);
467
468 if (px1 > px2) {
469 Int_t tmp = px1;
470 px1 = px2;
471 px2 = tmp;
472 }
473 if (py1 > py2) {
474 Int_t tmp = py1;
475 py1 = py2;
476 py2 = tmp;
477 }
478
479 BBox.fX = px1;
480 BBox.fY = py1;
481 BBox.fWidth = px2 - px1;
482 BBox.fHeight = py2 - py1;
483 }
484 return BBox;
485}
486
487////////////////////////////////////////////////////////////////////////////////
488/// Return the center of the BoundingBox as TPoint in pixels
489
491{
492 TPoint p(0,0);
493 if (gPad) {
494 p.SetX(gPad->XtoPixel(TMath::Min(fX1, fX2) + 0.5 * (TMath::Max(fX1, fX2) - TMath::Min(fX1, fX2))));
495 p.SetY(gPad->YtoPixel(TMath::Min(fY1, fY2) + 0.5 * (TMath::Max(fY1, fY2) - TMath::Min(fY1, fY2))));
496 }
497 return p;
498}
499
500////////////////////////////////////////////////////////////////////////////////
501/// Set center of the BoundingBox
502
504{
505 if (!gPad) return;
508 Double_t x1, x2, y1, y2;
509
510 if (fX2 > fX1) {
511 x1 = gPad->PixeltoX(p.GetX())-0.5*w;
512 x2 = gPad->PixeltoX(p.GetX())+0.5*w;
513 } else {
514 x2 = gPad->PixeltoX(p.GetX())-0.5*w;
515 x1 = gPad->PixeltoX(p.GetX())+0.5*w;
516 }
517 if (fY2 > fY1) {
518 y1 = gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0))-0.5*h;
519 y2 = gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0))+0.5*h;
520 } else {
521 y2 = gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0))-0.5*h;
522 y1 = gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0))+0.5*h;
523 }
524 this->SetStartPoint(x1, y1);
525 this->SetEndPoint(x2, y2);
526}
527
528////////////////////////////////////////////////////////////////////////////////
529/// Set X coordinate of the center of the BoundingBox
530
532{
533 if (!gPad) return;
535 if (fX2>fX1) {
536 this->SetStartPoint(gPad->PixeltoX(x)-0.5*w, fY1);
537 this->SetEndPoint(gPad->PixeltoX(x)+0.5*w, fY2);
538 }
539 else {
540 this->SetEndPoint(gPad->PixeltoX(x)-0.5*w, fY2);
541 this->SetStartPoint(gPad->PixeltoX(x)+0.5*w, fY1);
542 }
543}
544
545////////////////////////////////////////////////////////////////////////////////
546/// Set Y coordinate of the center of the BoundingBox
547
549{
550 if (!gPad) return;
552 if (fY2>fY1) {
553 this->SetStartPoint(fX1, gPad->PixeltoY(y-gPad->VtoPixel(0))-0.5*h);
554 this->SetEndPoint(fX2, gPad->PixeltoY(y-gPad->VtoPixel(0))+0.5*h);
555 }
556 else {
557 this->SetEndPoint(fX2, gPad->PixeltoY(y-gPad->VtoPixel(0))-0.5*h);
558 this->SetStartPoint(fX1, gPad->PixeltoY(y-gPad->VtoPixel(0))+0.5*h);
559 }
560}
561
562////////////////////////////////////////////////////////////////////////////////
563/// Set left hand side of BoundingBox to a value
564/// (resize in x direction on left)
565
567{
568 if (!gPad) return;
569 if (fX2>fX1)
570 this->SetStartPoint(gPad->PixeltoX(x), fY1);
571 else
572 this->SetEndPoint(gPad->PixeltoX(x), fY2);
573}
574
575////////////////////////////////////////////////////////////////////////////////
576/// Set right hands ide of BoundingBox to a value
577/// (resize in x direction on right)
578
580{
581 if (!gPad) return;
582 if (fX2>fX1)
583 this->SetEndPoint(gPad->PixeltoX(x), fY2);
584 else
585 this->SetStartPoint(gPad->PixeltoX(x), fY1);
586}
587
588////////////////////////////////////////////////////////////////////////////////
589/// Set top of BoundingBox to a value (resize in y direction on top)
590
592{
593 if (!gPad) return;
594 if (fY2>fY1)
595 this->SetEndPoint(fX2, gPad->PixeltoY(y - gPad->VtoPixel(0)));
596 else
597 this->SetStartPoint(fX1, gPad->PixeltoY(y - gPad->VtoPixel(0)));
598}
599
600////////////////////////////////////////////////////////////////////////////////
601/// Set bottom of BoundingBox to a value
602/// (resize in y direction on bottom)
603
605{
606 if (!gPad) return;
607 if (fY2>fY1)
608 this->SetStartPoint(fX1, gPad->PixeltoY(y - gPad->VtoPixel(0)));
609 else
610 this->SetEndPoint(fX2, gPad->PixeltoY(y - gPad->VtoPixel(0)));
611}
@ kMouseMotion
Definition Buttons.h:23
@ kArrowKeyRelease
Definition Buttons.h:21
@ kButton1Motion
Definition Buttons.h:20
@ kButton1Up
Definition Buttons.h:19
@ kArrowKeyPress
Definition Buttons.h:21
@ kButton1Down
Definition Buttons.h:17
@ kMove
Definition GuiTypes.h:374
@ kPointer
Definition GuiTypes.h:375
#define h(i)
Definition RSha256.hxx:106
bool Bool_t
Definition RtypesCore.h:63
int Int_t
Definition RtypesCore.h:45
constexpr Bool_t kFALSE
Definition RtypesCore.h:94
double Double_t
Definition RtypesCore.h:59
constexpr Bool_t kTRUE
Definition RtypesCore.h:93
const char Option_t
Definition RtypesCore.h:66
#define ClassImp(name)
Definition Rtypes.h:374
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t option
Option_t Option_t TPoint TPoint const char x2
Option_t Option_t TPoint TPoint const char x1
Option_t Option_t TPoint TPoint angle
Option_t Option_t TPoint TPoint const char y2
Option_t Option_t TPoint TPoint const char y1
#define gPad
#define gVirtualX
Definition TVirtualX.h:337
virtual void Modify()
Change current line attributes if necessary.
Definition TAttLine.cxx:247
Int_t DistancetoLine(Int_t px, Int_t py, Double_t xp1, Double_t yp1, Double_t xp2, Double_t yp2)
Compute distance from point px,py to a line.
Definition TAttLine.cxx:211
virtual void SaveLineAttributes(std::ostream &out, const char *name, Int_t coldef=1, Int_t stydef=1, Int_t widdef=1)
Save line attributes as C++ statement(s) on output stream out.
Definition TAttLine.cxx:275
Implements curly or wavy polylines used to draw Feynman diagrams.
Definition TCurlyLine.h:19
TCurlyLine()
Default constructor.
virtual void SetWaveLength(Double_t WaveLength)
Set wave length.
virtual void SetCurly()
Set curly.
static TClass * Class()
Double_t fY1
start y, center for arc
Definition TCurlyLine.h:23
virtual void SetAmplitude(Double_t x)
Set amplitude.
Double_t fWaveLength
wavelength of sinusoid in percent of pad height
Definition TCurlyLine.h:26
Double_t fAmplitude
amplitude of sinusoid in percent of pad height
Definition TCurlyLine.h:27
void SetBBoxY1(const Int_t y) override
Set top of BoundingBox to a value (resize in y direction on top)
virtual void SetStartPoint(Double_t x1, Double_t y1)
Set start point.
void SetBBoxX2(const Int_t x) override
Set right hands ide of BoundingBox to a value (resize in x direction on right)
Int_t fNsteps
used internally (controls precision)
Definition TCurlyLine.h:28
void SetBBoxCenter(const TPoint &p) override
Set center of the BoundingBox.
void SetBBoxY2(const Int_t y) override
Set bottom of BoundingBox to a value (resize in y direction on bottom)
Rectangle_t GetBBox() override
Return the bounding Box of the CurlyLine.
TPoint GetBBoxCenter() override
Return the center of the BoundingBox as TPoint in pixels.
static Double_t GetDefaultWaveLength()
Get default wave length.
static Bool_t GetDefaultIsCurly()
Get default "IsCurly".
virtual void Build()
Create a curly (Gluon) or wavy (Gamma) line.
void SavePrimitive(std::ostream &out, Option_t *="") override
Save primitive as a C++ statement(s) on output stream out.
static void SetDefaultAmplitude(Double_t Amplitude)
Set default amplitude.
static void SetDefaultWaveLength(Double_t WaveLength)
Set default wave length.
static Bool_t fgDefaultIsCurly
default curly type
Definition TCurlyLine.h:33
Double_t fY2
end y
Definition TCurlyLine.h:25
static Double_t GetDefaultAmplitude()
Get default amplitude.
virtual void SetEndPoint(Double_t x2, Double_t y2)
Set end point.
void SetBBoxX1(const Int_t x) override
Set left hand side of BoundingBox to a value (resize in x direction on left)
Double_t fX1
start x, center for arc
Definition TCurlyLine.h:22
static Double_t fgDefaultWaveLength
default wavelength
Definition TCurlyLine.h:31
void SetBBoxCenterX(const Int_t x) override
Set X coordinate of the center of the BoundingBox.
static void SetDefaultIsCurly(Bool_t IsCurly)
Set default "IsCurly".
virtual void SetWavy()
Set wavy.
static Double_t fgDefaultAmplitude
default amplitude
Definition TCurlyLine.h:32
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
Compute distance from point px,py to a line.
Double_t fX2
end x
Definition TCurlyLine.h:24
void ExecuteEvent(Int_t event, Int_t px, Int_t py) override
Execute action corresponding to one event.
Bool_t fIsCurly
true: Gluon, false: Gamma
Definition TCurlyLine.h:29
void SetBBoxCenterY(const Int_t y) override
Set Y coordinate of the center of the BoundingBox.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
Definition TObject.cxx:543
static void SavePrimitiveDraw(std::ostream &out, const char *variable_name, Option_t *option=nullptr)
Save invocation of primitive Draw() method Skipped if option contains "nodraw" string.
Definition TObject.cxx:822
static void SavePrimitiveConstructor(std::ostream &out, TClass *cl, const char *variable_name, const char *constructor_agrs="", Bool_t empty_line=kTRUE)
Save object constructor in the output stream "out".
Definition TObject.cxx:771
Double_t * GetX() const
Definition TPolyLine.h:54
Double_t * GetY() const
Definition TPolyLine.h:55
virtual void SetPolyLine(Int_t n)
Resize this polyline to size n.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Definition TString.cxx:2378
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Definition TMathBase.h:250
Double_t ATan2(Double_t y, Double_t x)
Returns the principal value of the arc tangent of y/x, expressed in radians.
Definition TMath.h:650
Double_t Sqrt(Double_t x)
Returns the square root of x.
Definition TMath.h:666
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Definition TMathBase.h:198
Double_t Cos(Double_t)
Returns the cosine of an angle of x radians.
Definition TMath.h:598
constexpr Double_t Pi()
Definition TMath.h:37
Double_t Sin(Double_t)
Returns the sine of an angle of x radians.
Definition TMath.h:592
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
Definition TMathBase.h:123
Rectangle structure (maps to the X11 XRectangle structure)
Definition GuiTypes.h:361