阅读:10307回复:14
三角网的生成算法
<PRE>#ifndef TIN_H
#define TIN_H #include<iostream> #include<cmath> #include<vector> #include<fstream> #include"WGraphics.h" using namespace std; typedef struct mo { int m; int n; int mark; }mo; typedef struct o { double x; double y; }Point; typedef struct sample//文件读入的采样点结构 { Point point; int Mark; int Number;//采样点编号 }Sample; class TIN { public: void GetData(); void Display(int scale); //--------------------------------------------------------------------- ~TIN() { delete [] dot; } inline double Distance(Point p1,Point p2)//计算两点之间的距离 { return(sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y))); } //---------------------------------------------------------------------------- inline double ComputeAngle(Point p1,Point p2,Point p3)//计算角C的弧度 { double a=Distance(p2,p3); double b=Distance(p3,p1); double c=Distance(p1,p2); return acos((a*a+b*b-c*c)/(2*a*b)); } //-------------------------------------------------------------------------------- inline int F(Point p1,Point p2,Point p3)//计算点在直线的区间 { double A=(p2.y-p1.y)/(p2.x-p1.x); double B=(p1.y*p2.x-p2.y*p1.x)/(p2.x-p1.x); double f=p3.y-A*p3.x-B; if(f>0) return 1; else if(f<0) return -1; else return 0; } //-------------------------------------------------------------------------------- int Search(int p1,int p2,int p3); //检查三角形是否重复或交叉 //-------------------------------------------------------------------------------- int Extend(int p1,int p2,int p3);//以p1,p2位基边扩展三角形 //-------------------------------------------------------------------------------- void Terminal(int key); //---------------------------------------------------------------------- protected: vector<int> t1; vector<int> t2; vector<int> t3; int K; int L; Sample * dot; int N; }; #endif int TIN::Search(int p1,int p2,int p3) //检查三角形是否重复或交叉 { mo Field[7]; Field[1].m=p1; Field[1].n=p2; Field[1].mark=0; Field[2].m=p2; Field[2].n=p1; Field[2].mark=0; Field[3].m=p1; Field[3].n=p3; Field[3].mark=0; Field[4].m=p3; Field[4].n=p1; Field[4].mark=0; Field[5].m=p2; Field[5].n=p3; Field[5].mark=0; Field[6].m=p3; Field[6].n=p2; Field[6].mark=0; for(int i=1;i<=L;i++) { for(int j=1;j<7;j++) { if((Field[j].m==t1 || Field[j].m==t2 || Field[j].m==t3) ;; (Field[j].n==t1 || Field[j].n==t2 || Field[j].n==t3) ) Field[j].mark++; } } for( i=1;i<7;i++) if(Field.mark==2) return true; return false;//三角形没有重复 } //------------------------------------------------------ int TIN::Extend(int p1,int p2,int p3)//以p1,p2为基线生成三角形 { int m=F(dot[p1].point,dot[p2].point,dot[p3].point); double Angle1=0; double Angle2=0; int sign=0; for(int i=1;i<=N;i++) { dot.Mark=F(dot[p1].point,dot[p2].point,dot.point); if(dot.Mark+m==0 ) { Angle2=ComputeAngle(dot[p1].point,dot[p2].point,dot.point); if(Angle2>Angle1) { Angle1=Angle2; sign=i; } } } if(sign!=0 ;; !Search(p1,p2,sign)) { L++; t1.push_back(p1); t2.push_back(p2); t3.push_back(sign); return sign;//新生成三角形找到了 } else return 0; } //-------------------------------------------------------------------- void TIN::Terminal(int key) { K=0; L=1; t1.push_back(0); t2.push_back(0); t3.push_back(0); int a,b,c; double dis1=999999999; double dis2; double angle1=0; double angle2=0; int m; for(int i=1;i<=N;i++) { if(key!=i) {dis2=Distance(dot[key].point,dot.point); if(dis2<dis1) { m=i; dis1=dis2; } } } t1.push_back(key); t2.push_back(m); for(i=1;i<=N;i++) { angle2=ComputeAngle(dot[t1[1]].point,dot[t2[1]].point,dot.point); if(angle2>angle1) { angle1=angle2; m=i; } } t3.push_back(m); //********************************第一个种子三角形生成 while(K!=L) { K++; a=Extend(t1[K],t2[K],t3[K]); b=Extend(t2[K],t3[K],t1[K]); c=Extend(t3[K],t1[K],t2[K]); } } //----------------------------------------------------------------------- void TIN::GetData() { ifstream in_stream; in_stream.open("data2.txt"); if(in_stream==NULL) exit(0); in_stream>>N; dot=new Sample[N+1]; for(int i=1;i<=N;i++) in_stream>>dot.Number>>dot.point.x>>dot.point.y; in_stream.close(); } //-------------------------------------------------------------------------- void TIN::Display(int scale) { //cout<<t1.size()<<endl; SetColor(RGB(0,255,0)); for(int i=1;i<t1.size();i++) { //cout<<t1<<" "<<t2<<" "<<t3<<endl; DrawLine((long)(dot[t1].point.x*scale+20),(long)(600-dot[t1].point.y*scale),(long)(dot[t2].point.x*scale+20),(long)(600-dot[t2].point.y*scale)); DrawLine((long)(dot[t2].point.x*scale+20),(long)(600-dot[t2].point.y*scale),(long)(dot[t3].point.x*scale+20),(long)(600-dot[t3].point.y*scale)); DrawLine((long)(dot[t3].point.x*scale+20),(long)(600-dot[t3].point.y*scale),(long)(dot[t1].point.x*scale+20),(long)(600-dot[t1].point.y*scale)); } }</PRE> |
|
|
1楼#
发布于:2008-07-08 19:23
好
|
|
2楼#
发布于:2008-01-27 13:27
<img src="images/post/smile/dvbbs/em02.gif" /><img src="images/post/smile/dvbbs/em01.gif" />
|
|
3楼#
发布于:2006-12-02 22:51
无法编译,还缺个函数<img src="images/post/smile/dvbbs/em02.gif" />
|
|
4楼#
发布于:2006-11-02 20:16
<P>太好了,谢谢</P>
|
|
5楼#
发布于:2006-10-01 01:55
不错!!!!<img src="images/post/smile/dvbbs/em02.gif" /><img src="images/post/smile/dvbbs/em02.gif" /><img src="images/post/smile/dvbbs/em02.gif" />
|
|
6楼#
发布于:2006-07-11 23:35
另外好像没有主函数。只是一个类的定义。
|
|
7楼#
发布于:2006-07-11 21:12
麻烦老大把头文件WGraphics.h补一下哦,要不这个程序无法运行,自定义的头文件。。。
|
|
8楼#
发布于:2006-06-28 22:13
看不懂!
|
|
9楼#
发布于:2006-06-13 16:33
请问.WGraphics.h 头文件怎么写哦.
|
|
上一页
下一页