Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TLine.cxx
Go to the documentation of this file.
1// @(#)root/graf:$Id$
2// Author: Rene Brun 12/12/94
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#include <cstdlib>
13
14#include <iostream>
15#include "TROOT.h"
16#include "TBuffer.h"
17#include "TLine.h"
18#include "TVirtualPad.h"
19#include "TClass.h"
20#include "TVirtualPadPainter.h"
21#include "TCanvasImp.h"
22#include "TMath.h"
23#include "TPoint.h"
24
25
26/** \class TLine
27\ingroup BasicGraphics
28
29Use the TLine constructor to create a simple line.
30
31~~~ {.cpp}
32 TLine(Double_t x1,Double_t y1,Double_t x2,Double_t y2)
33~~~
34
35`x1`, `y1`, `x2`, `y2` are the coordinates of the first and the second point.
36
37_**Example**_:
38
39~~~ {.cpp}
40 root[] l = new TLine(0.2,0.2,0.8,0.3)
41 root[] l->Draw()
42~~~
43*/
44
45
46////////////////////////////////////////////////////////////////////////////////
47/// Line normal constructor.
48
54
55
56////////////////////////////////////////////////////////////////////////////////
57/// Line copy constructor.
58
60{
61 line.TLine::Copy(*this);
62}
63
64////////////////////////////////////////////////////////////////////////////////
65/// Assignment operator
66
68{
69 src.TLine::Copy(*this);
70 return *this;
71}
72
73////////////////////////////////////////////////////////////////////////////////
74/// Copy this line to line.
75
76void TLine::Copy(TObject &obj) const
77{
78 TObject::Copy(obj);
79 TAttLine::Copy(((TLine&)obj));
80 ((TLine&)obj).fX1 = fX1;
81 ((TLine&)obj).fY1 = fY1;
82 ((TLine&)obj).fX2 = fX2;
83 ((TLine&)obj).fY2 = fY2;
84}
85
86////////////////////////////////////////////////////////////////////////////////
87/// Compute distance from point px,py to a line.
88
90{
91 if (!gPad) return 9999;
92 if (!TestBit(kLineNDC)) return DistancetoLine(px,py,gPad->XtoPad(fX1),gPad->YtoPad(fY1),gPad->XtoPad(fX2),gPad->YtoPad(fY2));
93 Double_t x1 = gPad->GetX1() + fX1*(gPad->GetX2()-gPad->GetX1());
94 Double_t y1 = gPad->GetY1() + fY1*(gPad->GetY2()-gPad->GetY1());
95 Double_t x2 = gPad->GetX1() + fX2*(gPad->GetX2()-gPad->GetX1());
96 Double_t y2 = gPad->GetY1() + fY2*(gPad->GetY2()-gPad->GetY1());
97 return DistancetoLine(px,py,x1,y1,x2,y2);
98}
99
100////////////////////////////////////////////////////////////////////////////////
101/// Draw this line with new coordinates.
102
104{
105 TLine *newline = new TLine(x1, y1, x2, y2);
107 newline->SetBit(kCanDelete);
108 newline->AppendPad();
109 return newline;
110}
111
112////////////////////////////////////////////////////////////////////////////////
113/// Draw this line with new coordinates in NDC.
114
121
122////////////////////////////////////////////////////////////////////////////////
123/// Execute action corresponding to one event.
124/// This member function is called when a line is clicked with the locator
125///
126/// If Left button clicked on one of the line end points, this point
127/// follows the cursor until button is released.
128///
129/// if Middle button clicked, the line is moved parallel to itself
130/// until the button is released.
131
133{
134 if (!gPad || !gPad->IsEditable()) return;
135
136 constexpr Int_t kMaxDiff = 20;
137 static Int_t px1,px2,py1,py2,pxold,pyold;
138 static Double_t oldX1, oldY1, oldX2, oldY2;
139 static Int_t selectPoint;
140
141 auto parent = gPad;
142
143 Bool_t opaque = parent->OpaqueMoving();
144
145 auto action = [this, parent](Int_t code, Int_t _x1, Int_t _y1, Int_t _x2 = 0, Int_t _y2 = 0) {
146 Double_t x1, y1, x2, y2;
147
148 if (TestBit(kLineNDC)) {
149 x1 = (1. * _x1 / parent->GetWw() - parent->GetAbsXlowNDC()) / parent->GetAbsWNDC();
150 y1 = ((1 - 1. * _y1 / parent->GetWh()) - parent->GetAbsYlowNDC()) / parent->GetAbsHNDC();
151 x2 = (1. * _x2 / parent->GetWw() - parent->GetAbsXlowNDC()) / parent->GetAbsWNDC();
152 y2 = ((1 - 1. * _y2 / parent->GetWh()) - parent->GetAbsYlowNDC()) / parent->GetAbsHNDC();
153 } else {
154 x1 = parent->AbsPixeltoX(_x1);
155 y1 = parent->AbsPixeltoY(_y1);
156 x2 = parent->AbsPixeltoX(_x2);
157 y2 = parent->AbsPixeltoY(_y2);
158 if (parent->GetLogx()) {
159 x1 = TMath::Power(10, x1);
160 x2 = TMath::Power(10, x2);
161 }
162 if (parent->GetLogy()) {
163 y1 = TMath::Power(10, y1);
164 y2 = TMath::Power(10, y2);
165 }
166 }
167 if (code == 0) {
168 auto pp = parent->GetPainter();
169 pp->SetAttLine(*this);
170 if (TestBit(kLineNDC))
171 pp->DrawLineNDC(x1, y1, x2, y2);
172 else
173 pp->DrawLine(x1, y1, x2, y2);
174 } else {
175 if (code & 1) {
176 SetX1(x1);
177 SetY1(y1);
178 }
179 if (code & 2) {
180 SetX2(x2);
181 SetY2(y2);
182 }
183 if (TestBit(kVertical)) {
184 if (code & 1)
185 SetX2(GetX1());
186 else
187 SetX1(GetX2());
188 }
189 if (TestBit(kHorizontal)) {
190 if (code & 1)
191 SetY2(GetY1());
192 else
193 SetY1(GetY2());
194 }
195 }
196 };
197
198 switch (event) {
199
200 case kArrowKeyPress:
201 case kButton1Down:
202 oldX1 = GetX1();
203 oldY1 = GetY1();
204 oldX2 = GetX2();
205 oldY2 = GetY2();
206
207 // No break !!!
208
209 case kMouseMotion:
210
211 if (TestBit(kLineNDC)) {
212 px1 = parent->UtoAbsPixel(GetX1());
213 py1 = parent->VtoAbsPixel(GetY1());
214 px2 = parent->UtoAbsPixel(GetX2());
215 py2 = parent->VtoAbsPixel(GetY2());
216 } else {
217 px1 = parent->XtoAbsPixel(parent->XtoPad(GetX1()));
218 py1 = parent->YtoAbsPixel(parent->YtoPad(GetY1()));
219 px2 = parent->XtoAbsPixel(parent->XtoPad(GetX2()));
220 py2 = parent->YtoAbsPixel(parent->YtoPad(GetY2()));
221 }
222
223 //simply take sum of pixels differences
224 if (abs(px1 - px) + abs(py1 - py) < kMaxDiff) { //*-*================>OK take point number 1
225 selectPoint = 1;
226 parent->SetCursor(kPointer);
227 } else if (abs(px2 - px) + abs(py2 - py) < kMaxDiff) { //*-*================>OK take point number 2
228 selectPoint = 2;
229 parent->SetCursor(kPointer);
230 } else {
231 selectPoint = 3;
232 pxold = px;
233 pyold = py;
234 parent->SetCursor(kMove);
235 }
236
237 break;
238
239 case kArrowKeyRelease:
240 case kButton1Motion:
241 if (!opaque)
242 action(0, px1, py1, px2, py2);
243 if (selectPoint == 1) {
244 px1 = px;
245 py1 = py;
246 } else if (selectPoint == 2) {
247 px2 = px;
248 py2 = py;
249 } else if (selectPoint == 3) {
250 px1 += px - pxold;
251 py1 += py - pyold;
252 px2 += px - pxold;
253 py2 += py -pyold;
254 pxold = px;
255 pyold = py;
256 }
257 action(!opaque ? 0 : selectPoint, px1, py1, px2, py2);
258 if (opaque) {
259 if (selectPoint == 1) {
260 //check in which corner the BBox is edited
261 if (GetX1() > GetX2())
262 parent->ShowGuidelines(this, event, GetY1() > GetY2() ? '2' : '3', true);
263 else
264 parent->ShowGuidelines(this, event, GetY1() > GetY2() ? '1' : '4', true);
265 } else if (selectPoint == 2) {
266 //check in which corner the BBox is edited
267 if (GetX1() > GetX2())
268 parent->ShowGuidelines(this, event, GetY1() > GetY2() ? '4' : '1', true);
269 else
270 parent->ShowGuidelines(this, event, GetY1() > GetY2() ? '3' : '2', true);
271 } else if (selectPoint == 3) {
272 parent->ShowGuidelines(this, event, 'i', true);
273 }
274 parent->Modified(kTRUE);
275 parent->Update();
276 }
277 break;
278
279 case kButton1Up:
280
281 if (gROOT->IsEscaped()) {
282 gROOT->SetEscape(kFALSE);
283 if (opaque) {
284 SetX1(oldX1);
285 SetY1(oldY1);
286 SetX2(oldX2);
287 SetY2(oldY2);
288 parent->ShowGuidelines(this, event);
289 parent->Modified(kTRUE);
290 parent->Update();
291 }
292 break;
293 }
294 if (opaque) {
295 parent->ShowGuidelines(this, event);
296 } else {
297 action(selectPoint, px1, py1, px2, py2);
298 parent->Modified(kTRUE);
299 parent->Update();
300 }
301 selectPoint = 0;
302 break;
303
304 case kButton1Locate:
305
306 // Sergey: code is never used, has to be removed in ROOT7
307 ExecuteEvent(kButton1Down, px, py);
308 while (true) {
309 px = py = 0;
310 event = parent->GetCanvasImp()->RequestLocator(px, py);
311
313
314 if (event != -1) { // button is released
315 ExecuteEvent(kButton1Up, px, py);
316 return;
317 }
318 }
319 }
320}
321
322////////////////////////////////////////////////////////////////////////////////
323/// Get the slope of this TLine
324
326{
327 Double_t m = 0;
328 if (fX2 == fX1) {
329 Error("GetSlope", "This line is vertical. The slope in undefined");
330 m = TMath::Infinity();
331 } else {
332 m = (fY2-fY1)/(fX2-fX1);
333 }
334 return m;
335}
336
337////////////////////////////////////////////////////////////////////////////////
338/// Get the Y-Intercept of this TLine
339
341{
342 Double_t b = 0;
343 if (fX2 == fX1) {
344 Error("GetYIntercept", "This line is vertical. The Y-Intercept in undefined");
345 b = TMath::Infinity();
346 } else {
347 b = (fY1*fX2-fY2*fX1)/(fX2-fX1);
348 }
349 return b;
350}
351
352////////////////////////////////////////////////////////////////////////////////
353/// List this line with its attributes.
354
355void TLine::ls(Option_t *) const
356{
358 printf("%s X1=%f Y1=%f X2=%f Y2=%f\n",IsA()->GetName(),fX1,fY1,fX2,fY2);
359}
360
361////////////////////////////////////////////////////////////////////////////////
362/// Paint this line with its current attributes.
363
365{
366 if (!gPad) return;
368 else PaintLine(gPad->XtoPad(fX1),gPad->YtoPad(fY1),gPad->XtoPad(fX2),gPad->YtoPad(fY2));
369}
370
371////////////////////////////////////////////////////////////////////////////////
372/// Draw this line with new coordinates.
373
375{
376 if (!gPad) return;
377 TAttLine::Modify(); //Change line attributes only if necessary
378 gPad->PaintLine(x1,y1,x2,y2);
379}
380
381////////////////////////////////////////////////////////////////////////////////
382/// Draw this line with new coordinates in NDC.
383
385{
386 if (!gPad) return;
387 TAttLine::Modify(); //Change line attributes only if necessary
388 gPad->PaintLineNDC(u1,v1,u2,v2);
389}
390
391////////////////////////////////////////////////////////////////////////////////
392/// Dump this line with its attributes.
393
395{
396 printf("%s X1=%f Y1=%f X2=%f Y2=%f",IsA()->GetName(),fX1,fY1,fX2,fY2);
397 if (GetLineColor() != 1) printf(" Color=%d",GetLineColor());
398 if (GetLineStyle() != 1) printf(" Style=%d",GetLineStyle());
399 if (GetLineWidth() != 1) printf(" Width=%d",GetLineWidth());
400 printf("\n");
401}
402
403////////////////////////////////////////////////////////////////////////////////
404/// Save primitive as a C++ statement(s) on output stream out
405
406void TLine::SavePrimitive(std::ostream &out, Option_t *option)
407{
408 SavePrimitiveConstructor(out, Class(), "line", TString::Format("%g, %g, %g, %g", fX1, fY1, fX2, fY2), kFALSE);
409
410 SaveLineAttributes(out, "line", 1, 1, 1);
411
412 if (TestBit(kLineNDC))
413 out << " line->SetNDC();\n";
414
415 if (TestBit(kVertical))
416 out << " line->SetBit(TLine::kVertical);\n";
417
418 if (TestBit(kHorizontal))
419 out << " line->SetBit(TLine::kHorizontal);\n";
420
421 SavePrimitiveDraw(out, "line", option);
422}
423
424////////////////////////////////////////////////////////////////////////////////
425/// Check whether this line is to be drawn horizontally.
426
431
432////////////////////////////////////////////////////////////////////////////////
433/// Check whether this line is to be drawn vertically.
434
436{
437 return TestBit(kVertical);
438}
439
440////////////////////////////////////////////////////////////////////////////////
441/// Set NDC mode on if isNDC = kTRUE, off otherwise
442
447
448////////////////////////////////////////////////////////////////////////////////
449/// Force the line to be drawn horizontally.
450/// Makes fY2 equal to fY1. The line length is kept.
451/// TArrow and TGaxis also get this function by inheritance.
452
453void TLine::SetHorizontal(Bool_t set /*= kTRUE*/)
454{
455 SetBit(kHorizontal, set);
456 if (set && gPad) {
458 Int_t px1 = gPad->XtoAbsPixel(fX1);
459 Int_t px2 = gPad->XtoAbsPixel(fX2);
460 Int_t py1 = gPad->YtoAbsPixel(fY1);
461 Int_t py2 = gPad->YtoAbsPixel(fY2);
462 Int_t l = Int_t(TMath::Sqrt((px2-px1)*(px2-px1)+(py2-py1)*(py2-py1)));
463 if (fX2 >= fX1) fX2 = gPad->AbsPixeltoX(px1+l);
464 else fX2 = gPad->AbsPixeltoX(px1-l);
465 fY2 = fY1;
466 }
467}
468
469////////////////////////////////////////////////////////////////////////////////
470/// Force the line to be drawn vertically.
471/// Makes fX2 equal to fX1. The line length is kept.
472/// TArrow and TGaxis also get this function by inheritance.
473
474void TLine::SetVertical(Bool_t set /*= kTRUE*/)
475{
476 SetBit(kVertical, set);
477 if (set && gPad) {
479 Int_t px1 = gPad->XtoAbsPixel(fX1);
480 Int_t px2 = gPad->XtoAbsPixel(fX2);
481 Int_t py1 = gPad->YtoAbsPixel(fY1);
482 Int_t py2 = gPad->YtoAbsPixel(fY2);
483 Int_t l = Int_t(TMath::Sqrt((px2-px1)*(px2-px1)+(py2-py1)*(py2-py1)));
484 if (fY2 >= fY1) fY2 = gPad->AbsPixeltoY(py1-l);
485 else fY2 = gPad->AbsPixeltoY(py1+l);
486 fX2 = fX1;
487 }
488}
489
490////////////////////////////////////////////////////////////////////////////////
491/// Stream an object of class TLine.
492
494{
495 if (R__b.IsReading()) {
497 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
498 if (R__v > 1) {
499 R__b.ReadClassBuffer(TLine::Class(), this, R__v, R__s, R__c);
500 return;
501 }
502 //====process old versions before automatic schema evolution
505 Float_t x1,y1,x2,y2;
506 R__b >> x1; fX1 = x1;
507 R__b >> y1; fY1 = y1;
508 R__b >> x2; fX2 = x2;
509 R__b >> y2; fY2 = y2;
510 //====end of old versions
511
512 } else {
513 R__b.WriteClassBuffer(TLine::Class(),this);
514 }
515}
516////////////////////////////////////////////////////////////////////////////////
517/// Return the bounding Box of the Line
518
520{
521 Rectangle_t BBox{0, 0, 0, 0};
522 if (gPad) {
523 Int_t px1 = gPad->XtoPixel(fX1);
524 Int_t px2 = gPad->XtoPixel(fX2);
525 Int_t py1 = gPad->YtoPixel(fY1);
526 Int_t py2 = gPad->YtoPixel(fY2);
527
528 if (px1 > px2) {
529 Int_t tmp = px1;
530 px1 = px2;
531 px2 = tmp;
532 }
533 if (py1 > py2) {
534 Int_t tmp = py1;
535 py1 = py2;
536 py2 = tmp;
537 }
538
539 BBox.fX = px1;
540 BBox.fY = py1;
541 BBox.fWidth = px2 - px1;
542 BBox.fHeight = py2 - py1;
543 }
544 return BBox;
545}
546
547////////////////////////////////////////////////////////////////////////////////
548/// Return the center of the BoundingBox as TPoint in pixels
549
551{
552 TPoint p(0, 0);
553 if (gPad) {
554 p.SetX(gPad->XtoPixel(TMath::Min(fX1, fX2) + 0.5 * (TMath::Max(fX1, fX2) - TMath::Min(fX1, fX2))));
555 p.SetY(gPad->YtoPixel(TMath::Min(fY1, fY2) + 0.5 * (TMath::Max(fY1, fY2) - TMath::Min(fY1, fY2))));
556 }
557 return p;
558}
559
560////////////////////////////////////////////////////////////////////////////////
561/// Set center of the BoundingBox
562
564{
565 if (!gPad) return;
568 if (fX2>fX1) {
569 this->SetX1(gPad->PixeltoX(p.GetX())-0.5*w);
570 this->SetX2(gPad->PixeltoX(p.GetX())+0.5*w);
571 }
572 else {
573 this->SetX2(gPad->PixeltoX(p.GetX())-0.5*w);
574 this->SetX1(gPad->PixeltoX(p.GetX())+0.5*w);
575 }
576 if (fY2>fY1) {
577 this->SetY1(gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0))-0.5*h);
578 this->SetY2(gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0))+0.5*h);
579 }
580 else {
581 this->SetY2(gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0))-0.5*h);
582 this->SetY1(gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0))+0.5*h);
583 }
584}
585
586////////////////////////////////////////////////////////////////////////////////
587/// Set X coordinate of the center of the BoundingBox
588
590{
591 if (!gPad) return;
593 if (fX2>fX1) {
594 this->SetX1(gPad->PixeltoX(x)-0.5*w);
595 this->SetX2(gPad->PixeltoX(x)+0.5*w);
596 }
597 else {
598 this->SetX2(gPad->PixeltoX(x)-0.5*w);
599 this->SetX1(gPad->PixeltoX(x)+0.5*w);
600 }
601}
602
603////////////////////////////////////////////////////////////////////////////////
604/// Set Y coordinate of the center of the BoundingBox
605
607{
608 if (!gPad) return;
610 if (fY2>fY1) {
611 this->SetY1(gPad->PixeltoY(y-gPad->VtoPixel(0))-0.5*h);
612 this->SetY2(gPad->PixeltoY(y-gPad->VtoPixel(0))+0.5*h);
613 }
614 else {
615 this->SetY2(gPad->PixeltoY(y-gPad->VtoPixel(0))-0.5*h);
616 this->SetY1(gPad->PixeltoY(y-gPad->VtoPixel(0))+0.5*h);
617 }
618}
619
620////////////////////////////////////////////////////////////////////////////////
621/// Set left hand side of BoundingBox to a value
622/// (resize in x direction on left)
623
625{
626 if (!gPad) return;
627 if (fX2>fX1)
628 this->SetX1(gPad->PixeltoX(x));
629 else
630 this->SetX2(gPad->PixeltoX(x));
631}
632
633////////////////////////////////////////////////////////////////////////////////
634/// Set right hand side of BoundingBox to a value
635/// (resize in x direction on right)
636
638{
639 if (!gPad) return;
640 if (fX2>fX1)
641 this->SetX2(gPad->PixeltoX(x));
642 else
643 this->SetX1(gPad->PixeltoX(x));
644}
645
646////////////////////////////////////////////////////////////////////////////////
647/// Set top of BoundingBox to a value (resize in y direction on top)
648
650{
651 if (!gPad) return;
652 if (fY2>fY1)
653 this->SetY2(gPad->PixeltoY(y - gPad->VtoPixel(0)));
654 else
655 this->SetY1(gPad->PixeltoY(y - gPad->VtoPixel(0)));
656}
657
658////////////////////////////////////////////////////////////////////////////////
659/// Set bottom of BoundingBox to a value
660/// (resize in y direction on bottom)
661
663{
664 if (!gPad) return;
665 if (fY2>fY1)
666 this->SetY1(gPad->PixeltoY(y - gPad->VtoPixel(0)));
667 else
668 this->SetY2(gPad->PixeltoY(y - gPad->VtoPixel(0)));
669}
@ 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
@ kButton1Locate
Definition Buttons.h:22
@ kMove
Definition GuiTypes.h:375
@ kPointer
Definition GuiTypes.h:376
#define b(i)
Definition RSha256.hxx:100
#define h(i)
Definition RSha256.hxx:106
int Int_t
Signed integer 4 bytes (int)
Definition RtypesCore.h:59
short Version_t
Class version identifier (short)
Definition RtypesCore.h:79
float Float_t
Float 4 bytes (float)
Definition RtypesCore.h:71
constexpr Bool_t kFALSE
Definition RtypesCore.h:108
constexpr Bool_t kTRUE
Definition RtypesCore.h:107
const char Option_t
Option string (const char)
Definition RtypesCore.h:80
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 const char y2
Option_t Option_t TPoint TPoint const char DrawLine
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t src
Option_t Option_t TPoint TPoint const char y1
#define gROOT
Definition TROOT.h:414
#define gPad
Abstract base class for elements drawn in the editor.
Definition TAttBBox2D.h:19
Line Attributes class.
Definition TAttLine.h:21
virtual void Streamer(TBuffer &)
virtual Color_t GetLineColor() const
Return the line color.
Definition TAttLine.h:36
virtual Width_t GetLineWidth() const
Return the line width.
Definition TAttLine.h:38
virtual Style_t GetLineStyle() const
Return the line style.
Definition TAttLine.h:37
virtual void Modify()
Change current line attributes if necessary.
Definition TAttLine.cxx:246
void Copy(TAttLine &attline) const
Copy this line attributes to a new TAttLine.
Definition TAttLine.cxx:176
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:210
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:289
Buffer base class used for serializing objects.
Definition TBuffer.h:43
Use the TLine constructor to create a simple line.
Definition TLine.h:22
void ls(Option_t *option="") const override
List this line with its attributes.
Definition TLine.cxx:355
virtual void SetY2(Double_t y2)
Definition TLine.h:70
static TClass * Class()
Double_t fY1
Y of 1st point.
Definition TLine.h:26
Double_t fX1
X of 1st point.
Definition TLine.h:25
Double_t GetYIntercept() const
Get the Y-Intercept of this TLine.
Definition TLine.cxx:340
virtual void SetX2(Double_t x2)
Definition TLine.h:68
@ kLineNDC
Use NDC coordinates.
Definition TLine.h:33
@ kHorizontal
Line is horizontal.
Definition TLine.h:35
@ kVertical
Line is vertical.
Definition TLine.h:34
Bool_t IsVertical()
Check whether this line is to be drawn vertically.
Definition TLine.cxx:435
virtual TLine * DrawLine(Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Draw this line with new coordinates.
Definition TLine.cxx:103
void SetBBoxY1(const Int_t y) override
Set top of BoundingBox to a value (resize in y direction on top)
Definition TLine.cxx:649
void SetVertical(Bool_t set=kTRUE)
Force the line to be drawn vertically.
Definition TLine.cxx:474
virtual void PaintLine(Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Draw this line with new coordinates.
Definition TLine.cxx:374
Double_t GetSlope() const
Get the slope of this TLine.
Definition TLine.cxx:325
TLine()
Definition TLine.h:38
void SetBBoxCenterY(const Int_t y) override
Set Y coordinate of the center of the BoundingBox.
Definition TLine.cxx:606
void SetBBoxX2(const Int_t x) override
Set right hand side of BoundingBox to a value (resize in x direction on right)
Definition TLine.cxx:637
virtual TLine * DrawLineNDC(Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Draw this line with new coordinates in NDC.
Definition TLine.cxx:115
Bool_t IsHorizontal()
Check whether this line is to be drawn horizontally.
Definition TLine.cxx:427
Double_t GetY1() const
Definition TLine.h:52
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save primitive as a C++ statement(s) on output stream out.
Definition TLine.cxx:406
void Copy(TObject &line) const override
Copy this line to line.
Definition TLine.cxx:76
Double_t GetX2() const
Definition TLine.h:51
void Print(Option_t *option="") const override
Dump this line with its attributes.
Definition TLine.cxx:394
Double_t fX2
X of 2nd point.
Definition TLine.h:27
void SetBBoxX1(const Int_t x) override
Set left hand side of BoundingBox to a value (resize in x direction on left)
Definition TLine.cxx:624
void Paint(Option_t *option="") override
Paint this line with its current attributes.
Definition TLine.cxx:364
void SetBBoxY2(const Int_t y) override
Set bottom of BoundingBox to a value (resize in y direction on bottom)
Definition TLine.cxx:662
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
Compute distance from point px,py to a line.
Definition TLine.cxx:89
TPoint GetBBoxCenter() override
Return the center of the BoundingBox as TPoint in pixels.
Definition TLine.cxx:550
virtual void SetX1(Double_t x1)
Definition TLine.h:67
TLine & operator=(const TLine &src)
Assignment operator.
Definition TLine.cxx:67
Double_t fY2
Y of 2nd point.
Definition TLine.h:28
virtual void PaintLineNDC(Double_t u1, Double_t v1, Double_t u2, Double_t v2)
Draw this line with new coordinates in NDC.
Definition TLine.cxx:384
void Streamer(TBuffer &) override
Stream an object of class TLine.
Definition TLine.cxx:493
void SetBBoxCenterX(const Int_t x) override
Set X coordinate of the center of the BoundingBox.
Definition TLine.cxx:589
TClass * IsA() const override
Definition TLine.h:81
virtual void SetY1(Double_t y1)
Definition TLine.h:69
virtual void SetNDC(Bool_t isNDC=kTRUE)
Set NDC mode on if isNDC = kTRUE, off otherwise.
Definition TLine.cxx:443
void SetBBoxCenter(const TPoint &p) override
Set center of the BoundingBox.
Definition TLine.cxx:563
void ExecuteEvent(Int_t event, Int_t px, Int_t py) override
Execute action corresponding to one event.
Definition TLine.cxx:132
Double_t GetX1() const
Definition TLine.h:50
Rectangle_t GetBBox() override
Return the bounding Box of the Line.
Definition TLine.cxx:519
void SetHorizontal(Bool_t set=kTRUE)
Force the line to be drawn horizontally.
Definition TLine.cxx:453
Double_t GetY2() const
Definition TLine.h:53
Mother of all ROOT objects.
Definition TObject.h:42
virtual const char * GetName() const
Returns name of object.
Definition TObject.cxx:459
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition TObject.h:204
virtual void Streamer(TBuffer &)
Stream an object of class TObject.
Definition TObject.cxx:994
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition TObject.cxx:885
virtual void Copy(TObject &object) const
Copy this to obj.
Definition TObject.cxx:156
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition TObject.cxx:1095
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:842
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:774
@ kCanDelete
if object in a list can be deleted
Definition TObject.h:71
SCoord_t GetY() const
Definition TPoint.h:47
SCoord_t GetX() const
Definition TPoint.h:46
static void IndentLevel()
Functions used by ls() to indent an object hierarchy.
Definition TROOT.cxx:2905
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:2384
TLine * line
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:249
Double_t Sqrt(Double_t x)
Returns the square root of x.
Definition TMath.h:673
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.
Definition TMath.h:732
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Definition TMathBase.h:197
Double_t Infinity()
Returns an infinity as defined by the IEEE standard.
Definition TMath.h:928
Rectangle structure (maps to the X11 XRectangle structure)
Definition GuiTypes.h:362
TMarker m
Definition textangle.C:8
TLine l
Definition textangle.C:4