Logo ROOT  
Reference Guide
TPolyLine.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 <iostream>
13#include <vector>
14#include "TROOT.h"
15#include "TBuffer.h"
16#include "TMath.h"
17#include "TVirtualPad.h"
18#include "TVirtualX.h"
19#include "TPolyLine.h"
20
22
23/** \class TPolyLine
24\ingroup BasicGraphics
25
26Defined by an array on N points in a 2-D space.
27
28One can draw the contour of the polyline or/and its fill area.
29Example:
30Begin_Macro(source)
31{
32 Double_t x[5] = {.2,.7,.6,.25,.2};
33 Double_t y[5] = {.5,.1,.9,.7,.5};
34 TPolyLine *pline = new TPolyLine(5,x,y);
35 pline->SetFillColor(38);
36 pline->SetLineColor(2);
37 pline->SetLineWidth(4);
38 pline->Draw("f");
39 pline->Draw();
40}
41End_Macro
42*/
43
44////////////////////////////////////////////////////////////////////////////////
45/// PolyLine default constructor.
46
48{
49 fN = 0;
50 fX = nullptr;
51 fY = nullptr;
52 fLastPoint = -1;
53}
54
55////////////////////////////////////////////////////////////////////////////////
56/// PolyLine normal constructor without initialisation.
57/// Allocates n points. The option string is ignored.
58
61{
63 fLastPoint = -1;
64 if (n <= 0) {
65 fN = 0;
66 fLastPoint = -1;
67 fX = fY = nullptr;
68 return;
69 }
70 fN = n;
71 fX = new Double_t[fN];
72 fY = new Double_t[fN];
73}
74
75////////////////////////////////////////////////////////////////////////////////
76/// PolyLine normal constructor (single precision).
77/// Makes n points with (x, y) coordinates from x and y.
78/// The option string is ignored.
79
82{
84 fLastPoint = -1;
85 if (n <= 0) {
86 fN = 0;
87 fLastPoint = -1;
88 fX = fY = 0;
89 return;
90 }
91 fN = n;
92 fX = new Double_t[fN];
93 fY = new Double_t[fN];
94 if (!x || !y) return;
95 for (Int_t i=0; i<fN;i++) { fX[i] = x[i]; fY[i] = y[i];}
96 fLastPoint = fN-1;
97}
98
99////////////////////////////////////////////////////////////////////////////////
100/// PolyLine normal constructor (double precision).
101/// Makes n points with (x, y) coordinates from x and y.
102/// The option string is ignored.
103
105 :TObject(), TAttLine(), TAttFill()
106{
107 fOption = option;
108 fLastPoint = -1;
109 if (n <= 0) {
110 fN = 0;
111 fLastPoint = -1;
112 fX = fY = nullptr;
113 return;
114 }
115 fN = n;
116 fX = new Double_t[fN];
117 fY = new Double_t[fN];
118 if (!x || !y) return;
119 for (Int_t i=0; i<fN;i++) { fX[i] = x[i]; fY[i] = y[i];}
120 fLastPoint = fN-1;
121}
122
123////////////////////////////////////////////////////////////////////////////////
124///assignment operator
125
127{
128 if(this != &pl)
129 pl.TPolyLine::Copy(*this);
130 return *this;
131}
132
133////////////////////////////////////////////////////////////////////////////////
134/// PolyLine default destructor.
135
137{
138 if (fX) delete [] fX;
139 if (fY) delete [] fY;
140}
141
142////////////////////////////////////////////////////////////////////////////////
143/// PolyLine copy constructor.
144
145TPolyLine::TPolyLine(const TPolyLine &polyline) : TObject(polyline), TAttLine(polyline), TAttFill(polyline)
146{
147 fN = 0;
148 fX = nullptr;
149 fY = nullptr;
150 fLastPoint = -1;
151 polyline.TPolyLine::Copy(*this);
152}
153
154////////////////////////////////////////////////////////////////////////////////
155/// Copy this polyline to polyline.
156
157void TPolyLine::Copy(TObject &obj) const
158{
159 TObject::Copy(obj);
160 TAttLine::Copy(((TPolyLine&)obj));
161 TAttFill::Copy(((TPolyLine&)obj));
162 ((TPolyLine&)obj).fN = fN;
163 delete [] ((TPolyLine&)obj).fX;
164 delete [] ((TPolyLine&)obj).fY;
165 if (fN > 0) {
166 ((TPolyLine&)obj).fX = new Double_t[fN];
167 ((TPolyLine&)obj).fY = new Double_t[fN];
168 for (Int_t i = 0; i < fN; i++) {
169 ((TPolyLine &)obj).fX[i] = fX[i];
170 ((TPolyLine &)obj).fY[i] = fY[i];
171 }
172 } else {
173 ((TPolyLine&)obj).fX = nullptr;
174 ((TPolyLine&)obj).fY = nullptr;
175 }
176 ((TPolyLine&)obj).fOption = fOption;
177 ((TPolyLine&)obj).fLastPoint = fLastPoint;
178}
179
180////////////////////////////////////////////////////////////////////////////////
181/// Returns closest distance in pixels from point (px, py) to a polyline.
182///
183/// First looks for distances to the points of the polyline. Stops search
184/// and returns if a vertex of the polyline is found to be closer than 10
185/// pixels. Thus the return value may depend on the ordering of points
186/// in the polyline.
187///
188/// Then looks for distances to the lines of the polyline. There is no
189/// arbitrary cutoff; any distance may be found.
190///
191/// Finally checks whether (px, py) is inside a closed and filled polyline.
192/// (Must be EXACTLY closed. "Filled" means fill color and fill style are
193/// both non-zero.) If so, returns zero.
194///
195/// Returns 9999 if the polyline has no points.
196
198{
199 const Int_t big = 9999;
200 const Int_t kMaxDiff = 10;
201
202 // check if point is near one of the points
203 Int_t i, pxp, pyp, d;
204 Int_t distance = big;
205 if (Size() <= 0) return distance;
206
207 for (i=0;i<Size();i++) {
208 pxp = gPad->XtoAbsPixel(gPad->XtoPad(fX[i]));
209 pyp = gPad->YtoAbsPixel(gPad->YtoPad(fY[i]));
210 d = TMath::Abs(pxp-px) + TMath::Abs(pyp-py);
211 if (d < distance) distance = d;
212 }
213 if (distance < kMaxDiff) return distance;
214
215 // check if point is near one of the connecting lines
216 for (i=0;i<Size()-1;i++) {
217 d = DistancetoLine(px, py, gPad->XtoPad(fX[i]), gPad->YtoPad(fY[i]), gPad->XtoPad(fX[i+1]), gPad->YtoPad(fY[i+1]));
218 if (d < distance) distance = d;
219 }
220
221 // in case of a closed and filled polyline, check if we are inside
222 if (fFillColor && fFillStyle && fX[0] == fX[fLastPoint] && fY[0] == fY[fLastPoint]) {
223 if (TMath::IsInside(gPad->AbsPixeltoX(px),gPad->AbsPixeltoY(py),fLastPoint+1,fX,fY)) distance = 0;
224 }
225 return distance;
226}
227
228////////////////////////////////////////////////////////////////////////////////
229/// Draw this polyline with its current attributes.
230
232{
234}
235
236////////////////////////////////////////////////////////////////////////////////
237/// Draw this polyline with new coordinates.
238
240{
241 TPolyLine *newpolyline = new TPolyLine(n,x,y);
242 TAttLine::Copy(*newpolyline);
243 TAttFill::Copy(*newpolyline);
244 newpolyline->fOption = fOption;
245 newpolyline->SetBit(kCanDelete);
246 newpolyline->AppendPad(option);
247 return newpolyline;
248}
249
250////////////////////////////////////////////////////////////////////////////////
251/// Execute action corresponding to one event.
252///
253/// This member function is called when a polyline is clicked with the locator
254///
255/// If Left button clicked on one of the line end points, this point
256/// follows the cursor until button is released.
257///
258/// if Middle button clicked, the line is moved parallel to itself
259/// until the button is released.
260
262{
263 if (!gPad) return;
264
265 Int_t i, d;
266 Double_t xmin, xmax, ymin, ymax, dx, dy, dxr, dyr;
267 const Int_t kMaxDiff = 10;
268 static Bool_t middle;
269 static Int_t ipoint, pxp, pyp;
270 static Int_t px1,px2,py1,py2;
271 static Int_t pxold, pyold, px1old, py1old, px2old, py2old;
272 static Int_t dpx, dpy;
273 static std::vector<Int_t> x, y;
274 Bool_t opaque = gPad->OpaqueMoving();
275
276 if (!gPad->IsEditable()) return;
277
278 Int_t np = Size();
279
280 switch (event) {
281
282 case kButton1Down:
283 gVirtualX->SetLineColor(-1);
284 TAttLine::Modify(); //Change line attributes only if necessary
285 px1 = gPad->XtoAbsPixel(gPad->GetX1());
286 py1 = gPad->YtoAbsPixel(gPad->GetY1());
287 px2 = gPad->XtoAbsPixel(gPad->GetX2());
288 py2 = gPad->YtoAbsPixel(gPad->GetY2());
289 ipoint = -1;
290
291
292 if (!x.empty() || !y.empty()) break;
293 x.resize(np+1, 0);
294 y.resize(np+1, 0);
295 for (i=0;i<np;i++) {
296 pxp = gPad->XtoAbsPixel(gPad->XtoPad(fX[i]));
297 pyp = gPad->YtoAbsPixel(gPad->YtoPad(fY[i]));
298 if (!opaque) {
299 gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
300 gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
301 gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
302 gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
303 }
304 x[i] = pxp;
305 y[i] = pyp;
306 d = TMath::Abs(pxp-px) + TMath::Abs(pyp-py);
307 if (d < kMaxDiff) ipoint =i;
308 }
309 dpx = 0;
310 dpy = 0;
311 pxold = px;
312 pyold = py;
313 if (ipoint < 0) return;
314 if (ipoint == 0) {
315 px1old = 0;
316 py1old = 0;
317 px2old = gPad->XtoAbsPixel(fX[1]);
318 py2old = gPad->YtoAbsPixel(fY[1]);
319 } else if (ipoint == fN-1) {
320 px1old = gPad->XtoAbsPixel(gPad->XtoPad(fX[fN-2]));
321 py1old = gPad->YtoAbsPixel(gPad->YtoPad(fY[fN-2]));
322 px2old = 0;
323 py2old = 0;
324 } else {
325 px1old = gPad->XtoAbsPixel(gPad->XtoPad(fX[ipoint-1]));
326 py1old = gPad->YtoAbsPixel(gPad->YtoPad(fY[ipoint-1]));
327 px2old = gPad->XtoAbsPixel(gPad->XtoPad(fX[ipoint+1]));
328 py2old = gPad->YtoAbsPixel(gPad->YtoPad(fY[ipoint+1]));
329 }
330 pxold = gPad->XtoAbsPixel(gPad->XtoPad(fX[ipoint]));
331 pyold = gPad->YtoAbsPixel(gPad->YtoPad(fY[ipoint]));
332
333 break;
334
335
336 case kMouseMotion:
337
338 middle = kTRUE;
339 for (i=0;i<np;i++) {
340 pxp = gPad->XtoAbsPixel(gPad->XtoPad(fX[i]));
341 pyp = gPad->YtoAbsPixel(gPad->YtoPad(fY[i]));
342 d = TMath::Abs(pxp-px) + TMath::Abs(pyp-py);
343 if (d < kMaxDiff) middle = kFALSE;
344 }
345
346
347 // check if point is close to an axis
348 if (middle) gPad->SetCursor(kMove);
349 else gPad->SetCursor(kHand);
350 break;
351
352 case kButton1Motion:
353 if (!opaque) {
354 if (middle) {
355 for(i=0;i<np-1;i++) {
356 gVirtualX->DrawLine(x[i]+dpx, y[i]+dpy, x[i+1]+dpx, y[i+1]+dpy);
357 pxp = x[i]+dpx;
358 pyp = y[i]+dpy;
359 gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
360 gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
361 gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
362 gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
363 }
364 pxp = x[np-1]+dpx;
365 pyp = y[np-1]+dpy;
366 gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
367 gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
368 gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
369 gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
370 dpx += px - pxold;
371 dpy += py - pyold;
372 pxold = px;
373 pyold = py;
374 for(i=0;i<np-1;i++) {
375 gVirtualX->DrawLine(x[i]+dpx, y[i]+dpy, x[i+1]+dpx, y[i+1]+dpy);
376 pxp = x[i]+dpx;
377 pyp = y[i]+dpy;
378 gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
379 gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
380 gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
381 gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
382 }
383 pxp = x[np-1]+dpx;
384 pyp = y[np-1]+dpy;
385 gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
386 gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
387 gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
388 gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
389 } else {
390 if (px1old) gVirtualX->DrawLine(px1old, py1old, pxold, pyold);
391 if (px2old) gVirtualX->DrawLine(pxold, pyold, px2old, py2old);
392 gVirtualX->DrawLine(pxold-4, pyold-4, pxold+4, pyold-4);
393 gVirtualX->DrawLine(pxold+4, pyold-4, pxold+4, pyold+4);
394 gVirtualX->DrawLine(pxold+4, pyold+4, pxold-4, pyold+4);
395 gVirtualX->DrawLine(pxold-4, pyold+4, pxold-4, pyold-4);
396 pxold = px;
397 pxold = TMath::Max(pxold, px1);
398 pxold = TMath::Min(pxold, px2);
399 pyold = py;
400 pyold = TMath::Max(pyold, py2);
401 pyold = TMath::Min(pyold, py1);
402 if (px1old) gVirtualX->DrawLine(px1old, py1old, pxold, pyold);
403 if (px2old) gVirtualX->DrawLine(pxold, pyold, px2old, py2old);
404 gVirtualX->DrawLine(pxold-4, pyold-4, pxold+4, pyold-4);
405 gVirtualX->DrawLine(pxold+4, pyold-4, pxold+4, pyold+4);
406 gVirtualX->DrawLine(pxold+4, pyold+4, pxold-4, pyold+4);
407 gVirtualX->DrawLine(pxold-4, pyold+4, pxold-4, pyold-4);
408 }
409 } else {
410 if (middle) {
411 for(i=0;i<np-1;i++) {
412 pxp = x[i]+dpx;
413 pyp = y[i]+dpy;
414 }
415 pxp = x[np-1]+dpx;
416 pyp = y[np-1]+dpy;
417 dpx += px - pxold;
418 dpy += py - pyold;
419 pxold = px;
420 pyold = py;
421 } else {
422 pxold = px;
423 pxold = TMath::Max(pxold, px1);
424 pxold = TMath::Min(pxold, px2);
425 pyold = py;
426 pyold = TMath::Max(pyold, py2);
427 pyold = TMath::Min(pyold, py1);
428 }
429 if (!x.empty() && !y.empty()) {
430 if (middle) {
431 for(i=0;i<np;i++) {
432 fX[i] = gPad->PadtoX(gPad->AbsPixeltoX(x[i]+dpx));
433 fY[i] = gPad->PadtoY(gPad->AbsPixeltoY(y[i]+dpy));
434 }
435 } else {
436 fX[ipoint] = gPad->PadtoX(gPad->AbsPixeltoX(pxold));
437 fY[ipoint] = gPad->PadtoY(gPad->AbsPixeltoY(pyold));
438 }
439 }
440 gPad->Modified(kTRUE);
441 }
442 break;
443
444 case kButton1Up:
445
446 // Compute x,y range
447 xmin = gPad->GetUxmin();
448 xmax = gPad->GetUxmax();
449 ymin = gPad->GetUymin();
450 ymax = gPad->GetUymax();
451 dx = xmax-xmin;
452 dy = ymax-ymin;
453 dxr = dx/(1 - gPad->GetLeftMargin() - gPad->GetRightMargin());
454 dyr = dy/(1 - gPad->GetBottomMargin() - gPad->GetTopMargin());
455
456 // Range() could change the size of the pad pixmap and therefore should
457 // be called before the other paint routines
458 gPad->Range(xmin - dxr*gPad->GetLeftMargin(),
459 ymin - dyr*gPad->GetBottomMargin(),
460 xmax + dxr*gPad->GetRightMargin(),
461 ymax + dyr*gPad->GetTopMargin());
462 gPad->RangeAxis(xmin, ymin, xmax, ymax);
463
464 if (!x.empty() && !y.empty()) {
465 if (middle) {
466 for(i=0;i<np;i++) {
467 fX[i] = gPad->PadtoX(gPad->AbsPixeltoX(x[i]+dpx));
468 fY[i] = gPad->PadtoY(gPad->AbsPixeltoY(y[i]+dpy));
469 }
470 } else {
471 fX[ipoint] = gPad->PadtoX(gPad->AbsPixeltoX(pxold));
472 fY[ipoint] = gPad->PadtoY(gPad->AbsPixeltoY(pyold));
473 }
474 x.clear();
475 y.clear();
476 }
477 gPad->Modified(kTRUE);
478 gVirtualX->SetLineColor(-1);
479 }
480}
481
482////////////////////////////////////////////////////////////////////////////////
483/// List this polyline with its attributes.
484/// The option string is ignored.
485
487{
489 printf("TPolyLine N=%d\n",fN);
490}
491
492////////////////////////////////////////////////////////////////////////////////
493/// Merge polylines in the collection in this polyline
494
496{
497 if (!li) return 0;
498 TIter next(li);
499
500 //first loop to count the number of entries
501 TPolyLine *pl;
502 Int_t npoints = 0;
503 while ((pl = (TPolyLine*)next())) {
504 if (!pl->InheritsFrom(TPolyLine::Class())) {
505 Error("Add","Attempt to add object of class: %s to a %s",pl->ClassName(),this->ClassName());
506 return -1;
507 }
508 npoints += pl->Size();
509 }
510
511 //extend this polyline to hold npoints
512 if (npoints > 1) SetPoint(npoints-1,0,0);
513
514 //merge all polylines
515 next.Reset();
516 while ((pl = (TPolyLine*)next())) {
517 Int_t np = pl->Size();
518 Double_t *x = pl->GetX();
519 Double_t *y = pl->GetY();
520 for (Int_t i=0;i<np;i++) {
521 SetPoint(i,x[i],y[i]);
522 }
523 }
524
525 return npoints;
526}
527
528////////////////////////////////////////////////////////////////////////////////
529/// Paint this polyline with its current attributes.
530
532{
533 if (TestBit(kPolyLineNDC)) {
534 if (option && strlen(option)) PaintPolyLineNDC(fLastPoint+1, fX, fY, option);
536 } else {
537 if (option && strlen(option)) PaintPolyLine(fLastPoint+1, fX, fY, option);
539 }
540}
541
542////////////////////////////////////////////////////////////////////////////////
543/// Draw this polyline with new coordinates.
544///
545/// If option = 'f' or 'F' the fill area is drawn.
546/// The default is to draw the lines only.
547
549{
550 if (!gPad || n <= 0) return;
551 TAttLine::Modify(); //Change line attributes only if necessary
552 TAttFill::Modify(); //Change fill area attributes only if necessary
553 Double_t *xx = x;
554 Double_t *yy = y;
555 if (gPad->GetLogx()) {
556 xx = new Double_t[n];
557 for (Int_t ix=0;ix<n;ix++) xx[ix] = gPad->XtoPad(x[ix]);
558 }
559 if (gPad->GetLogy()) {
560 yy = new Double_t[n];
561 for (Int_t iy=0;iy<n;iy++) yy[iy] = gPad->YtoPad(y[iy]);
562 }
563 if (option && (*option == 'f' || *option == 'F'))
564 gPad->PaintFillArea(n, xx, yy, option);
565 else
566 gPad->PaintPolyLine(n, xx, yy, option);
567 if (x != xx)
568 delete[] xx;
569 if (y != yy)
570 delete[] yy;
571}
572
573////////////////////////////////////////////////////////////////////////////////
574/// Draw this polyline with new coordinates in NDC.
575
577{
578 TAttLine::Modify(); //Change line attributes only if necessary
579 TAttFill::Modify(); //Change fill area attributes only if necessary
580 if (*option == 'f' || *option == 'F') gPad->PaintFillAreaNDC(n,x,y,option);
581 else gPad->PaintPolyLineNDC(n,x,y,option);
582}
583
584////////////////////////////////////////////////////////////////////////////////
585/// Dump this polyline with its attributes.
586/// The option string is ignored.
587
589{
590 printf("PolyLine N=%d\n",fN);
591}
592
593////////////////////////////////////////////////////////////////////////////////
594/// Save primitive as a C++ statement(s) on output stream out
595
596void TPolyLine::SavePrimitive(std::ostream &out, Option_t *option /*= ""*/)
597{
598 char quote = '"';
599 out<<" "<<std::endl;
600 if (gROOT->ClassSaved(TPolyLine::Class())) {
601 out<<" ";
602 } else {
603 out<<" Double_t *dum = 0;"<<std::endl;
604 out<<" TPolyLine *";
605 }
606 out<<"pline = new TPolyLine("<<fN<<",dum,dum,"<<quote<<fOption<<quote<<");"<<std::endl;
607
608 SaveFillAttributes(out,"pline",0,1001);
609 SaveLineAttributes(out,"pline",1,1,1);
610
611 for (Int_t i=0;i<Size();i++) {
612 out<<" pline->SetPoint("<<i<<","<<fX[i]<<","<<fY[i]<<");"<<std::endl;
613 }
614 out<<" pline->Draw("
615 <<quote<<option<<quote<<");"<<std::endl;
616}
617
618////////////////////////////////////////////////////////////////////////////////
619/// Set NDC mode on if isNDC = kTRUE, off otherwise
620
622{
624 if (isNDC) SetBit(kPolyLineNDC);
625}
626
627////////////////////////////////////////////////////////////////////////////////
628/// Set point following LastPoint to x, y.
629/// Returns index of the point (new last point).
630
632{
633 fLastPoint++;
635 return fLastPoint;
636}
637
638////////////////////////////////////////////////////////////////////////////////
639/// Set point number n to (x, y)
640/// If n is greater than the current size, the arrays are automatically
641/// extended.
642
644{
645 if (n < 0) return;
646 if (!fX || !fY || n >= fN) {
647 // re-allocate the object
648 Int_t newN = TMath::Max(2*fN,n+1);
649 Double_t *savex = new Double_t [newN];
650 Double_t *savey = new Double_t [newN];
651 if (fX && fN){
652 memcpy(savex,fX,fN*sizeof(Double_t));
653 memset(&savex[fN],0,(newN-fN)*sizeof(Double_t));
654 delete [] fX;
655 }
656 if (fY && fN){
657 memcpy(savey,fY,fN*sizeof(Double_t));
658 memset(&savey[fN],0,(newN-fN)*sizeof(Double_t));
659 delete [] fY;
660 }
661 fX = savex;
662 fY = savey;
663 fN = newN;
664 }
665 fX[n] = x;
666 fY[n] = y;
668}
669
670////////////////////////////////////////////////////////////////////////////////
671/// Resize this polyline to size n.
672/// If n <= 0 the current arrays of points are deleted.
673/// If n is greater than the current size, the new points are set to (0, 0)
674
676{
677 if (n <= 0) {
678 fN = 0;
679 fLastPoint = -1;
680 delete [] fX;
681 delete [] fY;
682 fX = fY = nullptr;
683 return;
684 }
685 if (n < fN) {
686 fN = n;
687 fLastPoint = n - 1;
688 } else {
689 SetPoint(n-1,0,0);
690 }
691}
692
693////////////////////////////////////////////////////////////////////////////////
694/// Set new values for this polyline (single precision).
695///
696/// If n <= 0 the current arrays of points are deleted.
697
699{
700 if (n <= 0) {
701 fN = 0;
702 fLastPoint = -1;
703 delete [] fX;
704 delete [] fY;
705 fX = fY = nullptr;
706 return;
707 }
708 fN =n;
709 if (fX) delete [] fX;
710 if (fY) delete [] fY;
711 fX = new Double_t[fN];
712 fY = new Double_t[fN];
713 for (Int_t i=0; i<fN;i++) {
714 if (x) fX[i] = (Double_t)x[i];
715 if (y) fY[i] = (Double_t)y[i];
716 }
717 fOption = option;
718 fLastPoint = fN-1;
719}
720
721////////////////////////////////////////////////////////////////////////////////
722/// Set new values for this polyline (double precision).
723///
724/// If n <= 0 the current arrays of points are deleted.
725
727{
728 if (n <= 0) {
729 fN = 0;
730 fLastPoint = -1;
731 delete [] fX;
732 delete [] fY;
733 fX = fY = nullptr;
734 return;
735 }
736 fN =n;
737 if (fX) delete [] fX;
738 if (fY) delete [] fY;
739 fX = new Double_t[fN];
740 fY = new Double_t[fN];
741 for (Int_t i=0; i<fN;i++) {
742 if (x) fX[i] = x[i];
743 if (y) fY[i] = y[i];
744 }
745 fOption = option;
746 fLastPoint = fN-1;
747}
748
749////////////////////////////////////////////////////////////////////////////////
750/// Stream a class object.
751
753{
754 if (b.IsReading()) {
755 UInt_t R__s, R__c;
756 Version_t R__v = b.ReadVersion(&R__s, &R__c);
757 if (R__v > 1) {
758 b.ReadClassBuffer(TPolyLine::Class(), this, R__v, R__s, R__c);
759 return;
760 }
761 //====process old versions before automatic schema evolution
765 b >> fN;
766 fX = new Double_t[fN];
767 fY = new Double_t[fN];
768 Float_t *x = new Float_t[fN];
769 Float_t *y = new Float_t[fN];
770 b.ReadFastArray(x,fN);
771 b.ReadFastArray(y,fN);
772 for (Int_t i=0;i<fN;i++) {
773 fX[i] = x[i];
774 fY[i] = y[i];
775 }
777 b.CheckByteCount(R__s, R__c, TPolyLine::IsA());
778 //====end of old versions
779
780 delete [] x;
781 delete [] y;
782 } else {
783 b.WriteClassBuffer(TPolyLine::Class(),this);
784 }
785}
@ kMouseMotion
Definition: Buttons.h:23
@ kButton1Motion
Definition: Buttons.h:20
@ kButton1Up
Definition: Buttons.h:19
@ kButton1Down
Definition: Buttons.h:17
@ kMove
Definition: GuiTypes.h:374
@ kHand
Definition: GuiTypes.h:374
#define d(i)
Definition: RSha256.hxx:102
short Version_t
Definition: RtypesCore.h:65
const Bool_t kFALSE
Definition: RtypesCore.h:101
float Float_t
Definition: RtypesCore.h:57
double Double_t
Definition: RtypesCore.h:59
const Bool_t kTRUE
Definition: RtypesCore.h:100
const char Option_t
Definition: RtypesCore.h:66
#define ClassImp(name)
Definition: Rtypes.h:375
Option_t Option_t option
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t b
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t np
float xmin
Definition: THbookFile.cxx:95
float ymin
Definition: THbookFile.cxx:95
float xmax
Definition: THbookFile.cxx:95
float ymax
Definition: THbookFile.cxx:95
#define gROOT
Definition: TROOT.h:404
#define gPad
Definition: TVirtualPad.h:288
#define gVirtualX
Definition: TVirtualX.h:338
Fill Area Attributes class.
Definition: TAttFill.h:19
virtual void Streamer(TBuffer &)
void Copy(TAttFill &attfill) const
Copy this fill attributes to a new TAttFill.
Definition: TAttFill.cxx:204
virtual void Modify()
Change current fill area attributes if necessary.
Definition: TAttFill.cxx:213
Style_t fFillStyle
Fill area style.
Definition: TAttFill.h:23
Color_t fFillColor
Fill area color.
Definition: TAttFill.h:22
virtual void SaveFillAttributes(std::ostream &out, const char *name, Int_t coldef=1, Int_t stydef=1001)
Save fill attributes as C++ statement(s) on output stream out.
Definition: TAttFill.cxx:236
Line Attributes class.
Definition: TAttLine.h:18
virtual void Streamer(TBuffer &)
virtual void Modify()
Change current line attributes if necessary.
Definition: TAttLine.cxx:245
void Copy(TAttLine &attline) const
Copy this line attributes to a new TAttLine.
Definition: TAttLine.cxx:175
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:209
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:273
Buffer base class used for serializing objects.
Definition: TBuffer.h:43
Collection abstract base class.
Definition: TCollection.h:65
void Reset()
Definition: TCollection.h:254
Mother of all ROOT objects.
Definition: TObject.h:41
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition: TObject.h:201
virtual void Streamer(TBuffer &)
Stream an object of class TObject.
Definition: TObject.cxx:876
virtual const char * ClassName() const
Returns name of class to which the object belongs.
Definition: TObject.cxx:200
virtual void AppendPad(Option_t *option="")
Append graphics object to current pad.
Definition: TObject.cxx:177
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition: TObject.cxx:768
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
Definition: TObject.cxx:519
virtual void Copy(TObject &object) const
Copy this to obj.
Definition: TObject.cxx:133
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition: TObject.cxx:963
void ResetBit(UInt_t f)
Definition: TObject.h:200
@ kCanDelete
if object in a list can be deleted
Definition: TObject.h:62
Defined by an array on N points in a 2-D space.
Definition: TPolyLine.h:23
TString fOption
options
Definition: TPolyLine.h:30
virtual Int_t Size() const
Definition: TPolyLine.h:71
Int_t fLastPoint
The index of the last filled point.
Definition: TPolyLine.h:27
virtual Int_t Merge(TCollection *list)
Merge polylines in the collection in this polyline.
Definition: TPolyLine.cxx:495
virtual void PaintPolyLineNDC(Int_t n, Double_t *x, Double_t *y, Option_t *option="")
Draw this polyline with new coordinates in NDC.
Definition: TPolyLine.cxx:576
void Copy(TObject &polyline) const override
Copy this polyline to polyline.
Definition: TPolyLine.cxx:157
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
Returns closest distance in pixels from point (px, py) to a polyline.
Definition: TPolyLine.cxx:197
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save primitive as a C++ statement(s) on output stream out.
Definition: TPolyLine.cxx:596
Double_t * GetX() const
Definition: TPolyLine.h:54
void ExecuteEvent(Int_t event, Int_t px, Int_t py) override
Execute action corresponding to one event.
Definition: TPolyLine.cxx:261
virtual void SetPoint(Int_t point, Double_t x, Double_t y)
Set point number n to (x, y) If n is greater than the current size, the arrays are automatically exte...
Definition: TPolyLine.cxx:643
virtual ~TPolyLine()
PolyLine default destructor.
Definition: TPolyLine.cxx:136
TPolyLine()
PolyLine default constructor.
Definition: TPolyLine.cxx:47
TClass * IsA() const override
Definition: TPolyLine.h:73
Double_t * GetY() const
Definition: TPolyLine.h:55
virtual void PaintPolyLine(Int_t n, Double_t *x, Double_t *y, Option_t *option="")
Draw this polyline with new coordinates.
Definition: TPolyLine.cxx:548
void Draw(Option_t *option="") override
Draw this polyline with its current attributes.
Definition: TPolyLine.cxx:231
Double_t * fX
[fN] Array of X coordinates
Definition: TPolyLine.h:28
static TClass * Class()
void Paint(Option_t *option="") override
Paint this polyline with its current attributes.
Definition: TPolyLine.cxx:531
void ls(Option_t *option="") const override
List this polyline with its attributes.
Definition: TPolyLine.cxx:486
TPolyLine & operator=(const TPolyLine &)
assignment operator
Definition: TPolyLine.cxx:126
void Streamer(TBuffer &) override
Stream a class object.
Definition: TPolyLine.cxx:752
virtual TPolyLine * DrawPolyLine(Int_t n, Double_t *x, Double_t *y, Option_t *option="")
Draw this polyline with new coordinates.
Definition: TPolyLine.cxx:239
Int_t fN
Number of points.
Definition: TPolyLine.h:26
Double_t * fY
[fN] Array of Y coordinates
Definition: TPolyLine.h:29
virtual void SetPolyLine(Int_t n)
Resize this polyline to size n.
Definition: TPolyLine.cxx:675
@ kPolyLineNDC
Polyline coordinates are in NDC space.
Definition: TPolyLine.h:37
virtual void SetNDC(Bool_t isNDC=kTRUE)
Set NDC mode on if isNDC = kTRUE, off otherwise.
Definition: TPolyLine.cxx:621
virtual Int_t SetNextPoint(Double_t x, Double_t y)
Set point following LastPoint to x, y.
Definition: TPolyLine.cxx:631
void Print(Option_t *option="") const override
Dump this polyline with its attributes.
Definition: TPolyLine.cxx:588
static void IndentLevel()
Functions used by ls() to indent an object hierarchy.
Definition: TROOT.cxx:2813
const char * Data() const
Definition: TString.h:369
virtual void Streamer(TBuffer &)
Stream a string object.
Definition: TString.cxx:1375
Double_t y[n]
Definition: legend1.C:17
Double_t x[n]
Definition: legend1.C:17
const Int_t n
Definition: legend1.C:16
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Definition: TMathBase.h:250
Bool_t IsInside(T xp, T yp, Int_t np, T *x, T *y)
Function which returns kTRUE if point xp,yp lies inside the polygon defined by the np points in array...
Definition: TMath.h:1231
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Definition: TMathBase.h:198
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
Definition: TMathBase.h:123