19 Float_t TArrow::fgDefaultAngle = 60;
20 Float_t TArrow::fgDefaultArrowSize = 0.05;
21 TString TArrow::fgDefaultOption =
">";
46 TArrow::TArrow(): TLine(),TAttFill()
48 fAngle = fgDefaultAngle;
76 TArrow::TArrow(Double_t x1, Double_t y1,Double_t x2, Double_t y2,
77 Float_t arrowsize ,Option_t *option)
78 :TLine(x1,y1,x2,y2), TAttFill(0,1001)
81 fAngle = fgDefaultAngle;
82 fArrowSize = arrowsize;
84 SetFillColor(GetLineColor());
97 TArrow::TArrow(
const TArrow &arrow) : TLine(), TAttFill()
99 fAngle = fgDefaultAngle;
107 void TArrow::Copy(TObject &obj)
const
110 TAttFill::Copy(((TArrow&)obj));
111 ((TArrow&)obj).fAngle = fAngle;
112 ((TArrow&)obj).fArrowSize = fArrowSize;
113 ((TArrow&)obj).fOption = fOption;
119 void TArrow::Draw(Option_t *option)
122 if (option && strlen(option)) opt = option;
123 else opt = (
char*)GetOption();
134 void TArrow::DrawArrow(Double_t x1, Double_t y1,Double_t x2, Double_t y2,
135 Float_t arrowsize ,Option_t *option)
138 Float_t size = arrowsize;
139 if (size <= 0) size = fArrowSize;
140 if (size <= 0) size = 0.05;
141 const char* opt = option;
142 if (!opt || !opt[0]) opt = fOption.Data();
143 if (!opt || !opt[0]) opt =
"|>";
144 TArrow *newarrow =
new TArrow(x1,y1,x2,y2,size,opt);
145 newarrow->SetAngle(fAngle);
146 TAttLine::Copy(*newarrow);
147 TAttFill::Copy(*newarrow);
148 newarrow->SetBit(kCanDelete);
149 newarrow->AppendPad(opt);
155 void TArrow::Paint(Option_t *option)
158 if (option && strlen(option)) opt = option;
159 else opt = (
char*)GetOption();
160 if (TestBit(kLineNDC))
161 PaintArrow(gPad->GetX1() + fX1 * (gPad->GetX2() - gPad->GetX1()),
162 gPad->GetY1() + fY1 * (gPad->GetY2() - gPad->GetY1()),
163 gPad->GetX1() + fX2 * (gPad->GetX2() - gPad->GetX1()),
164 gPad->GetY1() + fY2 * (gPad->GetY2() - gPad->GetY1()), fArrowSize, opt);
166 PaintArrow(gPad->XtoPad(fX1), gPad->YtoPad(fY1), gPad->XtoPad(fX2), gPad->YtoPad(fY2), fArrowSize, opt);
172 void TArrow::PaintArrow(Double_t x1, Double_t y1, Double_t x2, Double_t y2,
173 Float_t arrowsize, Option_t *option)
177 TString opt = option;
183 Int_t iw = gPad->GetWw();
184 Int_t ih = gPad->GetWh();
185 Double_t x1p,y1p,x2p,y2p;
186 gPad->GetPadPar(x1p,y1p,x2p,y2p);
187 Int_t ix1 = (Int_t)(iw*x1p);
188 Int_t iy1 = (Int_t)(ih*y1p);
189 Int_t ix2 = (Int_t)(iw*x2p);
190 Int_t iy2 = (Int_t)(ih*y2p);
191 Double_t wndc = TMath::Min(1.,(Double_t)iw/(Double_t)ih);
192 Double_t hndc = TMath::Min(1.,(Double_t)ih/(Double_t)iw);
193 Double_t rh = hndc/(Double_t)ih;
194 Double_t rw = wndc/(Double_t)iw;
195 Double_t x1ndc = (Double_t)ix1*rw;
196 Double_t y1ndc = (Double_t)iy1*rh;
197 Double_t x2ndc = (Double_t)ix2*rw;
198 Double_t y2ndc = (Double_t)iy2*rh;
201 Double_t rx1,ry1,rx2,ry2;
202 gPad->GetRange(rx1,ry1,rx2,ry2);
203 Double_t rx = (x2ndc-x1ndc)/(rx2-rx1);
204 Double_t ry = (y2ndc-y1ndc)/(ry2-ry1);
207 Double_t x1n = rx*(x1-rx1)+x1ndc;
208 Double_t x2n = rx*(x2-rx1)+x1ndc;
209 Double_t y1n = ry*(y1-ry1)+y1ndc;
210 Double_t y2n = ry*(y2-ry1)+y1ndc;
211 Double_t xm = (x1n+x2n)/2;
212 Double_t ym = (y1n+y2n)/2;
215 Double_t length = TMath::Sqrt(Double_t((x2n-x1n)*(x2n-x1n)+(y2n-y1n)*(y2n-y1n)));
216 Double_t rSize = 0.7*arrowsize;
217 Double_t dSize = rSize*TMath::Tan(TMath::Pi()*fAngle/360);
218 Double_t cosT = (length > 0) ? (x2n-x1n)/length : 1.;
219 Double_t sinT = (length > 0) ? (y2n-y1n)/length : 0.;
222 if (opt.BeginsWith(
"|-")) {
223 Double_t x1ar[2], y1ar[2];
224 x1ar[0] = x1n-sinT*dSize;
225 y1ar[0] = y1n+cosT*dSize;
226 x1ar[1] = x1n+sinT*dSize;
227 y1ar[1] = y1n-cosT*dSize;
229 for (Int_t i=0; i<2; i++) {
230 x1ar[i] = (1/rx)*(x1ar[i]-x1ndc)+rx1;
231 y1ar[i] = (1/ry)*(y1ar[i]-y1ndc)+ry1;
233 gPad->PaintLine(x1ar[0],y1ar[0],x1ar[1],y1ar[1]);
236 if (opt.EndsWith(
"-|")) {
237 Double_t x2ar[2], y2ar[2];
238 x2ar[0] = x2n-sinT*dSize;
239 y2ar[0] = y2n+cosT*dSize;
240 x2ar[1] = x2n+sinT*dSize;
241 y2ar[1] = y2n-cosT*dSize;
243 for (Int_t i=0; i<2; i++) {
244 x2ar[i] = (1/rx)*(x2ar[i]-x1ndc)+rx1;
245 y2ar[i] = (1/ry)*(y2ar[i]-y1ndc)+ry1;
247 gPad->PaintLine(x2ar[0],y2ar[0],x2ar[1],y2ar[1]);
248 opt(opt.Length()-1) =
' ';
256 if (opt.Contains(
"->-") || opt.Contains(
"-|>-")) {
257 x2h = xm + cosT*rSize/2;
258 y2h = ym + sinT*rSize/2;
260 if (opt.Contains(
"-<-") || opt.Contains(
"-<|-")) {
261 x1h = xm - cosT*rSize/2;
262 y1h = ym - sinT*rSize/2;
266 if (opt.Contains(
"|>") && !opt.Contains(
"-|>-")) {
270 if (opt.Contains(
"<|") && !opt.Contains(
"-<|-")) {
274 x1n = (1/rx)*(x1n-x1ndc)+rx1;
275 y1n = (1/ry)*(y1n-y1ndc)+ry1;
276 x2n = (1/rx)*(x2n-x1ndc)+rx1;
277 y2n = (1/ry)*(y2n-y1ndc)+ry1;
278 gPad->PaintLine(x1n,y1n,x2n,y2n);
281 if (opt.Contains(
">")) {
282 Double_t x2ar[4], y2ar[4];
284 x2ar[0] = x2h - rSize*cosT - sinT*dSize;
285 y2ar[0] = y2h - rSize*sinT + cosT*dSize;
288 x2ar[2] = x2h - rSize*cosT + sinT*dSize;
289 y2ar[2] = y2h - rSize*sinT - cosT*dSize;
294 for (Int_t i=0; i<4; i++) {
295 x2ar[i] = (1/rx)*(x2ar[i]-x1ndc)+rx1;
296 y2ar[i] = (1/ry)*(y2ar[i]-y1ndc)+ry1;
298 if (opt.Contains(
"|>")) {
299 if (gVirtualX) gVirtualX->SetLineStyle(1);
300 if (gVirtualPS) gVirtualPS->SetLineStyle(1);
301 if (GetFillColor()) {
302 gPad->PaintFillArea(3,x2ar,y2ar);
303 gPad->PaintPolyLine(4,x2ar,y2ar);
305 gPad->PaintPolyLine(4,x2ar,y2ar);
308 gPad->PaintPolyLine(3,x2ar,y2ar);
312 if (opt.Contains(
"<")) {
313 Double_t x1ar[4], y1ar[4];
314 x1ar[0] = x1h + rSize*cosT + sinT*dSize;
315 y1ar[0] = y1h + rSize*sinT - cosT*dSize;
318 x1ar[2] = x1h + rSize*cosT - sinT*dSize;
319 y1ar[2] = y1h + rSize*sinT + cosT*dSize;
324 for (Int_t i=0; i<4; i++) {
325 x1ar[i] = (1/rx)*(x1ar[i]-x1ndc)+rx1;
326 y1ar[i] = (1/ry)*(y1ar[i]-y1ndc)+ry1;
328 if (opt.Contains(
"<|")) {
329 if (gVirtualX) gVirtualX->SetLineStyle(1);
330 if (gVirtualPS) gVirtualPS->SetLineStyle(1);
331 if (GetFillColor()) {
332 gPad->PaintFillArea(3,x1ar,y1ar);
333 gPad->PaintPolyLine(4,x1ar,y1ar);
335 gPad->PaintPolyLine(4,x1ar,y1ar);
338 gPad->PaintPolyLine(3,x1ar,y1ar);
346 void TArrow::SavePrimitive(std::ostream &out, Option_t * )
350 if (gROOT->ClassSaved(TArrow::Class())) {
355 out<<
"arrow = new TArrow("<<fX1<<
","<<fY1<<
","<<fX2<<
","<<fY2
356 <<
","<<fArrowSize<<
","<<quote<<GetDrawOption()<<quote<<
");"<<std::endl;
358 SaveFillAttributes(out,
"arrow",0,1);
359 SaveLineAttributes(out,
"arrow",1,1,1);
361 if (TestBit(kLineNDC))
362 out<<
" arrow->SetNDC();"<<std::endl;
365 out <<
" arrow->SetAngle(" << GetAngle() <<
");" << std::endl;
367 out<<
" arrow->Draw();"<<std::endl;
374 void TArrow::SetDefaultAngle(Float_t Angle)
376 fgDefaultAngle = Angle;
383 void TArrow::SetDefaultArrowSize (Float_t ArrowSize)
385 fgDefaultArrowSize = ArrowSize;
392 void TArrow::SetDefaultOption(Option_t *Option)
395 fgDefaultOption = Option;
402 Float_t TArrow::GetDefaultAngle()
405 return fgDefaultAngle;
412 Float_t TArrow::GetDefaultArrowSize()
415 return fgDefaultArrowSize;
422 Option_t *TArrow::GetDefaultOption()
425 return fgDefaultOption.Data();