gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
阅读:9756回复:14

三角网的生成算法

楼主#
更多 发布于:2005-08-19 12:03
<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>
喜欢0 评分0
zhanlijun
路人甲
路人甲
  • 注册日期2007-10-11
  • 发帖数3
  • QQ
  • 铜币109枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2008-07-08 19:23
举报 回复(0) 喜欢(0)     评分
yangzhil
路人甲
路人甲
  • 注册日期2007-08-13
  • 发帖数74
  • QQ
  • 铜币302枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2008-01-27 13:27
<img src="images/post/smile/dvbbs/em02.gif" /><img src="images/post/smile/dvbbs/em01.gif" />
举报 回复(0) 喜欢(0)     评分
whmwxhanshan123
路人甲
路人甲
  • 注册日期2006-06-17
  • 发帖数3108
  • QQ
  • 铜币6445枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2006-12-02 22:51
无法编译,还缺个函数<img src="images/post/smile/dvbbs/em02.gif" />
举报 回复(0) 喜欢(0)     评分
sinclairmu76wjb
路人甲
路人甲
  • 注册日期2006-04-01
  • 发帖数23
  • QQ
  • 铜币192枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2006-11-02 20:16
<P>太好了,谢谢</P>
举报 回复(0) 喜欢(0)     评分
lyzlrz
路人甲
路人甲
  • 注册日期2006-09-12
  • 发帖数3
  • QQ
  • 铜币118枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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" />
举报 回复(0) 喜欢(0)     评分
cwcjcwcj
路人甲
路人甲
  • 注册日期2006-01-17
  • 发帖数7
  • QQ
  • 铜币132枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2006-07-11 23:35
另外好像没有主函数。只是一个类的定义。
举报 回复(0) 喜欢(0)     评分
cwcjcwcj
路人甲
路人甲
  • 注册日期2006-01-17
  • 发帖数7
  • QQ
  • 铜币132枚
  • 威望0点
  • 贡献值0点
  • 银元0个
7楼#
发布于:2006-07-11 21:12
麻烦老大把头文件WGraphics.h补一下哦,要不这个程序无法运行,自定义的头文件。。。
举报 回复(0) 喜欢(0)     评分
jinwei0502
路人甲
路人甲
  • 注册日期2006-05-26
  • 发帖数23
  • QQ
  • 铜币157枚
  • 威望0点
  • 贡献值0点
  • 银元0个
8楼#
发布于:2006-06-28 22:13
看不懂!
举报 回复(0) 喜欢(0)     评分
robinshe
路人甲
路人甲
  • 注册日期2006-06-13
  • 发帖数4
  • QQ
  • 铜币120枚
  • 威望0点
  • 贡献值0点
  • 银元0个
9楼#
发布于:2006-06-13 16:33
请问.WGraphics.h 头文件怎么写哦.
举报 回复(0) 喜欢(0)     评分
上一页
游客

返回顶部