00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <stdlib.h>
00013
00014 #include "Riostream.h"
00015 #include "TROOT.h"
00016 #include "TVirtualPad.h"
00017 #include "TMarker.h"
00018 #include "TVirtualX.h"
00019 #include "TMath.h"
00020 #include "TPoint.h"
00021 #include "TText.h"
00022 #include "TClass.h"
00023
00024 ClassImp(TMarker)
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 TMarker::TMarker(): TObject(), TAttMarker()
00041 {
00042
00043
00044 fX = 0;
00045 fY = 0;
00046 }
00047
00048
00049
00050 TMarker::TMarker(Double_t x, Double_t y, Int_t marker)
00051 :TObject(), TAttMarker()
00052 {
00053
00054
00055 fX = x;
00056 fY = y;
00057 fMarkerStyle = marker;
00058 }
00059
00060
00061
00062 TMarker::~TMarker()
00063 {
00064
00065 }
00066
00067
00068
00069 TMarker::TMarker(const TMarker &marker) : TObject(marker), TAttMarker(marker)
00070 {
00071
00072
00073 fX = 0;
00074 fY = 0;
00075 ((TMarker&)marker).Copy(*this);
00076 }
00077
00078
00079
00080 void TMarker::Copy(TObject &obj) const
00081 {
00082
00083
00084 TObject::Copy(obj);
00085 TAttMarker::Copy(((TMarker&)obj));
00086 ((TMarker&)obj).fX = fX;
00087 ((TMarker&)obj).fY = fY;
00088 }
00089
00090
00091
00092 void TMarker::DisplayMarkerTypes()
00093 {
00094
00095
00096 TMarker *marker = new TMarker();
00097 marker->SetMarkerSize(3);
00098 TText *text = new TText();
00099 text->SetTextFont(62);
00100 text->SetTextAlign(22);
00101 text->SetTextSize(0.1);
00102 char atext[] = " ";
00103 Double_t x = 0;
00104 Double_t dx = 1/16.0;
00105 for (Int_t i=1;i<16;i++) {
00106 x += dx;
00107 snprintf(atext,7,"%d",i);
00108 marker->SetMarkerStyle(i);
00109 marker->DrawMarker(x,.35);
00110 text->DrawText(x,.17,atext);
00111 snprintf(atext,7,"%d",i+19);
00112 marker->SetMarkerStyle(i+19);
00113 marker->DrawMarker(x,.8);
00114 text->DrawText(x,.62,atext);
00115 }
00116 delete marker;
00117 delete text;
00118 }
00119
00120
00121
00122 Int_t TMarker::DistancetoPrimitive(Int_t px, Int_t py)
00123 {
00124
00125
00126
00127
00128
00129 Int_t pxm, pym;
00130 if (TestBit(kMarkerNDC)) {
00131 pxm = gPad->UtoPixel(fX);
00132 pym = gPad->VtoPixel(fY);
00133 } else {
00134 pxm = gPad->XtoAbsPixel(gPad->XtoPad(fX));
00135 pym = gPad->YtoAbsPixel(gPad->YtoPad(fY));
00136 }
00137 Int_t dist = (Int_t)TMath::Sqrt((px-pxm)*(px-pxm) + (py-pym)*(py-pym));
00138
00139
00140 Int_t markerRadius = Int_t(4*fMarkerSize);
00141 if (dist <= markerRadius) return 0;
00142 if (dist > markerRadius+3) return 999;
00143 return dist;
00144 }
00145
00146
00147
00148 void TMarker::Draw(Option_t *option)
00149 {
00150
00151
00152 AppendPad(option);
00153
00154 }
00155
00156
00157
00158 void TMarker::DrawMarker(Double_t x, Double_t y)
00159 {
00160
00161
00162 TMarker *newmarker = new TMarker(x, y, 1);
00163 TAttMarker::Copy(*newmarker);
00164 newmarker->SetBit(kCanDelete);
00165 newmarker->AppendPad();
00166 }
00167
00168
00169
00170 void TMarker::ExecuteEvent(Int_t event, Int_t px, Int_t py)
00171 {
00172
00173
00174
00175
00176
00177
00178
00179 TPoint p;
00180 static Int_t pxold, pyold;
00181
00182 if (!gPad->IsEditable()) return;
00183
00184 switch (event) {
00185
00186
00187 case kButton1Down:
00188 gVirtualX->SetTextColor(-1);
00189 TAttMarker::Modify();
00190
00191
00192
00193 case kMouseMotion:
00194 pxold = px; pyold = py;
00195 gPad->SetCursor(kMove);
00196 break;
00197
00198 case kButton1Motion:
00199 p.fX = pxold; p.fY = pyold;
00200 gVirtualX->DrawPolyMarker(1, &p);
00201 p.fX = px; p.fY = py;
00202 gVirtualX->DrawPolyMarker(1, &p);
00203 pxold = px; pyold = py;
00204 break;
00205
00206 case kButton1Up:
00207 Double_t dpx, dpy, xp1,yp1;
00208 if (TestBit(kMarkerNDC)) {
00209 dpx = gPad->GetX2() - gPad->GetX1();
00210 dpy = gPad->GetY2() - gPad->GetY1();
00211 xp1 = gPad->GetX1();
00212 yp1 = gPad->GetY1();
00213 fX = (gPad->AbsPixeltoX(pxold)-xp1)/dpx;
00214 fY = (gPad->AbsPixeltoY(pyold)-yp1)/dpy;
00215 } else {
00216 fX = gPad->PadtoX(gPad->AbsPixeltoX(px));
00217 fY = gPad->PadtoY(gPad->AbsPixeltoY(py));
00218 }
00219 gPad->Modified(kTRUE);
00220 gVirtualX->SetTextColor(-1);
00221 break;
00222 }
00223 }
00224
00225
00226
00227 void TMarker::ls(Option_t *) const
00228 {
00229
00230
00231 TROOT::IndentLevel();
00232 printf("Marker X=%f Y=%f marker type=%d\n",fX,fY,fMarkerStyle);
00233 }
00234
00235
00236
00237 void TMarker::Paint(Option_t *)
00238 {
00239
00240
00241 if (TestBit(kMarkerNDC)) {
00242 Double_t u = gPad->GetX1() + fX*(gPad->GetX2()-gPad->GetX1());
00243 Double_t v = gPad->GetY1() + fY*(gPad->GetY2()-gPad->GetY1());
00244 PaintMarker(u,v);
00245 } else {
00246 PaintMarker(gPad->XtoPad(fX),gPad->YtoPad(fY));
00247 }
00248 }
00249
00250
00251
00252 void TMarker::PaintMarker(Double_t x, Double_t y)
00253 {
00254
00255
00256 TAttMarker::Modify();
00257 gPad->PaintPolyMarker(-1,&x,&y,"");
00258 }
00259
00260
00261
00262 void TMarker::PaintMarkerNDC(Double_t, Double_t)
00263 {
00264
00265 }
00266
00267
00268
00269 void TMarker::Print(Option_t *) const
00270 {
00271
00272
00273 printf("Marker X=%f Y=%f",fX,fY);
00274 if (GetMarkerColor() != 1) printf(" Color=%d",GetMarkerColor());
00275 if (GetMarkerStyle() != 1) printf(" MarkerStyle=%d",GetMarkerStyle());
00276 if (GetMarkerSize() != 1) printf(" MarkerSize=%f",GetMarkerSize());
00277 printf("\n");
00278 }
00279
00280
00281
00282 void TMarker::SavePrimitive(ostream &out, Option_t * )
00283 {
00284
00285
00286 if (gROOT->ClassSaved(TMarker::Class())) {
00287 out<<" ";
00288 } else {
00289 out<<" TMarker *";
00290 }
00291 out<<"marker = new TMarker("<<fX<<","<<fY<<","<<fMarkerStyle<<");"<<endl;
00292
00293 SaveMarkerAttributes(out,"marker",1,1,1);
00294
00295 out<<" marker->Draw();"<<endl;
00296 }
00297
00298
00299
00300 void TMarker::SetNDC(Bool_t isNDC)
00301 {
00302
00303
00304 ResetBit(kMarkerNDC);
00305 if (isNDC) SetBit(kMarkerNDC);
00306 }
00307
00308
00309
00310 void TMarker::Streamer(TBuffer &R__b)
00311 {
00312
00313
00314 if (R__b.IsReading()) {
00315 UInt_t R__s, R__c;
00316 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
00317 if (R__v > 1) {
00318 R__b.ReadClassBuffer(TMarker::Class(), this, R__v, R__s, R__c);
00319 return;
00320 }
00321
00322 TObject::Streamer(R__b);
00323 TAttMarker::Streamer(R__b);
00324 Float_t x,y;
00325 R__b >> x; fX = x;
00326 R__b >> y; fY = y;
00327
00328
00329 } else {
00330 R__b.WriteClassBuffer(TMarker::Class(),this);
00331 }
00332 }