202 if(contour<zmin || contour>zmax) {
203 Error(
"GetContourList",
"Contour level (%g) outside the Z scope [%g,%g]",
230 for (i=0;i<
fNdt;i++) {
243 for(it=0; it<
fNdt; it++) {
250 x0 =
fX[p0]; x2 =
fX[p0];
251 y0 =
fY[p0]; y2 =
fY[p0];
252 z0 =
fZ[p0]; z2 =
fZ[p0];
261 if (i0==0 && i2==0) {
262 Error(
"GetContourList",
"wrong vertices ordering");
281 if(contour >= z0 && contour <=z2) {
282 r20 = (contour-z0)/(z2-z0);
283 xs0c = r20*(x2-x0)+x0;
284 ys0c = r20*(y2-y0)+y0;
285 if(contour >= z1 && contour <=z2) {
286 r21 = (contour-z1)/(z2-z1);
287 xs1c = r21*(x2-
x1)+x1;
288 ys1c = r21*(y2-y1)+y1;
290 r10 = (contour-z0)/(z1-z0);
291 xs1c = r10*(x1-x0)+x0;
292 ys1c = r10*(y1-y0)+y0;
295 if(xs0c != xs1c || ys0c != ys1c) {
312 x0 =
fX[p[0]]; x2 =
fX[p[0]];
313 y0 =
fY[p[0]]; y2 =
fY[p[0]];
314 z0 =
fZ[p[0]]; z2 =
fZ[p[0]];
319 if (
fZ[p[1]]<=z0) {z0=
fZ[p[1]]; x0=
fX[p[1]]; y0=
fY[p[1]]; i0=1;}
320 if (
fZ[p[1]]>z2) {z2=
fZ[p[1]]; x2=
fX[p[1]]; y2=
fY[p[1]]; i2=1;}
321 if (
fZ[p[2]]<=z0) {z0=
fZ[p[2]]; x0=
fX[p[2]]; y0=
fY[p[2]]; i0=2;}
322 if (
fZ[p[2]]>z2) {z2=
fZ[p[2]]; x2=
fX[p[2]]; y2=
fY[p[2]]; i2=2;}
323 if (i0==0 && i2==0) {
324 Error(
"GetContourList",
"wrong vertices ordering");
343 if(contour >= z0 && contour <=z2) {
344 r20 = (contour-z0)/(z2-z0);
345 xs0c = r20*(x2-x0)+x0;
346 ys0c = r20*(y2-y0)+y0;
347 if(contour >= z1 && contour <=z2) {
348 r21 = (contour-z1)/(z2-z1);
349 xs1c = r21*(x2-
x1)+x1;
350 ys1c = r21*(y2-y1)+y1;
352 r10 = (contour-z0)/(z1-z0);
353 xs1c = r10*(x1-x0)+x0;
354 ys1c = r10*(y1-y0)+y0;
357 if(xs0c != xs1c || ys0c != ys1c) {
379 for (is=0; is<nbSeg; is++) {
380 if (segUsed[is])
continue;
385 for (js=0; js<nbSeg; js++) {
386 if (is==js)
continue;
387 if (xs0[is]==xs0[js] && ys0[is]==ys0[js]) s0 =
kTRUE;
388 if (xs0[is]==xs1[js] && ys0[is]==ys1[js]) s0 =
kTRUE;
389 if (xs1[is]==xs0[js] && ys1[is]==ys0[js]) s1 =
kTRUE;
390 if (xs1[is]==xs1[js] && ys1[is]==ys1[js]) s1 =
kTRUE;
397 graph->
SetPoint(npg,xs0[is],ys0[is]); npg++;
398 graph->
SetPoint(npg,xs1[is],ys1[is]); npg++;
400 list->
Add(graph); npg = 0;
409 if (s0) {xc = xs0[is]; yc = ys0[is]; xnc = xs1[is]; ync = ys1[is];}
410 if (s1) {xc = xs1[is]; yc = ys1[is]; xnc = xs0[is]; ync = ys0[is];}
411 graph->
SetPoint(npg,xnc,ync); npg++;
416 if (segUsed[js] && js<nbSeg) {
419 }
else if (xc==xs0[js] && yc==ys0[js]) {
423 }
else if (xc==xs1[js] && yc==ys1[js]) {
435 if (js<nbSeg)
goto L01;
436 list->
Add(graph); npg = 0;
443 for (is=0; is<nbSeg; is++) {
444 if (segUsed[is])
continue;
455 if (segUsed[js] && js<nbSeg) {
458 }
else if (xc==xs0[js] && yc==ys0[js]) {
462 }
else if (xc==xs1[js] && yc==ys1[js]) {
474 if (js<nbSeg)
goto L02;
476 graph->
SetPoint(npg,xs0[is],ys0[is]); npg++;
477 list->
Add(graph); npg = 0;
569 for (
Int_t k=0; k<ndiv; k++) {
573 while ((obj =
next())) {
596 Error(
"PaintErrors",
"No TView in current pad");
614 temp1[0] =
fX[it]-
fEX[it];
624 view->
WCtoNDC(temp1, &temp2[0]);
628 temp1[0] =
fX[it]+fEX[it];
631 view->
WCtoNDC(temp1, &temp2[0]);
634 gPad->PaintPolyLine(2,xm,ym);
638 temp1[1] =
fY[it]-
fEY[it];
647 view->
WCtoNDC(temp1, &temp2[0]);
651 temp1[1] =
fY[it]+fEY[it];
654 view->
WCtoNDC(temp1, &temp2[0]);
657 gPad->PaintPolyLine(2,xm,ym);
662 temp1[2] =
fZ[it]-
fEZ[it];
670 view->
WCtoNDC(temp1, &temp2[0]);
674 temp1[2] =
fZ[it]+fEZ[it];
678 view->
WCtoNDC(temp1, &temp2[0]);
681 gPad->PaintPolyLine(2,xm,ym);
698 Int_t i, fillColor, ncolors, theColor0, theColor2;
718 if (zmin==-1111 && zmax==-1111) {
725 Int_t i0=0, i1=0, i2=0;
726 if (
fZ[p[1]]<=z0) {z0=
fZ[p[1]]; x0=x[1]; y0=y[1]; i0=1;}
727 if (
fZ[p[1]]>z2) {z2=
fZ[p[1]]; x2=x[1]; y2=y[1]; i2=1;}
728 if (
fZ[p[2]]<=z0) {z0=
fZ[p[2]]; x0=x[2]; y0=y[2]; i0=2;}
729 if (
fZ[p[2]]>z2) {z2=
fZ[p[2]]; x2=x[2]; y2=y[2]; i2=2;}
735 if (z0>zmax) z0 = zmax;
736 if (z2>zmax) z2 = zmax;
737 if (z0<zmin) z0 = zmin;
738 if (z2<zmin) z2 = zmin;
739 if (z1>zmax) z1 = zmax;
740 if (z1<zmin) z1 = zmin;
759 theColor0 = (
Int_t)( ((z0-zmin)/(zmax-zmin))*(ncolors-1) );
760 theColor2 = (
Int_t)( ((z2-zmin)/(zmax-zmin))*(ncolors-1) );
777 if(theColor0 == theColor2) {
780 gPad->PaintFillArea(3,x,y);
784 for(ci=theColor0; ci<=theColor2; ci++) {
788 zi = (((ci+1)*(zmax-zmin))/(ncolors-1))+zmin;
791 rl = (zi-z0)/(z2-z0);
792 xp[1] = rl*(x2-x0)+x0;
793 yp[1] = rl*(y2-y0)+y0;
794 if (zi>=z1 || z0==z1) {
795 rs = (zi-z1)/(z2-z1);
796 xp[2] = rs*(x2-
x1)+x1;
797 yp[2] = rs*(y2-y1)+y1;
802 rs = (zi-z0)/(z1-z0);
803 xp[2] = rs*(x1-x0)+x0;
804 yp[2] = rs*(y1-y0)+y0;
807 }
else if (ci==theColor2) {
812 if (zi<z1 || z2==z1) {
822 zi = (((ci+1)*(zmax-zmin))/(ncolors-1))+zmin;
825 rl = (zi-z0)/(z2-z0);
826 xp[1] = rl*(x2-x0)+x0;
827 yp[1] = rl*(y2-y0)+y0;
828 if ( zi>=z1 && zip<=z1) {
840 rs = (zi-z0)/(z1-z0);
841 xp[2] = rs*(x1-x0)+x0;
842 yp[2] = rs*(y1-y0)+y0;
844 rs = (zi-z1)/(z2-z1);
845 xp[2] = rs*(x2-
x1)+x1;
846 yp[2] = rs*(y2-y1)+y1;
851 gPad->PaintFillArea(npf,xp,yp);
861 for(i=0; i<nblev; i++){
863 if(zl >= z0 && zl <=z2) {
867 xl[0]=r20*(x2-x0)+x0;
868 yl[0]=r20*(y2-y0)+y0;
869 if(zl >= z1 && zl <=z2) {
870 xl[1]=r21*(x2-
x1)+x1;
871 yl[1]=r21*(y2-y1)+y1;
873 xl[1]=r10*(x1-x0)+x0;
874 yl[1]=r10*(y1-y0)+y0;
876 gPad->PaintPolyLine(2,xl,yl);
894 Error(
"PaintPolyMarker",
"No TView in current pad");
926 if(
fZ[it] < hzmin ||
fZ[it] > hzmax)
continue;
937 view->
WCtoNDC(temp1, &temp2[0]);
947 for (it=0; it<npd; it++) {
948 theColor = (
Int_t)( ((zm[it]-hzmin)/(hzmax-hzmin))*(ncolors-1) );
951 gPad->PaintPolyMarker(1,&xm[it],&ym[it]);
959 gPad->PaintPolyMarker(npd,xm,ym);
976 Error(
"PaintPolyLine",
"No TView in current pad");
999 view->
WCtoNDC(temp1, &temp2[0]);
1007 gPad->PaintPolyLine(npd,xm,ym);
1021 for (
Int_t i=0; i<
n; i++) {
1025 gPad->PaintPolyMarker(1,&x[i],&y[i]);
1029 gPad->PaintPolyMarker(1,&x[i],&y[i]);
1055 Error(
"PaintTriangles",
"No TView in current pad");
1071 if (!tri1 && !tri2 && !wire) {
1074 Double_t binLow = 0, binHigh = 0, binWidth = 0;
1079 if (!r0 || !r1)
return;
1083 binLow, binHigh, nbins, binWidth,
" ");
1088 binWidth = (binHigh-binLow)/nbins;
1093 for (
Int_t i = 0; i < nblev; ++i) glev[i] = binLow+i*binWidth;
1117 for (it=0; it<
fNdt; it++) {
1123 if ((cp >= 0) && (sp >= 0.)) {
1125 }
else if ((cp <= 0) && (sp >= 0.)) {
1128 }
else if ((cp <= 0) && (sp <= 0.)) {
1145 for (it=0; it<
fNdt; it++) {
1149 for (
Int_t k=0; k<3; k++) {
1152 temp1[0] =
fX[t[k]-1];
1153 temp1[1] =
fY[t[k]-1];
1154 temp1[2] =
fZ[t[k]-1];
1162 view->
WCtoNDC(temp1, &temp2[0]);
1169 if (!tri1 && !tri2 && !wire) {
1170 gPad->PaintFillArea(3,x,y);
1173 if (!tri2)
gPad->PaintPolyLine(4,x,y);
1182 gPad->PaintPolyMarker(3,x,y);
1194 if (glev)
delete [] glev;
1209 Error(
"PaintTriangles",
"No TView in current pad");
1225 if (!tri1 && !tri2 && !wire) {
1228 Double_t binLow = 0, binHigh = 0, binWidth = 0;
1233 if (!r0 || !r1)
return;
1237 binLow, binHigh, nbins, binWidth,
" ");
1242 binWidth = (binHigh-binLow)/nbins;
1247 for (
Int_t i = 0; i < nblev; ++i) glev[i] = binLow+i*binWidth;
1268 std::function<Double_t(Double_t, Double_t)> fDist;
1270 if ((cp >= 0) && (sp >= 0.)) {
1272 }
else if ((cp <= 0) && (sp >= 0.)) {
1275 }
else if ((cp <= 0) && (sp <= 0.)) {
1282 typedef std::pair<Double_t, TGraphDelaunay2D::Triangles::const_iterator> DistEntry;
1283 std::vector<DistEntry>
dist;
1286 Double_t xd = (face.x[0] + face.x[1] + face.x[2]) / 3;
1287 Double_t yd = (face.y[0] + face.y[1] + face.y[2]) / 3;
1289 dist.emplace_back(fDist(xd, yd), it);
1292 std::sort(dist.begin(), dist.end(),
1293 [&](
const DistEntry &
a,
const DistEntry & b){
return !reverse ? (a.first < b.first) : (b.first < a .first); });
1303 for (
const auto & it : dist) {
1304 p[0] = it.second->idx[0];
1305 p[1] = it.second->idx[1];
1306 p[2] = it.second->idx[2];
1307 for (
Int_t k=0; k<3; k++) {
1310 temp1[0] =
fX[p[k]];
1311 temp1[1] =
fY[p[k]];
1312 temp1[2] =
fZ[p[k]];
1320 view->
WCtoNDC(temp1, &temp2[0]);
1327 if (!tri1 && !tri2 && !wire) {
1328 gPad->PaintFillArea(3,x,y);
1331 if (!tri2)
gPad->PaintPolyLine(4,x,y);
1340 gPad->PaintPolyMarker(3,x,y);
1351 if (glev)
delete [] glev;
Int_t GetFirst() const
Return first bin on the axis i.e.
virtual Style_t GetLineStyle() const
virtual Style_t GetFillStyle() const
virtual void SetLineWidth(Width_t lwidth)
double dist(Rotation3D const &r1, Rotation3D const &r2)
Int_t * fPTried
Equal to fDelaunay->fNdt.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
ClassImp(TSeqCollection) Int_t TSeqCollection TIter next(this)
Return index of object in collection.
Histogram option structure.
virtual void WCtoNDC(const Float_t *pw, Float_t *pn)=0
virtual Double_t * GetRmax()=0
virtual void SetContour(Int_t nlevels, const Double_t *levels=0)
Set the number and values of contour levels.
R__EXTERN TStyle * gStyle
int Logy
log scale in Y. Also set by histogram option
Double_t GetZmin() const
Returns the Z minimum.
static void Optimize(Double_t A1, Double_t A2, Int_t nold, Double_t &BinLow, Double_t &BinHigh, Int_t &nbins, Double_t &BWID, Option_t *option="")
static function to compute reasonable axis limits
Int_t GetNumberContours() const
void PaintPolyLine(Option_t *option)
Paints the 2D graph as PaintPolyLine.
virtual Double_t * GetEY() const
virtual Double_t GetBinLowEdge(Int_t bin) const
Return low edge of bin.
virtual Double_t * GetEX() const
Double_t fXNmax
Equal to fDelaunay->fXNmin.
void PaintPolyMarker0(Int_t n, Double_t *x, Double_t *y)
Paints a circle at each vertex. Each circle background is white.
Double_t GetYNmax() const
Double_t GetYNmax() const
void PaintLevels(Int_t *v, Double_t *x, Double_t *y, Int_t nblev=0, Double_t *glev=0)
Paints one triangle.
R__EXTERN Hoption_t Hoption
Double_t GetXNmin() const
Short_t Min(Short_t a, Short_t b)
void ToLower()
Change string to lower-case.
Double_t GetMinimum() const
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width.
virtual void SetFillStyle(Style_t fstyle)
void Paint(Option_t *option)
Paint a TGraphDelaunay according to the value of "option":
int Logx
log scale in X. Also set by histogram option
Double_t GetXNmax() const
TGraphDelaunay2D * fDelaunay2D
virtual Int_t GetContour(Double_t *levels=0)
Return contour values into array levels if pointer levels is non zero.
static const double x2[5]
void PaintTriangles_new(Option_t *option)
virtual void Paint(Option_t *chopt="")
Draw this graph with its current attributes.
Double_t * fXN
Pointer to fGraph2D->fZ.
Int_t fNdt
Equal to fGraph2D->fNpoints.
Double_t * fY
Pointer to fGraph2D->fX.
Double_t * fYN
Pointer to fDelaunay->fXN.
Double_t Log10(Double_t x)
static double p2(double t, double a, double b, double c)
Double_t GetZmax() const
Returns the Z maximum.
virtual void SetMarkerColor(Color_t mcolor=1)
Triangles::const_iterator end() const
Int_t GetNumberOfColors() const
Return number of colors in the color palette.
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)
Double_t * fZ
Pointer to fGraph2D->fY.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Int_t * GetMTried() const
Triangles::const_iterator begin() const
virtual Double_t * GetEZ() const
Double_t GetXNmax() const
virtual void SetLineColor(Color_t lcolor)
Double_t fYmax
fGraph2D->fHistogram limits
virtual Size_t GetMarkerSize() const
Class to manage histogram axis.
virtual void SetFillColor(Color_t fcolor)
virtual Double_t GetBinUpEdge(Int_t bin) const
Return up edge of bin.
unsigned int r1[N_CITIES]
virtual Color_t GetFillColor() const
void PaintTriangles(Option_t *option)
Paints the 2D graph as triangles.
Bool_t TestBit(UInt_t f) const
Int_t * GetPTried() const
Double_t fXNmin
Pointer to fGraph2D->fZE.
virtual void SetMarkerStyle(Style_t mstyle=1)
static double p1(double t, double a, double b)
void FindTriangles()
Find triangles in fDelaunay and initialise the TGraph2DPainter values needed to paint triangles or fi...
virtual Color_t GetLineColor() const
virtual void SetMarkerSize(Size_t msize=1)
virtual Double_t * GetRmin()=0
virtual Double_t GetLongitude()=0
Int_t GetColorPalette(Int_t i) const
Return color number i in current palette.
void PaintErrors(Option_t *option)
Paints the 2D graph as error bars.
Int_t * fNTried
Pointer to fDelaunay->fPTried.
static const double x1[5]
Double_t fYNmin
Equal to fDelaunay->fXNmax.
Double_t fYNmax
Equal to fDelaunay->fYNmin.
Double_t * fEX
Pointer to fDelaunay->fYN.
void PaintContour(Option_t *option)
Paints the 2D graph as a contour plot.
TGraphDelaunay * fDelaunay
Pointer to fDelaunay->fMTried.
virtual Int_t GetNdivisions() const
TGraphDelaunay2D generates a Delaunay triangulation of a TGraph2D.
TList * GetContourList(Double_t contour)
Returns the X and Y graphs building a contour.
virtual void SetLineStyle(Style_t lstyle)
TGraph2D * GetGraph2D() const
Int_t GetLast() const
Return last bin on the axis i.e.
Mother of all ROOT objects.
TGraph2D * GetGraph2D() const
virtual Color_t GetMarkerColor() const
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Set x and y values for point number i.
Int_t * fMTried
Pointer to fDelaunay->fNTried.
virtual Int_t FindFixBin(Double_t x) const
Find bin number corresponding to abscissa x.
Double_t * fEY
Pointer to fGraph2D->fXE.
virtual void Add(TObject *obj)
void PaintTriangles_old(Option_t *option)
Short_t Max(Short_t a, Short_t b)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
A Graph is a graphics object made of two arrays X and Y with npoints each.
void PaintPolyMarker(Option_t *option)
Paints the 2D graph as PaintPolyMarker.
Double_t GetYNmin() const
R__EXTERN TH1 * gCurrentHist
Double_t * fEZ
Pointer to fGraph2D->fYE.
The TGraphDelaunay painting class.
Double_t GetXNmin() const
void FindAllTriangles()
Attempt to find all the Delaunay triangles of the point set.
virtual Style_t GetMarkerStyle() const
virtual Double_t GetMaximum(Double_t maxval=FLT_MAX) const
Return maximum value smaller than maxval of bins in the range, unless the value has been overridden b...
virtual Width_t GetLineWidth() const
Double_t GetMaximum() const
virtual Double_t GetMinimum(Double_t minval=-FLT_MAX) const
Return minimum value larger than minval of bins in the range, unless the value has been overridden by...
virtual Double_t GetContourLevelPad(Int_t level) const
Return the value of contour number "level" in Pad coordinates ie: if the Pad is in log scale along Z ...
int Logz
log scale in Z. Also set by histogram option
TGraphDelaunay generates a Delaunay triangulation of a TGraph2D.
Double_t GetYNmin() const
Int_t * GetNTried() const
Double_t fXmin
Equal to fDelaunay->fYNmax.
virtual ~TGraph2DPainter()
TGraph2DPainter destructor.