大家有用過Delaunay三角化這個方法嗎? |
缺席
|
Teresa_Chang
一般會員 發表:41 回覆:42 積分:16 註冊:2004-05-04 發送簡訊給我 |
|
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
你可以查詢Delaunay或是Vornoni。
http://www.csit.fsu.edu/~burkardt/cpp_src/cpp_src.html 上面的網頁有範例,但是他似乎是一個project,我不怎麼會改.... 我之前是用一個O(n^4)的方法寫出來的,在一本計算幾何的課本中有寫.... 如果node數目太多不會太慢..... |
Teresa_Chang
一般會員 發表:41 回覆:42 積分:16 註冊:2004-05-04 發送簡訊給我 |
|
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
|
Teresa_Chang
一般會員 發表:41 回覆:42 積分:16 註冊:2004-05-04 發送簡訊給我 |
|
Teresa_Chang
一般會員 發表:41 回覆:42 積分:16 註冊:2004-05-04 發送簡訊給我 |
|
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
以下是我的source code,因為是我的project,所以我沒辦法公佈所有的code,這是主要做三角化的部份,我是照書上的內容抄的,只做了一些改變
int i,j,k,m; double xn,yn,zn; int flag; triangle_no=0; //透過Delaunay Triangulation,求出三角形個數 int i_count=0; dx[0]=point[vertex].coordinate_x; dy[0]=point[vertex].coordinate_y; dz[0]=dx[0]*dx[0] dy[0]*dy[0]; for(i=0;i dx[i_count 1]=point[vertex].Neighbor[i_count].coordinate_x; dy[i_count 1]=point[vertex].Neighbor[i_count].coordinate_y; dz[i_count 1]=dx[i_count 1]*dx[i_count 1] dy[i_count 1]*dy[i_count 1]; i_count ; } for (i = 0; i for (k = i 1; k < neighbor_number; k ) { if(j!=k) { xn=(dy[j]-dy[i])*(dz[k]-dz[i]) - (dy[k]-dy[i])*(dz[j]-dz[i]); yn=(dx[k]-dx[i])*(dz[j]-dz[i]) - (dx[j]-dx[i])*(dz[k]-dz[i]); zn=(dx[j]-dx[i])*(dy[k]-dy[i]) - (dx[k]-dx[i])*(dy[j]-dy[i]); if(flag =(zn<0)) for (m = 0; m < neighbor_number; m ) flag=flag&& ( (dx[m]-dx[i])*xn (dy[m]-dy[i])*yn (dz[m]-dz[i])*zn <=0); if(flag) { triangle_no ; } } } int counter=0;//目前三角形 //求出Delaunay Triangulation int find_vertex=0; for (i = 0; i for (k = i 1; k < neighbor_number; k ) { if(j!=k) { xn=(dy[j]-dy[i])*(dz[k]-dz[i]) - (dy[k]-dy[i])*(dz[j]-dz[i]); yn=(dx[k]-dx[i])*(dz[j]-dz[i]) - (dx[j]-dx[i])*(dz[k]-dz[i]); zn=(dx[j]-dx[i])*(dy[k]-dy[i]) - (dx[k]-dx[i])*(dy[j]-dy[i]); if(flag =(zn<0)) for (m = 0; m < neighbor_number; m ) flag=flag&& ( (dx[m]-dx[i])*xn (dy[m]-dy[i])*yn (dz[m]-dz[i])*zn <=0); if(flag) { AnsiString voronoi_center="v" IntToStr(vertex); if(i==0) { StringGrid1->Cells[0][counter]=voronoi_center; StringGrid1->Cells[1][counter]=point[point[vertex].Neighbor[j].vertex_ID.SubString(2,point[vertex].Neighbor[j].vertex_ID.Length()-1).ToInt()].vertex_ID; StringGrid1->Cells[2][counter]=point[point[vertex].Neighbor[k].vertex_ID.SubString(2,point[vertex].Neighbor[k].vertex_ID.Length()-1).ToInt()].vertex_ID; V_Memo->Lines->Add("v" IntToStr(vertex) " " StringGrid1->Cells[0][counter] " " StringGrid1->Cells[1][counter] " " StringGrid1->Cells[2][counter]); } if(j==0) { StringGrid1->Cells[0][counter]=point[point[vertex].Neighbor[i].vertex_ID.SubString(2,point[vertex].Neighbor[i].vertex_ID.Length()-1).ToInt()].vertex_ID; StringGrid1->Cells[1][counter]=voronoi_center; StringGrid1->Cells[2][counter]=point[point[vertex].Neighbor[k].vertex_ID.SubString(2,point[vertex].Neighbor[k].vertex_ID.Length()-1).ToInt()].vertex_ID; V_Memo->Lines->Add("v" IntToStr(vertex) " " StringGrid1->Cells[0][counter] " " StringGrid1->Cells[1][counter] " " StringGrid1->Cells[2][counter]); } if(k==0) { StringGrid1->Cells[0][counter]=point[point[vertex].Neighbor[i].vertex_ID.SubString(2,point[vertex].Neighbor[i].vertex_ID.Length()-1).ToInt()].vertex_ID; StringGrid1->Cells[1][counter]=point[point[vertex].Neighbor[j].vertex_ID.SubString(2,point[vertex].Neighbor[j].vertex_ID.Length()-1).ToInt()].vertex_ID; StringGrid1->Cells[2][counter]=voronoi_center; V_Memo->Lines->Add("v" IntToStr(vertex) " " StringGrid1->Cells[0][counter] " " StringGrid1->Cells[1][counter] " " StringGrid1->Cells[2][counter]); } if( (StringGrid1->Cells[0][counter]==voronoi_center)) { StringGrid2->Cells[0][find_vertex]=StringGrid1->Cells[1][counter]; find_vertex ; StringGrid2->Cells[0][find_vertex]=StringGrid1->Cells[2][counter]; find_vertex ; } if( (StringGrid1->Cells[1][counter]==voronoi_center)) { StringGrid2->Cells[0][find_vertex]=StringGrid1->Cells[0][counter]; find_vertex ; StringGrid2->Cells[0][find_vertex]=StringGrid1->Cells[2][counter]; find_vertex ; } if( (StringGrid1->Cells[2][counter]==voronoi_center)) { StringGrid2->Cells[0][find_vertex]=StringGrid1->Cells[0][counter]; find_vertex ; StringGrid2->Cells[0][find_vertex]=StringGrid1->Cells[1][counter]; find_vertex ; } counter ; } } } |
Teresa_Chang
一般會員 發表:41 回覆:42 積分:16 註冊:2004-05-04 發送簡訊給我 |
|
Teresa_Chang
一般會員 發表:41 回覆:42 積分:16 註冊:2004-05-04 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |