⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 三角网生成.txt

📁 VC++下的不规则三角网生成算法,这是不规则三角网的生长算法,通过建立TIN类,在TIN类内实现一些方法.
💻 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 + -