📄 三角网生成.txt
字号:
#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[i] || Field[j].m==t2[i] || Field[j].m==t3[i]) && (Field[j].n==t1[i] || Field[j].n==t2[i] || Field[j].n==t3[i]) )
Field[j].mark++;
}
}
for( i=1;i<7;i++)
if(Field[i].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[i].Mark=F(dot[p1].point,dot[p2].point,dot[i].point);
if(dot[i].Mark+m==0 )
{
Angle2=ComputeAngle(dot[p1].point,dot[p2].point,dot[i].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[i].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[i].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[i].Number>>dot[i].point.x>>dot[i].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[i]<<" "<<t2[i]<<" "<<t3[i]<<endl;
DrawLine((long)(dot[t1[i]].point.x*scale+20),(long)(600-dot[t1[i]].point.y*scale),(long)(dot[t2[i]].point.x*scale+20),(long)(600-dot[t2[i]].point.y*scale));
DrawLine((long)(dot[t2[i]].point.x*scale+20),(long)(600-dot[t2[i]].point.y*scale),(long)(dot[t3[i]].point.x*scale+20),(long)(600-dot[t3[i]].point.y*scale));
DrawLine((long)(dot[t3[i]].point.x*scale+20),(long)(600-dot[t3[i]].point.y*scale),(long)(dot[t1[i]].point.x*scale+20),(long)(600-dot[t1[i]].point.y*scale));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -