# 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.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->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