三角网生长算法构建TIN

更新时间:2023-07-14 07:38:26 阅读: 评论:0

三⾓⽹⽣长算法构建TIN 三⾓⽹⽣长算法构建TIN
!三⾓⽹⽣长算法原理
以下截图来源于《数字⾼程模型》⼀书
1、构建三⾓形和点存储结构
public string Filename;
public System.Drawing.Bitmap curBitmap;
public Form1()
{
InitializeComponent();
}资料员年终总结
int[] t1 =new int[1000];
int[] t2 =new int[1000];
int[] t3 =new int[1000];
//创建⾼程点的结构,存储⾼程点的名称,X、Y坐标,⾼程H值
public struct Point
{
public int Number;
public string Name;//存储点的名称
public double x;//存储点的X坐标
public double y;//存储点的Y坐标
public double h;//存储点的⾼程值H
}
Point[] pt =new Point[1000];//定义初始的点数组⼤⼩为1000
int Lines;//记录⽂件的⾏数,即点的个数
double xmax, xmin, ymax, ymin;//记录所有点中的x,y坐标最⼤最⼩值
芥蓝的功效与作用
int K;
2、打开⾼程点数据⽂件
//打开⾼程点数据⽂件
private void打开OToolStripMenuItem_Click(object nder, EventArgs e)
{
OpenFileDialog filename =new OpenFileDialog();
filename.Filter ="All files(*.*)|*.*|txt files(*.txt)|*.txt|dat files(*.dat)|*.dat";
filename.FilterIndex =2;
//filename.RestoreDirectory = true;
if(filename.ShowDialog()== DialogResult.OK)
{
百变qq
Filename = filename.FileName.ToString();
string[] lines = File.ReadAllLines(Filename);
Lines = lines.Length;
for(int i =1; i <= Lines; i++)
{
string[] sArray = lines[i -1].Split(',');//按","将每⼀⾏分割成四个字符串                    pt[i].Number = i;
pt[i].Name = sArray[0];
见到你们格外亲pt[i].x = Convert.ToDouble(sArray[1]);
pt[i].y = Convert.ToDouble(sArray[2]);
pt[i].h = Convert.ToDouble(sArray[3]);
}
}
}
3、确定所有点的范围
//确定所有点的范围
private void Area()
{
xmax = xmin = pt[1].x;
ymax = ymin = pt[1].y;
for(int i =2; i <= Lines; i++)
{
if(xmax < pt[i].x) xmax = pt[i].x;
if(xmin > pt[i].x) xmin = pt[i].x;
if(ymax < pt[i].y) ymax = pt[i].y;
if(ymin > pt[i].y) ymin = pt[i].y;
}
}
4、计算坐标转换⽐例因⼦
//计算坐标转换⽐例因⼦
public double CalcScale()
{
Area();
Rectangle m_rect = pictureBox1.ClientRectangle;
double ds =1.0;
double dsx, dsy;
if((xmax - xmin !=0)&&(ymax - ymin !=0))
{
dsx = Math.Abs((xmax - xmin)/ m_rect.Height);
dsy = Math.Abs((ymax - ymin)/ m_rect.Width);
ds = Math.Max(dsx, dsy);
北京理工大学邮编}
el
{
if(xmax - xmin !=0)
{
ds = Math.Abs((xmax - xmin)/ m_rect.Height);
}
el
{
if(ymax - ymin !=0)
{
ds = Math.Abs((ymax - ymin)/ m_rect.Width);
}
el{ ds =1;}
}
}
return ds;
}
5、找到最近的两个⾼程点
//找到两个最近的⾼程点
public void MinDistance(Point[] pt,out int pt1,out int pt2)
{
int i, j;
double[,] Distance =new double[Lines, Lines];
//将任意两点间的距离存储到矩阵Distance中
for(i =1; i <= Lines; i++)
for(j = i +1; j < Lines; j++)
if(i != j)
Distance[i, j]= Math.Sqrt(Math.Pow(pt[i].x - pt[j].x,2)+ Math.Pow(pt[i].y - pt[j].y,2));
double[] Mindistance ={10000,0,0};
//找到矩阵Distance中的最⼩值,并记录⾏列号
for(i =1; i <= Lines; i++)
for(j = i +1; j < Lines; j++)
if(Mindistance[0]> Distance[i, j])
{
Mindistance[0]= Distance[i, j];
Mindistance[1]= i;
Mindistance[2]= j;
}
pt1 =(int)Mindistance[1];
pt2 =(int)Mindistance[2];
}
6、找到离中点最近的点
//找到离中点最近的点
public void Find(int pt1,int pt2,out int pt3)
{
int i;
double meanx =(pt[pt1].x + pt[pt2].x)/2;
工程联系函模板
double meany =(pt[pt1].y + pt[pt2].y)/2;
double Min =10000000000;
pt3 =0;
for(i =1; i <= Lines; i++)
{
if(i != pt1 && i != pt2)
{
double temp = Math.Sqrt(Math.Pow(pt[i].x - meanx,2)+ Math.Pow(pt[i].y - meany,2));
if(Min > temp)
{
Min = temp;
pt3 = i;
}
}
}
}
7、判断三⾓形扩展是否在同⼀侧
//判断三⾓形扩展点是否在同⼀侧
public bool Direction(int point1,int point2,int point3,int point4)
{
//计算直线⽅程的系数a,b
double a =(pt[point2].y - pt[point1].y)/(pt[point2].x - pt[point1].x);
double b =(pt[point1].x * pt[point2].y - pt[point2].x * pt[point1].y)/(pt[point2].x - pt[point1].x);
如何提高网速double fxy1 = pt[point3].y -(a * pt[point3].x - b);
double fxy2 = pt[point4].y -(a * pt[point4].x - b);
//当位于⾮同⼀侧时
if(fxy1 <0&& fxy2 >0|| fxy1 >0&& fxy2 <0)
return true;
//当位于同⼀侧时
el return fal;
}
8、计算扩展边的⾓度余弦值
//计算扩展边的⾓度余弦值
public double Angle(int pt1,int pt2,int pt3)
{
double angle;
double L1 = Math.Sqrt((pt[pt2].x - pt[pt3].x)*(pt[pt2].x - pt[pt3].x)+(pt[pt2].y - pt[pt3].y)*(pt[pt2].y - pt[pt3].y));
double L2 = Math.Sqrt((pt[pt1].x - pt[pt3].x)*(pt[pt1].x - pt[pt3].x)+(pt[pt1].y - pt[pt3].y)*(pt[pt1].y - pt[pt3].y));
double L3 = Math.Sqrt((pt[pt2].x - pt[pt1].x)*(pt[pt2].x - pt[pt1].x)+(pt[pt2].y - pt[pt1].y)*(pt[pt2].y - pt[pt1].y));            angle =(L1 * L1 + L2 * L2 - L3 * L3)/(2* L1 * L2);
return angle;
}
9、找到扩展边形成张⾓最⼤的点
/
/找到扩展边形成张⾓最⼤的点
private int MaxAngle(int[] x,int A,int B,int n)
{
double C =0, temp, s =0;
int max =0;
for(int i =1; i <= n; i++)
{
if(x[i]!= A && x[i]!= B)
{
s =Angle(A, B, x[i]);
if(s <1)
C = Math.Acos(s);
el C =0;
max = x[i];
break;
}
}
猫头鹰英语怎么说for(int i =1; i <= n; i++)
{
if(i != A && i != B)
{
s =Angle(A, B, x[i]);
if(s <1)
temp = Math.Acos(s);
el temp =0;
if(temp > C)
{
C = temp;
max = x[i];
}
}
}
return max;
}
10、判断三⾓形的⼀条边是否已经出现过两次

本文发布于:2023-07-14 07:38:26,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1080891.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:扩展   程点   计算   找到   坐标
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图