Delaunay triangulation

Hi everybody.
I used TGraph2D->Draw(“tri”) to triangulate a set of points. It worked very well. I would like now to write in an ASCII file the “tringulated” data like e.g. a list of triangles. I don’t know where to take the data from.

Thank you.

Look at:

root.cern.ch/root/html/TGraphDelaunay.html

I looked. Where I get the poiter to TGraphDelaunay from?
I filled a TGraph2D with points than draw it:

TTree t;
t.ReadFile("SomeFile","x/F:y:z");
t.Draw("x:y:z","","goff");
TGraph2D* pGr2D = new TGraph2D("2DGraph", 2DGraph", t.GetEntriesFast(), t.GetV1(), t.GetV2(), t.GetV3());
pGr2D->Draw("triw");

TGraph2D don’t contain any pointer to the TGraphDelaunay.

Example:

{
   Double_t P = 5.;
   Int_t npx  = 20 ;
   Int_t npy  = 20 ;
   Double_t x = -P;
   Double_t y = -P;
   Double_t z;
   Int_t i, k = 0;
   Double_t dx = (2*P)/npx;
   Double_t dy = (2*P)/npy;
   TGraph2D *graph2d = new TGraph2D(npx*npy);
   graph2d->SetName("Graph2DA");
   graph2d->SetNpy(40);
   graph2d->SetNpx(40);
   for (i=0; i<npx; i++) {
      for (Int_t j=0; j<npy; j++) {
         z = sin(sqrt(x*x+y*y))+1;
         graph2d->SetPoint(k,x,y,z);
         k++;
         y = y+dy;
      }
      x = x+dx; 
      y = -P; 
   }
   TGraphDelaunay *gd = new TGraphDelaunay(graph2d);
   gd->SetMaxIter(100000);     
   gd->SetMarginBinsContent(0);     
   gd->ComputeZ(0,0);
   gd->FindAllTriangles();
   Int_t Ndt = gd->GetNdt();
   printf("Ndt = %d\n",Ndt);
   Int_t *MT = gd->GetMTried();
   Int_t *NT = gd->GetNTried();
   Int_t *PT = gd->GetPTried();
   for (i=0; i<Ndt; i++) printf("%d %d %d\n",MT[i],NT[i],PT[i]);
}

YES it worked!

I tried similarly without the lines:

gd->SetMaxIter(100000);   // I thought this is default  
gd->SetMarginBinsContent(0);     
gd->ComputeZ(0,0);

I got then Ndt=0.

Why it didn’t worked?

Thank you again

ComputeZ creates the triangles data structure.

Hi again,
I used TGraph2D to triangulate a peaked form (see picture). The Draw option a used was TRIW (wire frame).
I would like now to get exactly the triangles of the wire frame. How can this be done? As I was looking into the triangles of the TGraphDelaunay I found that these are not the same as those of the wire frame.

Cheers


I d not understand you points. The triangles drawn are the triangles of the TGraphDelaunay.

I saved the triangles as follows:

TTree *pT = new TTree; // data tree
pT->ReadFile(sFilename, "x/F:y:z"); // read data file
pT->Draw("x:y:z");  // get the vectors

//__________________ create the 2D Graph & triangulate
TGraph2D *pG2D = new TGraph2D("Rifi","Rifi", pT->GetEntriesFast(), pT->GetV1(), pT->GetV2(), pT->GetV3());

TGraphDelaunay *pDelGraph = new TGraphDelaunay(pG2D);
pDelGraph->SetMaxIter(nIter);
pDelGraph->SetMarginBinsContent(0);
pDelGraph->ComputeZ(0,0);
pDelGraph->FindAllTriangles();

//__________________ save the results
Int_t nNdt = pDelGraph->GetNdt();
printf("Ndt = %d\n",nNdt);
Int_t *MT = pDelGraph->GetMTried();
Int_t *NT = pDelGraph->GetNTried();
Int_t *PT = pDelGraph->GetPTried();

Point p1, p2, p3;

 for (int ii=0; ii<nNdt; ii++){
		pT->GetEntry(MT[ii]);
		p1.X = fX;
		p1.Y = fY;
		p1.Z = fZ;

		pT->GetEntry(NT[ii]);
		p2.X = fX;
		p2.Y = fY;
		p2.Z = fZ;

		pT->GetEntry(PT[ii]);
		p3.X = fX;
		p3.Y = fY;
		p3.Z = fZ;

		writeTriangle(p1, p2, p3);
}

Maybe the save part is wrong.

What is wrong for you ? the vertices values ? the way the vertices are grouped in triangles ?

Are the triangles build the way I did?
Some of them are really weird.

It is done this way:
root.cern.ch/root/html/src/TGrap … tml#zyrHDB
line 978