Logo ROOT   6.10/09
Reference Guide
TPoints3DABC.cxx
Go to the documentation of this file.
1 // @(#)root/g3d:$Id$
2 // Author: Valery Fine(fine@mail.cern.ch) 04/05/99
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #include "TPoints3DABC.h"
13 #include "TMath.h"
14 
16 
17 /** \class TPoints3DABC
18 \ingroup g3d
19 Abstract class to define Arrays of 3D points.
20 */
21 
22 ////////////////////////////////////////////////////////////////////////////////
23 /// Add one 3D point defined by x,y,z to the array of the points
24 /// as its last element
25 
27 {
28  return AddLast(x,y,z);
29 }
30 
31 ////////////////////////////////////////////////////////////////////////////////
32 /// Add one 3D point defined by x,y,z to the array of the points
33 /// as its last element
34 
36 {
37  return SetNextPoint(x,y,z);
38 }
39 
40 ////////////////////////////////////////////////////////////////////////////////
41 /// Compute distance from point px,py to an axis of the band defined.
42 /// by pair points (x1,y1),(x2,y2) where lineWidth is the width of the band
43 ///
44 /// Compute the closest distance of approach from point px,py to this line.
45 /// The distance is computed in pixels units.
46 ///
47 /// Algorithm:
48 /// ~~~ {.cpp}
49 ///
50 /// A(x1,y1) P B(x2,y2)
51 /// ------------------------------------------------
52 /// I
53 /// I
54 /// I
55 /// I
56 /// M(x,y)
57 ///
58 /// Let us call a = distance AM a2=a**2
59 /// b = distance BM b2=b**2
60 /// c = distance AB c2=c**2
61 /// d = distance PM d2=d**2
62 /// u = distance AP u2=u**2
63 /// v = distance BP v2=v**2 c = u + v
64 ///
65 /// d2 = a2 - u2
66 /// d2 = b2 - v2 = b2 -(c-u)**2
67 /// ==> u = (a2 -b2 +c2)/2c
68 ///
69 /// Float_t x1 = gPad->XtoAbsPixel(xp1);
70 /// Float_t y1 = gPad->YtoAbsPixel(yp1);
71 /// Float_t x2 = gPad->XtoAbsPixel(xp2);
72 /// Float_t y2 = gPad->YtoAbsPixel(yp2);
73 /// ~~~
74 
76 {
77  Float_t xl, xt, yl, yt;
78  Float_t x = px;
79  Float_t y = py;
80  if (x1 < x2) {xl = x1; xt = x2;}
81  else {xl = x2; xt = x1;}
82  if (y1 < y2) {yl = y1; yt = y2;}
83  else {yl = y2; yt = y1;}
84  if (x < xl-2 || x> xt+2) return 9999; //following algorithm only valid in the box
85  if (y < yl-2 || y> yt+2) return 9999; //surrounding the line
86  Float_t xx1 = x - x1;
87  Float_t xx2 = x - x2;
88  Float_t x1x2 = x1 - x2;
89  Float_t yy1 = y - y1;
90  Float_t yy2 = y - y2;
91  Float_t y1y2 = y1 - y2;
92  Float_t a2 = xx1*xx1 + yy1*yy1;
93  Float_t b2 = xx2*xx2 + yy2*yy2;
94  Float_t c2 = x1x2*x1x2 + y1y2*y1y2;
95  if (c2 <= 0) return 9999;
96  Float_t c = TMath::Sqrt(c2);
97  Float_t u = (a2 - b2 + c2)/(2*c);
98  Float_t d2 = TMath::Abs(a2 - u*u);
99  if (d2 < 0) return 9999;
100 
101  return Int_t(TMath::Sqrt(d2) - 0.5*float(lineWidth));
102 }
103 
104 ////////////////////////////////////////////////////////////////////////////////
105 /// Add one 3D point defined by x,y,z to the array of the points
106 /// as its last element
107 
109 {
110  return SetPoint(GetLastPosition()+1,x,y,z);
111 }
112 
113 ////////////////////////////////////////////////////////////////////////////////
114 /// GetN() returns the number of allocated cells if any.
115 /// GetN() > 0 shows how many cells
116 /// can be available via GetP() method.
117 /// GetN() == 0 then GetP() must return 0 as well
118 
120 {
121  return 0;
122 }
123 
124 ////////////////////////////////////////////////////////////////////////////////
125 /// GetP() returns the pointer to the float point array
126 /// of points if available
127 /// The number of the available cells can be found via
128 /// GetN() method.
129 /// GetN() > 0 shows how many cells
130 
132 {
133  return 0;
134 }
135 
136 ////////////////////////////////////////////////////////////////////////////////
137 /// GetXYZ(Float_t *xyz,Int_t idx,Int_t num=1) fills the buffer supplied
138 /// by the calling code with the points information.
139 ///
140 /// Input parameters:
141 ///
142 /// - Float_t *xyz : an external user supplied floating point array.
143 /// - Int_t num : the total number of the points to be copied
144 /// the dimension of that array the size of the
145 /// array is num*sizeof(Float_t) at least
146 /// - Int_t idx : The index of the first copy to be taken.
147 ///
148 /// Return: The pointer to the buffer array supplied
149 
151 {
152  if (xyz) {
153  Int_t size = TMath::Min(idx+num,Size());
154  Int_t j=0;
155  for (Int_t i=idx;i<size;i++) {
156  xyz[j++] = GetX(i);
157  xyz[j++] = GetY(i);
158  xyz[j++] = GetZ(i);
159  }
160  }
161  return xyz;
162 }
virtual Int_t SetPoint(Int_t point, Float_t x, Float_t y, Float_t z)=0
virtual Float_t * GetXYZ(Float_t *xyz, Int_t idx, Int_t num=1) const
GetXYZ(Float_t *xyz,Int_t idx,Int_t num=1) fills the buffer supplied by the calling code with the poi...
float Float_t
Definition: RtypesCore.h:53
Abstract class to define Arrays of 3D points.
Definition: TPoints3DABC.h:25
Short_t Min(Short_t a, Short_t b)
Definition: TMathBase.h:168
int Int_t
Definition: RtypesCore.h:41
virtual Int_t AddLast(Float_t x, Float_t y, Float_t z)
Add one 3D point defined by x,y,z to the array of the points as its last element. ...
Short_t Abs(Short_t d)
Definition: TMathBase.h:108
virtual Float_t GetY(Int_t idx) const =0
static const double x2[5]
Double_t x[n]
Definition: legend1.C:17
virtual Int_t GetN() const
GetN() returns the number of allocated cells if any.
virtual Float_t GetX(Int_t idx) const =0
static Int_t DistancetoLine(Int_t px, Int_t py, Float_t x1, Float_t y1, Float_t x2, Float_t y2, Int_t lineWidth=1)
Compute distance from point px,py to an axis of the band defined.
void Add(THist< DIMENSIONS, PRECISION_TO, STAT_TO... > &to, const THist< DIMENSIONS, PRECISION_FROM, STAT_FROM... > &from)
Add two histograms.
Definition: THist.hxx:336
return c2
Definition: legend2.C:14
static const double x1[5]
#define ClassImp(name)
Definition: Rtypes.h:336
Double_t y[n]
Definition: legend1.C:17
you should not use this method at all Int_t Int_t z
Definition: TRolke.cxx:630
virtual Float_t * GetP() const
GetP() returns the pointer to the float point array of points if available The number of the availabl...
virtual Int_t SetNextPoint(Float_t x, Float_t y, Float_t z)
Add one 3D point defined by x,y,z to the array of the points as its last element. ...
Double_t Sqrt(Double_t x)
Definition: TMath.h:591
virtual Int_t Size() const =0
virtual Float_t GetZ(Int_t idx) const =0
virtual Int_t GetLastPosition() const =0