StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
hexSnap.C
1 class HexLatice {
2 public:
3  // data members
4  TVector2 U,V; // _versors_ of the grid
5  TVector2 bU,bV; // base vectors of the grid, contain pitch
6  double uv,w0,pitch;
7 
8  HexLatice(double pitchX,double phi1) {
9  const double pi=2*acos(0);
10  pitch=pitchX;
11  bU.SetMagPhi(pitch,phi1);
12  bV=bU.Rotate(pi/3);
13  U=bU.Unit();
14  V=bV.Unit();
15  uv=U*V, w0=(1-uv*uv)*pitch;
16  printf("Hex Grid base: U(%.3f,%3f), V(%.3f,%3f) U*V=%.3f\n",U.X(),V.Y(),U.X(),V.Y(),uv);
17  }
18  TVector2 snap(TVector2 &P, int &ku,int &kv){ // returns hexLatice coordinates
19  // find hex latice coordinates
20  double a=P*U, b=P*V;
21  double u=(a-b*uv)/w0, v=(b-a*uv)/w0;
22  double iu=floor(u), iv=floor(v);
23  // printf("P(%.3f,%3f) --> hexLatice(%.3f,%3f)*pitch -->floor(%.0f %.0f) \n", P.X(),P.Y(),u,v,iu,iv);
24  int iN;
25  double maxD2=999999;
26 
27  TVector2 Psnap=TVector2(99999,99999);
28  for(iN=0;iN<4;iN++) {
29  int ju=iu+iN%2;
30  int jv=iv+iN/2;
31  TVector2 Q=ju*bU + jv*bV;
32  double dist2=(Q-P).Mod2();
33  // printf("iNode=%d Q(%.3f,%3f) -->dist=%.2f\n",iN,Q.X(),Q.Y(),sqrt(dist2));
34  if(maxD2<dist2) continue;
35  maxD2=dist2;
36  Psnap=Q;
37 
38  ku=ju;
39  kv=jv;
40  }
41 
42  // printf("closest node(%d,%d) Psnap(%.3f,%3f) -->dist=%.2f\n",ku,kv,Psnap.X(),Psnap.Y(),sqrt(maxD2));
43 
44  return Psnap;
45  }
46 };
47 
48 
49 //=================================
50 hexSnap(int np=1) {
51  const double pi=2*acos(0);
52  double phi1=pi/4;
53  double pitch=10;
54  double Rmax=40;
55  gStyle->SetOptStat(0);
56  HexLatice hexLat(pitch,phi1);
57  TRandom3 *rnd=new TRandom3;
58  c=new TCanvas("bb","bb",600,600);
59  h=new TH2F("aa","aa",10,0,Rmax,10,0,Rmax); h->Draw();
60  drawHoles(38,hexLat);
61 
62  int i;
63  int j=4;
64  for(j=0;j<10;j++)
65  for(i=0;i<10;i++){
66  //TVector2 P(rnd->Uniform(5.,Rmax*.8),rnd->Uniform(5.,Rmax*.8));
67  TVector2 P(3+j*.7,3+i*.7);
68  int kU,kV;
69  hexLat.snap(P,kU,kV); // returns also new vector, you may use it
70  kU+=1000;
71  kV+=1000;
72  //printf("k=%d %d\n",kU,kV);
73  tm=new TMarker(P.X(),P.Y(),5);
74  int off=kU%2 +2*(kV%2);
75  // printf("off=%d\n",off);
76  tm->Draw(); tm->SetMarkerColor(1+off);
77  }
78 
79 
80  return;
81 }
82 
83 //========================================
84 drawHoles(double r2,HexLatice &HL) {
85  int i=1,j=1;
86 
87  for(j=-5; j<10;j++)
88  for(i=1; i<10;i++) {
89  TVector2 r=i*HL.bU + j*HL.bV;
90 
91  if(r.X()<0 || r.Y()<0) continue;
92  if(r.X()>r2 || r.Y()>r2) continue;
93  el=new TEllipse(r.X(),r.Y(),0.5);
94  el->Draw();
95  int kU=i+1000;
96  int kV=j+1000;
97  int off=kU%2 +2*(kV%2);
98  el->SetFillColor(1+off);
99  }
100 }
101