GammaWare  Head Version for release 0.9
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Link.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (C) 2004 by Olivier Stezowski *
3  * stezow(AT)ipnl.in2p3.fr *
4  * *
5  * This program is free software; you can redistribute it and/or modify *
6  * it under the terms of the GNU General Public License as published by *
7  * the Free Software Foundation; either version 2 of the License, or *
8  * (at your option) any later version. *
9  * *
10  * This program is distributed in the hope that it will be useful, *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13  * GNU General Public License for more details. *
14  * *
15  * You should have received a copy of the GNU General Public License *
16  * along with this program; if not, write to the *
17  * Free Software Foundation, Inc., *
18  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19  ***************************************************************************/
20 
23 // A link is basically a TPolyLine with 8 points :
24 //
25 // 0=8 1 2
26 // | | |
27 // *********
28 // * *
29 // * *
30 // * *
31 // 6 7 * * 3 4
32 // | \* */ |
33 // ****** ******
34 // * *
35 // * *
36 // * *
37 // * *
38 // * *
39 // * *
40 // * 5 *
41 // *|*
42 // *
43 
44 
45 
46 #ifndef Gw_Link
47 #include "Link.h"
48 #endif
49 
50 #ifndef ROOT_TROOT_H
51 #include "TROOT.h"
52 #endif
53 
54 #ifndef ROOT_TVirtualPad_H
55 #include "TVirtualPad.h"
56 #endif
57 
58 #include "TFrame.h"
59 
60 #include "math.h"
61 #include "TAttFill.h"
62 
63 using namespace Gw;
64 
65  Color_t Link::fgDefaultColor = 1;
66  Bool_t Link::fgMovable = false;
67 const Short_t Link::fgkMaxLinkLabel = 3;
68  Float_t Link::fgDefaultLabelSize = 0.03;
69  Color_t Link::fgDefaultLabelColor = 1;
70 //__________________________________________________________
72  : TPolyLine(),
73  fVisLabel("000"),
74  fLabel0(),
75  fLabel1(),
76  fLabel2(),
77  fBox1(),
78  fArrowStyle(1),
79  fLog("Link"),
80  fInitial(0x0),
81  fFinal(0x0),
82  fIsSelected(false),
83  fIsVisible(true),
84  fIsModified(false),
85  fStrength(),
86  fTau(),
87  fIsAmbiguous(false)
88 {
89  SetFillColor(fgDefaultColor); SetLineColor(fgDefaultColor); SetOption("F");
90 
91  fLabel0.SetX(0); fLabel0.SetY(0); fLabel0.SetTextAlign(32); fLabel0.SetBit(TObject::kCannotPick);
92  fLabel1.SetX(0); fLabel1.SetY(0); fLabel1.SetTextAlign(22); fLabel1.SetBit(TObject::kCannotPick);
93  fLabel2.SetX(0); fLabel2.SetY(0); fLabel2.SetTextAlign(12); fLabel2.SetBit(TObject::kCannotPick);
94  fBox1.SetFillColor(0); fBox1.SetLineColor(0);
95 }
96 
97 //__________________________________________________________
98 Link::Link(const Link &link)
99  : TPolyLine(link),
100  fArrowStyle(link.fArrowStyle),
101  fLog("Link"),
102  fInitial(link.fInitial),
103  fFinal(link.fFinal),
104  fIsSelected(link.fIsSelected),
105  fStrength(link.fStrength),
106  fTau(link.fTau)
107 {
108 }
109 
110 //__________________________________________________________
111 Link& Link::operator=(const Link &link)
112 {
113  if (this == &link) return *this;
114 
115  fInitial = link.fInitial;
116  fFinal = link.fFinal;
117  fIsSelected = link.fIsSelected;
118  fStrength = link.fStrength;
119  fTau = link.fTau;
120 
121 
122  return *this;
123 }
124 
125 //__________________________________________________________
127 {
128 }
129 
130 //__________________________________________________________
132 {
133  fLabel0.SetTextSize(size);
134  fLabel1.SetTextSize(size);
135  fLabel2.SetTextSize(size);
136 }
137 
138 //__________________________________________________________
139 void Link::SetLabelsColor(Color_t color)
140 {
141  fLabel0.SetTextColor(color);
142  fLabel1.SetTextColor(color);
143  fLabel2.SetTextColor(color);
144 }
145 
146 //__________________________________________________________
147 void Link::SetVisLabel(const char *s)
148 {
149  TString st = s; Short_t end = (st.Length() < fgkMaxLinkLabel) ? st.Length(): fgkMaxLinkLabel;
150 
151  for( Short_t i = 0; i < end; i++ ) {
152  if ( st[i] == '0' ) {
153  fVisLabel[i] = '0';
154  }
155  else {
156  fVisLabel[i] = '1';
157  }
158  }
159 }
160 
161 
162 //__________________________________________________________
163 void Link::SetLabel(const char *label, Int_t which)
164 {
165  if (which < 0 || which >= fgkMaxLinkLabel) return;
166  switch (which) {
167  case 0:
168  fLabel0.SetText(fLabel0.GetX(),fLabel0.GetY(),label);
169  break;
170  case 1:
171  fLabel1.SetText(fLabel1.GetX(),fLabel1.GetY(),label);
172  break;
173  case 2:
174  fLabel2.SetText(fLabel2.GetX(),fLabel2.GetY(),label);
175  break;
176  }
177 }
178 
179 //__________________________________________________________
180 void Link::SetLabels(const char *l0, const char *l1, const char *l2)
181 {
182  fLabel0.SetText(fLabel0.GetX(),fLabel0.GetY(),l0);
183  fLabel1.SetText(fLabel1.GetX(),fLabel1.GetY(),l1);
184  fLabel2.SetText(fLabel2.GetX(),fLabel2.GetY(),l2);
185 }
186 
187 //__________________________________________________________
189 {
193 }
194 
195 //__________________________________________________________
196 TLatex& Link::GetLabel(Int_t which)
197 {
198  if ( which <= 0 ) return fLabel0;
199 
200  if ( which == 1 ) return fLabel1;
201 
202  return fLabel2;
203 }
204 
205 
206 //__________________________________________________________
208 {
209  if ( Link::GetIL() && Link::GetFL() ) {
210  if (GetIL()->HasExtraLine())
211  SetPoints((GetFL()->GetX1()+GetFL()->GetX2())/2.0,
212  (GetFL()->GetX1()+GetFL()->GetX2())/2.0 );
213 
214  else if (GetFL()->HasExtraLine())
215  SetPoints((GetIL()->GetX1()+GetIL()->GetX2())/2.0,
216  (GetIL()->GetX1()+GetIL()->GetX2())/2.0 );
217  else
218  SetPoints((GetIL()->GetX1()+GetIL()->GetX2())/2.0,
219  (GetFL()->GetX1()+GetFL()->GetX2())/2.0 );
220  }
221 }
222 
223 //__________________________________________________________
224 void Link::SetPoints(Double_t xi, Double_t xf)
225 {
226 
227  if(fArrowStyle == 0)
228  SetBasicStylePoints(xi,xf);
229  if(fArrowStyle == 1)
230  SetAdvancedStylePoints(xi,xf);
231 }
232 
233 void Link::SetBasicStylePoints(Double_t xi, Double_t xf)
234 {
235  Double_t x = 0, y = 0;
236  Double_t offset1, offset2, prop, height, offset3;
237 
238  prop = 3.0/4.0;
239 
240 // offset1 = TMath::Max(TMath::Abs(GetIL()->GetX2() - GetIL()->GetX1())/100.,
241 // GetStrength().Get()/2.0 );
242 
243  offset1 = GetStrength().Get()/2.0;
244 
245  offset2 = TMath::Min(2.5*offset1,TMath::Abs(GetIL()->GetX2() - GetIL()->GetX1())/2.);
246 
247  offset3 = TMath::Abs(GetIL()->GetX2() - GetIL()->GetX1())*0.25;
248 
249  height = GetFL()->GetY1() + TMath::Abs(GetIL()->GetY1() - GetFL()->GetY1())*(0.6);
250 
251 
252  if ( Link::GetIL() && Link::GetFL() ) {
253 
254  x = xi; y = GetIL()->GetY1();
255  SetPoint(0,x-offset1,y);
256  SetPoint(1,x,y);
257  SetPoint(2,x+offset1,y);
258  SetPoint(8,x-offset1,y);
259 
260  x = xi + prop*(xf-xi); y = GetIL()->GetY1() - prop*(GetIL()->GetY1()-GetFL()->GetY1());
261  SetPoint(3,x+offset1,y);
262  SetPoint(4,x+offset2,y);
263  SetPoint(6,x-offset2,y);
264  SetPoint(7,x-offset1,y);
265 
266  x = xf; y = GetFL()->GetY1();
267  SetPoint(5,x,y);
268  }
269 
270  for (Int_t i = 0; i < fgkMaxLinkLabel; ++i) {
271  GetLabel(i).SetY(height);
272  }
273 
274  GetLabel(0).SetX(GetX()[1] - offset3);
275  GetLabel(1).SetX(GetX()[1]);
276  GetLabel(2).SetX(GetX()[1] + offset3);
277 }
278 
279 using namespace std;
280 
281 void Link::SetAdvancedStylePoints(Double_t xi, Double_t xf)
282 {
283  // A link is basically a TPolyLine with 8 points :
284  //
285  // P1 xi P2
286  // | | |
287  // yi *********
288  // * *
289  // * *
290  // * *
291  // P3 P4 * * P5 P6
292  // | \* */ |
293  // ****** ******
294  // * *
295  // * *
296  // * *
297  // * *
298  // * *
299  // * *
300  // * *
301  // * *
302  // yf *
303  // xf
304 
305 
306  if(TMath::Abs(xi-xf) < 5)
307  xf=xi;
308 
310 
311  Float_t PadWidth = gPad->GetWw();
312  Float_t PadHeight = gPad->GetWh();
313  Float_t XWidth = gPad->GetX2()-gPad->GetX1();
314  Float_t YWidth = gPad->GetY2()-gPad->GetY1();
315 
316  Float_t MetricFact = YWidth*PadWidth/(PadHeight*XWidth);
317 
318  xi = MetricFact*xi;
319  xf = MetricFact*xf;
320 
321  Double_t yi = GetIL()->GetY1();
322  Double_t yf = GetFL()->GetY1();
323 
324  Double_t ad = (yf-yi)/(xf-xi);
325  if(TMath::Abs(xf-xi)<1e-10)
326  ad = 1e12;
327 
328  Double_t bd = yi-ad*xi;
329 
330  Float_t StrenghtFact = 1./100*XWidth*0.02;
331  Float_t ArrowFact = XWidth*0.05;
332 
333  //equation droite reliant xi a xf : yd = ad*x + bd
334 
335  Double_t b1 = bd - GetStrength().Get()*StrenghtFact*MetricFact * sqrt(ad*ad + 1); // yd1 = ad*x+b1
336  Double_t b2 = bd + GetStrength().Get()*StrenghtFact*MetricFact * sqrt(ad*ad + 1); // yd2 = ad*x+b2
337 
338  Double_t x_p1 = (yi-b1)/ad;
339 
340  Double_t x_p2 = (yi-b2)/ad;
341 
342 
343  Float_t ArrowPosFactor = 0.8;
344 
345  Double_t Proj_x = xi + ArrowPosFactor*(xf-xi);
346  Double_t Proj_y = yi + ArrowPosFactor*(yf-yi);
347 
348  Double_t ap0 = -1./ad;
349  Double_t bp0 = Proj_y - ap0*Proj_x; //ydp = ap0*x + bp0
350 
351  Double_t xp4 = (bp0-b1)/(ad-ap0);
352  Double_t yp4 = ad*xp4+b1;
353 
354  Double_t xp5 = (bp0-b2)/(ad-ap0);
355  Double_t yp5 = ad*xp5+b2;
356 
357  if(ad >=1e12)
358  {
359  yp4 = Proj_y;
360  yp5 = Proj_y;
361  }
362 
363  Double_t xp3 = xp4 + ArrowFact*(xp4-Proj_x)*1./(sqrt((Proj_x-xp4)*(Proj_x-xp4)+(Proj_y-yp4)*(Proj_y-yp4)));
364  Double_t yp3 = yp4 + ArrowFact*(yp4-Proj_y)*1./(sqrt((Proj_x-xp4)*(Proj_x-xp4)+(Proj_y-yp4)*(Proj_y-yp4)));
365 
366 
367  Double_t xp6 = xp5 + ArrowFact*(xp5-Proj_x)*1./(sqrt((Proj_x-xp5)*(Proj_x-xp5)+(Proj_y-yp5)*(Proj_y-yp5)));
368  Double_t yp6 = yp5 + ArrowFact*(yp5-Proj_y)*1./(sqrt((Proj_x-xp5)*(Proj_x-xp5)+(Proj_y-yp5)*(Proj_y-yp5)));
369 
370  Double_t height = GetFL()->GetY1() + TMath::Abs(GetIL()->GetY1() - GetFL()->GetY1())*(0.6);
371 
372  if ( Link::GetIL() && Link::GetFL() ) {
373 
374  SetPoint(0,x_p1/MetricFact,yi);
375  SetPoint(1,xi/MetricFact,yi);
376  SetPoint(2,x_p2/MetricFact,yi);
377  SetPoint(3,xp5/MetricFact,yp5);
378  SetPoint(4,xp6/MetricFact,yp6);
379  SetPoint(5,xf/MetricFact,yf);
380  SetPoint(6,xp3/MetricFact,yp3);
381  SetPoint(7,xp4/MetricFact,yp4);
382  SetPoint(8,x_p1/MetricFact,yi);
383  }
384 
385  for (Int_t i = 0; i < fgkMaxLinkLabel; ++i) {
386  GetLabel(i).SetY(height);
387  }
388 
389  GetLabel(0).SetX(xi/MetricFact+(xf/MetricFact-xi/MetricFact)/2. - GetStrength().Get());
390  GetLabel(1).SetX(xi/MetricFact+(xf/MetricFact-xi/MetricFact)/2.);
391  GetLabel(2).SetX(xi/MetricFact+(xf/MetricFact-xi/MetricFact)/2. + GetStrength().Get());
392 
393 
394 // GetLabel(0).SetX(GetX()[1] - TMath::Abs(GetIL()->GetX2() - GetIL()->GetX1())*0.25);
395 // GetLabel(1).SetX(GetX()[1]);
396 // GetLabel(2).SetX(GetX()[1] + TMath::Abs(GetIL()->GetX2() - GetIL()->GetX1())*0.25);
397 
398 }
399 
400 //_____________________________________________________________________________
401 Int_t Link::Compare(const TObject* obj) const
402 {
403  const Link* link = static_cast<const Link*>(obj);
404 
405  if ( GetIL()->GetY1() > link->GetIL()->GetY1() ) {
406  return 1;
407  } else if ( GetIL()->GetY1() < link->GetIL()->GetY1() ) {
408  return -1;
409  } else {
410  return 0;
411  }
412 }
413 
414 //__________________________________________________________
416 {
417  Double_t y = 0;
418  Double_t prop, height;
419 
420  prop = 3.0/4.0;
421  height = GetFL()->GetY1() + TMath::Abs(GetIL()->GetY1() - GetFL()->GetY1())*(0.6);
422 
423  if ( Link::GetIL() && Link::GetFL() ) {
424 
425  y = GetIL()->GetY1();
426  SetPoint(0,GetX()[0],y);
427  SetPoint(1,GetX()[1],y);
428  SetPoint(2,GetX()[2],y);
429  SetPoint(8,GetX()[8],y);
430 
431  y = GetIL()->GetY1() - prop*(GetIL()->GetY1()-GetFL()->GetY1());
432  SetPoint(3,GetX()[3],y);
433  SetPoint(4,GetX()[4],y);
434  SetPoint(6,GetX()[6],y);
435  SetPoint(7,GetX()[7],y);
436 
437  y = GetFL()->GetY1();
438  SetPoint(5,GetX()[5],y);
439  }
440 
441  for (Int_t i = 0; i < fgkMaxLinkLabel; ++i) {
442  GetLabel(i).SetY(height);
443  }
444 }
445 
446 //__________________________________________________________
447 void Link::Paint(Option_t* option)
448 {
449  if ( !IsVisible() ) return;
450 
451  TPolyLine::Paint(option);
452 
453  if ( fVisLabel[0] == '1' ) {
454  GetLabel(0).Paint(option);
455  }
456  if ( fVisLabel[1] == '1' ) {
457  fBox1.SetX1(fLabel1.GetX() - fLabel1.GetXsize()/2.6);
458  fBox1.SetX2(fLabel1.GetX() + fLabel1.GetXsize()/2.5);
459  fBox1.SetY1(fLabel1.GetY() - fLabel1.GetYsize()/1.6);
460  fBox1.SetY2(fLabel1.GetY() + fLabel1.GetYsize()/2.0);
461  fBox1.Paint(option);
462  GetLabel(1).Paint(option);
463  }
464  if ( fVisLabel[2] == '1' ) {
465  GetLabel(2).Paint(option);
466  }
467 
468 }
469 
470 
471 //__________________________________________________________
472 void Link::Draw(Option_t* option)
473 {
474  if ( !IsVisible() ) return;
475 
476  TPolyLine::Draw(option);
477 
478  if ( fVisLabel[0] == '1' ) {
479  GetLabel(0).Draw(option);
480  }
481  if ( fVisLabel[1] == '1' ) {
482  fBox1.Draw(option);
483  GetLabel(1).Draw(option);
484  }
485  if ( fVisLabel[2] == '1' ) {
486  GetLabel(2).Draw(option);
487  }
488 
489 }
490 
491 //____________________________________________________________________________________________
492 void Link::ExecuteEvent(Int_t event, Int_t px, Int_t py)
493 {
494  // Execute action corresponding to one event.
495  //
496  // This member function is called when a polyline is clicked with the locator
497  //
498  // If Left button clicked on one of the line end points, this point
499  // follows the cursor until button is released.
500  //
501  // if Middle button clicked, the line is moved parallel to itself
502  // until the button is released.
503 
504  if ( !IsMovable() ) return;
505 
506  Int_t i, d;
507  Double_t xmin, xmax, ymin, ymax, /*dx, dy,*/ dxr, dyr;
508  const Int_t kMaxDiff = 30;
509  static Bool_t middle;
510  static Int_t ipoint, pxp, pyp;
511  static Int_t px1,px2/*,py1,py2*/;
512  static Int_t pxold;//, pyold, px1old, py1old, px2old, py2old;
513  static Int_t dpx, dpy;
514  static Int_t *x=0, *y=0;
515  static Double_t a=0.0,b=0.0;
516  static Int_t xprime=0,t1=0,t2=0;
517 
518  if (!gPad->IsEditable()) return;
519 
520  Int_t np = Size();
521 
522  Double_t vx0 = fLabel0.GetX() - fLabel1.GetX();
523  Double_t vx1 = 0.;
524  Double_t vx2 = fLabel2.GetX() - fLabel1.GetX();
525  Double_t vy = fLabel2.GetY() - GetY()[5];
526 
527  switch (event) {
528 
529  case kButton1Down:
530  gVirtualX->SetLineColor(-1);
531  TAttLine::Modify(); //Change line attributes only if necessary
532  px1 = gPad->XtoAbsPixel(gPad->GetX1());
533 // py1 = gPad->YtoAbsPixel(gPad->GetY1());
534  px2 = gPad->XtoAbsPixel(gPad->GetX2());
535 // py2 = gPad->YtoAbsPixel(gPad->GetY2());
536  ipoint = -1;
537 
538 
539  if (x || y) break;
540  x = new Int_t[np+1];
541  y = new Int_t[np+1];
542  for (i=0;i<np;i++) {
543  pxp = gPad->XtoAbsPixel(gPad->XtoPad(fX[i]));
544  pyp = gPad->YtoAbsPixel(gPad->YtoPad(fY[i]));
545  x[i] = pxp;
546  y[i] = pyp;
547  d = TMath::Abs(pxp-px) + TMath::Abs(pyp-py);
548  if ( (d < kMaxDiff) && ((i==1) || (i==5))) {
549  gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
550  gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
551  gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
552  gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
553  ipoint =i;
554  }
555  }
556  dpx = 0;
557  dpy = 0;
558  pxold = px;
559 // pyold = py;
560  if (ipoint < 0) return;
561 // if (ipoint == 0) {
562 // px1old = 0;
563 // py1old = 0;
564 // px2old = gPad->XtoAbsPixel(fX[1]);
565 // py2old = gPad->YtoAbsPixel(fY[1]);
566 // } else if (ipoint == fN-1) {
567 // px1old = gPad->XtoAbsPixel(gPad->XtoPad(fX[fN-2]));
568 // py1old = gPad->YtoAbsPixel(gPad->YtoPad(fY[fN-2]));
569 // px2old = 0;
570 // py2old = 0;
571 // } else {
572 // px1old = gPad->XtoAbsPixel(gPad->XtoPad(fX[ipoint-1]));
573 // py1old = gPad->YtoAbsPixel(gPad->YtoPad(fY[ipoint-1]));
574 // px2old = gPad->XtoAbsPixel(gPad->XtoPad(fX[ipoint+1]));
575 // py2old = gPad->YtoAbsPixel(gPad->YtoPad(fY[ipoint+1]));
576 // }
577  pxold = gPad->XtoAbsPixel(gPad->XtoPad(fX[ipoint]));
578 // pyold = gPad->YtoAbsPixel(gPad->YtoPad(fY[ipoint]));
579 
580  break;
581 
582 
583  case kMouseMotion:
584 
585  middle = kTRUE;
586  for (i=0;i<np;i++) {
587  pxp = gPad->XtoAbsPixel(gPad->XtoPad(fX[i]));
588  pyp = gPad->YtoAbsPixel(gPad->YtoPad(fY[i]));
589  d = TMath::Abs(pxp-px) + TMath::Abs(pyp-py);
590  if ( (d < kMaxDiff) && ((i==1) || (i==5))) middle = kFALSE;
591  }
592 
593 
594  // check if point is close to an axis
595  if (middle) gPad->SetCursor(kMove);
596  else gPad->SetCursor(kHand);
597  break;
598 
599  case kButton1Motion:
600  if (middle) {
601  for(i=0;i<np-1;i++) {
602  gVirtualX->DrawLine(x[i]+dpx, y[i]+dpy, x[i+1]+dpx, y[i+1]+dpy);
603  pxp = x[i]+dpx;
604  pyp = y[i];
605  gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
606  gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
607  gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
608  gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
609  }
610  pxp = x[np-1]+dpx;
611  pyp = y[np-1];
612  gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
613  gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
614  gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
615  gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
616  dpx += px - pxold;
617  //dpy += py - pyold;
618  pxold = px;
619 // pyold = py;
620  for(i=0;i<np-1;i++) {
621  gVirtualX->DrawLine(x[i]+dpx, y[i]+dpy, x[i+1]+dpx, y[i+1]+dpy);
622  pxp = x[i]+dpx;
623  pyp = y[i];
624  gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
625  gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
626  gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
627  gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
628  }
629  pxp = x[np-1]+dpx;
630  pyp = y[np-1];
631  gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
632  gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
633  gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
634  gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
635  } else {
636  if (ipoint==1) {
637  if ((x[5]-x[1]-dpx != 0) && (y[5]-y[1] != 0)) {
638  a = (y[5]-y[1])/((x[5]-x[1]-dpx)*1.0);
639  b = y[5] - a * x[5];
640  xprime = (Int_t)((y[3] - b) / a);
641  } else {
642  xprime = x[5];
643  }
644  t1 = (x[3] - x[7]) / 2;
645  t2 = (x[4] - x[6]) / 2;
646  //printf("x1 = %d; x5 = %d, dpx = %d xprime = %f, t1 = %d, t2=%d, y1=%d , y5=%d , y3=%d, a=%f, b=%f\n",x[1],x[5],dpx,xprime,t1,t2,y[1],y[5],y[3],a,b);
647  gVirtualX->DrawLine(x[0]+dpx, y[0], x[2]+dpx, y[2]);
648  gVirtualX->DrawLine(x[0]+dpx, y[0], xprime-t1, y[7]);
649  gVirtualX->DrawLine(x[2]+dpx, y[2], xprime+t1, y[3]);
650  gVirtualX->DrawLine(xprime-t1, y[7], xprime-t2, y[6]);
651  gVirtualX->DrawLine(xprime+t1, y[3], xprime+t2, y[4]);
652  gVirtualX->DrawLine(xprime-t2, y[6], x[5], y[5]);
653  gVirtualX->DrawLine(xprime+t2, y[4], x[5], y[5]);
654  pxp = x[1]+dpx;
655  pyp = y[1];
656  gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
657  gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
658  gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
659  gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
660 
661  // draw extra line if needed
662  Int_t x1IL = gPad->XtoAbsPixel(GetIL()->GetX1());
663  Int_t x2IL = gPad->XtoAbsPixel(GetIL()->GetX2());
664  if (pxp > x2IL) {
665  gVirtualX->DrawLine(x2IL, pyp, pxp, pyp);
666  } else if (pxp < x1IL) {
667  gVirtualX->DrawLine(pxp, pyp, x1IL, pyp);
668  }
669  }
670 
671  if (ipoint==5) {
672  if ((x[1]-x[5]-dpx != 0) && (y[1]-y[5] != 0)) {
673  a = (y[1]-y[5])/((x[1]-x[5]-dpx)*1.0);
674  b = y[1] - a * x[1];
675  xprime = (Int_t)((y[3] - b) / a);
676  } else {
677  xprime = x[1];
678  }
679  t1 = (x[3] - x[7]) / 2;
680  t2 = (x[4] - x[6]) / 2;
681  gVirtualX->DrawLine(xprime-t1, y[7], x[0], y[0]);
682  gVirtualX->DrawLine(xprime+t1, y[3], x[2], y[2]);
683  gVirtualX->DrawLine(xprime-t1, y[7], xprime-t2, y[6]);
684  gVirtualX->DrawLine(xprime+t2, y[4], xprime+t1, y[3]);
685  gVirtualX->DrawLine(x[5]+dpx, y[5], xprime-t2, y[6]);
686  gVirtualX->DrawLine(x[5]+dpx, y[5], xprime+t2, y[4]);
687  pxp = x[5]+dpx;
688  pyp = y[5];
689  gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
690  gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
691  gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
692  gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
693 
694  // draw extra line if needed
695  Int_t x1FL = gPad->XtoAbsPixel(GetFL()->GetX1());
696  Int_t x2FL = gPad->XtoAbsPixel(GetFL()->GetX2());
697  if (pxp > x2FL) {
698  gVirtualX->DrawLine(x2FL, pyp, pxp, pyp);
699  } else if (pxp < x1FL) {
700  gVirtualX->DrawLine(pxp, pyp, x1FL, pyp);
701  }
702  }
703 
704  dpx += px - pxold;
705 
706  pxold = px;
707  pxold = TMath::Max(pxold, px1);
708  pxold = TMath::Min(pxold, px2);
709 
710  if (ipoint==1) {
711  if ((x[5]-x[1]-dpx != 0) && (y[5]-y[1] != 0)) {
712  a = (y[5]-y[1])/((x[5]-x[1]-dpx)*1.0);
713  b = y[5] - a * x[5];
714  xprime = (Int_t)((y[3] - b) / a);
715  } else {
716  xprime = x[5];
717  }
718  t1 = (x[3] - x[7]) / 2;
719  t2 = (x[4] - x[6]) / 2;
720  //printf("x1 = %d; x5 = %d, dpx = %d xprime = %f, t1 = %d, t2=%d, y1=%d , y5=%d , y3=%d, a=%f, b=%f\n",x[1],x[5],dpx,xprime,t1,t2,y[1],y[5],y[3],a,b);
721  gVirtualX->DrawLine(x[0]+dpx, y[0], x[2]+dpx, y[2]);
722  gVirtualX->DrawLine(x[0]+dpx, y[0], xprime-t1, y[7]);
723  gVirtualX->DrawLine(x[2]+dpx, y[2], xprime+t1, y[3]);
724  gVirtualX->DrawLine(xprime-t1, y[7], xprime-t2, y[6]);
725  gVirtualX->DrawLine(xprime+t1, y[3], xprime+t2, y[4]);
726  gVirtualX->DrawLine(xprime-t2, y[6], x[5], y[5]);
727  gVirtualX->DrawLine(xprime+t2, y[4], x[5], y[5]);
728  pxp = x[1]+dpx;
729  pyp = y[1];
730  gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
731  gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
732  gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
733  gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
734  }
735 
736  if (ipoint==5) {
737  if ((x[1]-x[5]-dpx != 0) && (y[1]-y[5] != 0)) {
738  a = (y[1]-y[5])/((x[1]-x[5]-dpx)*1.0);
739  b = y[1] - a * x[1];
740  xprime = (Int_t)((y[3] - b) / a);
741  } else {
742  xprime = x[1];
743  }
744  t1 = (x[3] - x[7]) / 2;
745  t2 = (x[4] - x[6]) / 2;
746  gVirtualX->DrawLine(xprime-t1, y[7], x[0], y[0]);
747  gVirtualX->DrawLine(xprime+t1, y[3], x[2], y[2]);
748  gVirtualX->DrawLine(xprime-t1, y[7], xprime-t2, y[6]);
749  gVirtualX->DrawLine(xprime+t2, y[4], xprime+t1, y[3]);
750  gVirtualX->DrawLine(x[5]+dpx, y[5], xprime-t2, y[6]);
751  gVirtualX->DrawLine(x[5]+dpx, y[5], xprime+t2, y[4]);
752  pxp = x[5]+dpx;
753  pyp = y[5];
754  gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
755  gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
756  gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
757  gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
758  }
759  }
760 
761  break;
762 
763  case kButton1Up:
764 
765  // Compute x,y range
766  xmin = gPad->GetUxmin();
767  xmax = gPad->GetUxmax();
768  ymin = gPad->GetUymin();
769  ymax = gPad->GetUymax();
770 // dx = xmax-xmin;
771 // dy = ymax-ymin;
772  //dxr = dx/(1 - gPad->GetLeftMargin() - gPad->GetRightMargin());
773  //dyr = dy/(1 - gPad->GetBottomMargin() - gPad->GetTopMargin());
774  dxr = 0;
775  dyr = 0;
776 
777  // Range() could change the size of the pad pixmap and therefore should
778  // be called before the other paint routines
779  gPad->Range(xmin - dxr*gPad->GetLeftMargin(),
780  ymin - dyr*gPad->GetBottomMargin(),
781  xmax + dxr*gPad->GetRightMargin(),
782  ymax + dyr*gPad->GetTopMargin());
783  gPad->RangeAxis(xmin, ymin, xmax, ymax);
784 
785  if (middle) {
786  for(i=0;i<np;i++) {
787  fX[i] = gPad->PadtoX(gPad->AbsPixeltoX(x[i]+dpx));
788  //fY[i] = gPad->PadtoY(gPad->AbsPixeltoY(y[i]+dpy));
789  }
790  } else {
791  if (ipoint == 1) {
792  if ((x[5]-x[1]-dpx != 0) && (y[5]-y[1] != 0)) {
793  a = (y[5]-y[1])/((x[5]-x[1]-dpx)*1.0);
794  b = y[5] - a * x[5];
795  xprime = (Int_t)((y[3] - b) / a);
796  } else {
797  xprime = x[5];
798  }
799  t1 = (x[3] - x[7]) / 2;
800  t2 = (x[4] - x[6]) / 2;
801  fX[1] = gPad->PadtoX(gPad->AbsPixeltoX(x[1]+dpx));
802  fX[0] = gPad->PadtoX(gPad->AbsPixeltoX(x[0]+dpx));
803  fX[2] = gPad->PadtoX(gPad->AbsPixeltoX(x[2]+dpx));
804  fX[8] = gPad->PadtoX(gPad->AbsPixeltoX(x[8]+dpx));
805  fX[3] = gPad->PadtoX(gPad->AbsPixeltoX(xprime+t1));
806  fX[4] = gPad->PadtoX(gPad->AbsPixeltoX(xprime+t2));
807  fX[6] = gPad->PadtoX(gPad->AbsPixeltoX(xprime-t2));
808  fX[7] = gPad->PadtoX(gPad->AbsPixeltoX(xprime-t1));
809 
810  // add extra line if needed
811  if (fX[1] > GetIL()->GetX2() ) {
812  GetIL()->SetExtraLineX2(fX[1]);
813  } else if (fX[1] < GetIL()->GetX1()) {
814  GetIL()->SetExtraLineX1(fX[1]);
815  } else {
816  GetIL()->GetExtraLine().SetBit(TObject::kInvalidObject);
817  }
818  }
819  if (ipoint == 5) {
820  if ((x[1]-x[5]-dpx != 0) && (y[1]-y[5] != 0)) {
821  a = (y[1]-y[5])/((x[1]-x[5]-dpx)*1.0);
822  b = y[1] - a * x[1];
823  xprime = (Int_t)((y[3] - b) / a);
824  } else {
825  xprime = x[1];
826  }
827  t1 = (x[3] - x[7]) / 2;
828  t2 = (x[4] - x[6]) / 2;
829  fX[5] = gPad->PadtoX(gPad->AbsPixeltoX(x[5]+dpx));
830  fX[3] = gPad->PadtoX(gPad->AbsPixeltoX(xprime+t1));
831  fX[4] = gPad->PadtoX(gPad->AbsPixeltoX(xprime+t2));
832  fX[6] = gPad->PadtoX(gPad->AbsPixeltoX(xprime-t2));
833  fX[7] = gPad->PadtoX(gPad->AbsPixeltoX(xprime-t1));
834 
835  // add extra line if needed
836  if (fX[5] > GetFL()->GetX2() ) {
837  GetFL()->SetExtraLineX2(fX[5]);
838  } else if (fX[5] < GetFL()->GetX1()) {
839  GetFL()->SetExtraLineX1(fX[5]);
840  } else {
841  GetFL()->GetExtraLine().SetBit(TObject::kInvalidObject);
842  }
843 
844  }
845  //fY[ipoint] = gPad->PadtoY(gPad->AbsPixeltoY(pyold));
846  }
847 
848  fLabel0.SetX((GetX()[1] + GetX()[5])/2. + vx0); fLabel0.SetY(fY[5]+vy);
849  fLabel1.SetX((GetX()[1] + GetX()[5])/2. + vx1); fLabel0.SetY(fY[5]+vy);
850  fLabel2.SetX((GetX()[1] + GetX()[5])/2. + vx2); fLabel0.SetY(fY[5]+vy);
851 
852  delete [] x; x = 0;
853  delete [] y; y = 0;
854  gPad->Modified(kTRUE);
855  gVirtualX->SetLineColor(-1);
856 
857  SetPoints(GetX()[0]+(GetX()[2]-(GetX()[0]))/2.,GetX()[5]);
858  }
859 }
860 
861 void Link::SetAmbiguous(Bool_t isambiguous)
862 {
863  fIsAmbiguous = isambiguous;
864 
865 #if ROOT_VERSION_CODE >= ROOT_VERSION(5,34,34)
866  if(fIsAmbiguous)
867  SetFillStyle(kFDotted1);
868  else
869  SetFillStyle(kFSolid);
870 #else
871  if(fIsAmbiguous)
872  SetFillStyle(3003);
873  else
874  SetFillStyle(1001);
875 #endif
876 }
877 
878 ClassImp(Link);
879 
880 
TBrowser * b
virtual Data_T Get() const
get the value, can be overloaded
Definition: Data.h:70
const Int_t size
Definition: BenchIO.C:24