TMarker.cxx

Go to the documentation of this file.
00001 // @(#)root/graf:$Id: TMarker.cxx 35773 2010-09-27 08:16:14Z couet $
00002 // Author: Rene Brun   12/05/95
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
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 // Manages Markers. Marker attributes are managed by TAttMarker.
00030 // The list of standard ROOT markers is shown in this picture
00031 //Begin_Html
00032 /*
00033 <img src="gif/markers.gif">
00034 */
00035 //End_Html
00036 //
00037 
00038 
00039 //______________________________________________________________________________
00040 TMarker::TMarker(): TObject(), TAttMarker()
00041 {
00042    // Marker default constructor.
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    // Marker normal constructor.
00054 
00055    fX = x;
00056    fY = y;
00057    fMarkerStyle = marker;
00058 }
00059 
00060 
00061 //______________________________________________________________________________
00062 TMarker::~TMarker()
00063 {
00064    // Marker default destructor.
00065 }
00066 
00067 
00068 //______________________________________________________________________________
00069 TMarker::TMarker(const TMarker &marker) : TObject(marker), TAttMarker(marker)
00070 {
00071    // Marker copy constructor.
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    // Copy this marker to marker.
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    // Display the table of markers with their numbers.
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    // Compute distance from point px,py to a marker.
00125    //
00126    //  Compute the closest distance of approach from point px,py to this marker.
00127    //  The distance is computed in pixels units.
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    //marker size = 1 is about 8 pixels
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    // Draw this marker with its current attributes.
00151 
00152    AppendPad(option);
00153 
00154 }
00155 
00156 
00157 //______________________________________________________________________________
00158 void TMarker::DrawMarker(Double_t x, Double_t y)
00159 {
00160    // Draw this marker with new coordinates.
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    // Execute action corresponding to one event.
00173    //
00174    //  This member function is called when a marker is clicked with the locator
00175    //
00176    //  If Left button is clicked on a marker, the marker is moved to
00177    //  a new position when the mouse button is released.
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);  // invalidate current text color (use xor mode)
00189       TAttMarker::Modify();  //Change marker attributes only if necessary
00190 
00191       // No break !!!
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    // List this marker with its attributes.
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    // Paint this marker with its current attributes.
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    // Draw this marker with new coordinates.
00255 
00256    TAttMarker::Modify();  //Change line attributes only if necessary
00257    gPad->PaintPolyMarker(-1,&x,&y,"");
00258 }
00259 
00260 
00261 //______________________________________________________________________________
00262 void TMarker::PaintMarkerNDC(Double_t, Double_t)
00263 {
00264    // Draw this marker with new coordinates in NDC.
00265 }
00266 
00267 
00268 //______________________________________________________________________________
00269 void TMarker::Print(Option_t *) const
00270 {
00271    // Dump this marker with its attributes.
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    // Save primitive as a C++ statement(s) on output stream out
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    // Set NDC mode on if isNDC = kTRUE, off otherwise
00303 
00304    ResetBit(kMarkerNDC);
00305    if (isNDC) SetBit(kMarkerNDC);
00306 }
00307 
00308 
00309 //______________________________________________________________________________
00310 void TMarker::Streamer(TBuffer &R__b)
00311 {
00312    // Stream an object of class TMarker.
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       //====process old versions before automatic schema evolution
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       //====end of old versions
00328 
00329    } else {
00330       R__b.WriteClassBuffer(TMarker::Class(),this);
00331    }
00332 }

Generated on Tue Jul 5 14:14:28 2011 for ROOT_528-00b_version by  doxygen 1.5.1