Hi Valery,
Thanx for explanation! I used this magic number 0.5*sqrt(3), and all
fell into place.
I've attached header and implementation files for my class 'TEdView'.
As you see I don't touch fTnorm and fTback. I presumed that
fTnorm brings me from WC to normalized coordinates, that is the
system where variables range from -1 to 1, so all I needed to do -
expand and shift according to my Pad boundaries. Well, anyway
it works now ( after introduction of 0.5*sqrt(3)) like I
intended it to work.
Dmitri Litvintsev
/----------------------------------------------------------\
| Tel: (630) 840 3763 |
| FAX: (630) 840 2968 |
| office: 164-O CDF Trailers |
| E-mail: litvinse@fnal.gov |
\----------------------------------------------------------/
On Mon, 27 Sep 1999, Valeri Fine (Faine) wrote:
>
> Hello Dmitri,
>
> Could you supply the full text of your version of TView class
> Especially I'd like to see how you fill :
>
> Float_t fTnorm[12]; // Transformation matrix
> Float_t fTback[12]; // Back transformation matrix
>
> >From my point of view to do what you want you should not touch
> WCtoNDC class rather introduce a special method to re-define fTnorm
> matrix
>
> This matrix is defined by
>
> void TView::ResetView(Float_t longitude, Float_t latitude, Float_t psi, Int_t &irep)
>
> method via "FindScope" as follows:
> {
> irep = 0;
> Float_t sqrt3 = 0.5*TMath::Sqrt(3.0);
>
> for (Int_t i = 0; i < 3; i++) {
> if (fRmin[i] >= fRmax[i]) { irep = -1; return;}
> scale[i] = sqrt3*(fRmax[i] - fRmin[i]);
> center[i] = 0.5*(fRmax[i] + fRmin[i]);
> }
> }
>
> >From the code above it is clear the SECOND transformation you introduced
> within your version of ONLY method of TView doesn't match the PRIMARY
> transfromation the rest methods of your class use.
>
> Apparently the factor:
>
> root [3] 1.0/(0.5*sqrt(3))
> (double)1.15470053837925170e+000
>
> I think sqrt3 was chosen to make sure all verteces of the cube
> (fRmax[i] - fRmin[i]) (in other words the cube diagonal)
> are visible with either rotation angle.
>
> Myself see no reason for a new class.
>
> May be one should contribute a new method (approach)
>
> TView::WCtoDC and avoid
> gPad->Range(-1, -1, 1, 1);
>
>
> Hope this helps,
> Valery
>
#include <math.h>
#include "TVirtualPad.h"
#include "TLego.h"
#include "RootEventDisplay/TEdView.hh"
ClassImp(TEdView)
//______________________________________________________________________________
TEdView::TEdView() : TView () {}
//______________________________________________________________________________
TEdView::~TEdView() {}
//______________________________________________________________________________
TEdView::TEdView(Int_t system) {
Int_t irep;
fSystem = system;
fOutline = 0;
fDefaultOutline = kFALSE;
fAutoRange = kFALSE;
if (system == kCARTESIAN || system == kPOLAR) fPsi = 0;
else fPsi = 90;
if (gPad) {
gPad->GetRange(fPadX1,fPadY1,fPadX2,fPadY2);
for (Int_t i = 0; i < 3; fRmin[i] = 0, fRmax[i] = 1, i++);
fLongitude = -90 - gPad->GetPhi();
fLatitude = 90 - gPad->GetTheta();
ResetView(fLongitude, fLatitude, fPsi, irep);
gPad->SetView(this);
}
}
//______________________________________________________________________________
TEdView::TEdView(Float_t *rmin, Float_t *rmax, Int_t system) {
Int_t irep;
fSystem = system;
fOutline = 0;
fDefaultOutline = kFALSE;
if (system == kCARTESIAN || system == kPOLAR) fPsi = 0;
else fPsi = 90;
//By default pad range in 3-D view is (-1,-1,1,1), so ...
gPad->Range(rmin[0],rmin[1],rmax[0],rmax[1]);
// gPad->GetRange(xmin,ymin,xmax,ymax);
fPadX1 = rmin[0];
fPadY1 = rmin[1];
fPadX2 = rmax[0];
fPadY2 = rmax[1];
for (Int_t i = 0; i < 3; fRmin[i] = rmin[i], fRmax[i] = rmax[i], i++);
fLongitude = -90 - gPad->GetPhi();
fLatitude = 90 - gPad->GetTheta();
ResetView(fLongitude, fLatitude, fPsi, irep);
if (gPad)
gPad->SetView(this);
}
//______________________________________________________________________________
void TEdView::WCtoNDC(Float_t *pw, Float_t *pn)
{
//*-*-*-*-*-*-*Transfer point from world to normalized coordinates*-*-*-*-*
//*-* =================================================== *
//*-* *
//*-* Input: PW(3) - point in world coordinate system *
//*-* PN(3) - point in normalized coordinate system *
//*-* *
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
float dx = (fPadX2-fPadX1)*0.5*sqrt(3);
float dy = (fPadY2-fPadY1)*0.5*sqrt(3);
pn[0] = fTnorm[0]*pw[0] + fTnorm[1]*pw[1] + fTnorm[2]*pw[2] + fTnorm[3];
pn[1] = fTnorm[4]*pw[0] + fTnorm[5]*pw[1] + fTnorm[6]*pw[2] + fTnorm[7];
pn[2] = fTnorm[8]*pw[0] + fTnorm[9]*pw[1] + fTnorm[10]*pw[2] + fTnorm[11];
pn[0] *= dx;
pn[1] *= dy;
pn[0] += 0.5*( fPadX2 + fPadX1 );
pn[1] += 0.5*( fPadY2 + fPadY1 );
}
//______________________________________________________________________________
void TEdView::NDCtoWC(Float_t* pn, Float_t* pw)
{
//*-*-*-*-*-*-*Transfer point from normalized to world coordinates*-*-*-*-*
//*-* =================================================== *
//*-* *
//*-* Input: PN(3) - point in world coordinate system *
//*-* PW(3) - point in normalized coordinate system *
//*-* *
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
pw[0] = fTback[0]*pn[0] + fTback[1]*pn[1] + fTback[2]*pn[2] + fTback[3];
pw[1] = fTback[4]*pn[0] + fTback[5]*pn[1] + fTback[6]*pn[2] + fTback[7];
pw[2] = fTback[8]*pn[0] + fTback[9]*pn[1] + fTback[10]*pn[2] + fTback[11];
}
#ifndef TEdView_hh
#define TEdView_hh
#include "TView.h"
class TEdView : public TView {
protected:
Float_t fPadX1;
Float_t fPadX2;
Float_t fPadY1;
Float_t fPadY2;
public:
TEdView();
TEdView(Int_t system);
TEdView(Float_t *rmin, Float_t *rmax, Int_t system = 1);
virtual ~TEdView();
// Overridden from the base class:
virtual void WCtoNDC(Float_t *pw, Float_t *pn);
virtual void NDCtoWC(Float_t *pn, Float_t *pw);
ClassDef(TEdView,0)
};
#endif
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:40 MET