三角网生成

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数字地面模型

实验报告

实验名称:三角网生成

学名:***

序号:**

班级:******

2012年 5 月 10日

一、实验名称

三角网生成

二、实验目的

根据已学的数字地面模型中的三角网相关知识,编写一个自动生成三角网的程序。

三、实验内容

1. 在网上查找关于三角网生成算法的论文

2. 分析与研究三角网生成算法

3. 选择一种算法实现三角网的生成(三角网生长算法)

4. 选择一种语言编写三角网的生成代码(C#)

四、源程序

using System;

using System.Collections.Generic;

using ponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Collections;

namespace凸包

{

public partial class Form1 : Form

{

private Graphics g = null;

private Pen pen = new Pen(Color.Red, 1);

private Brush brush = Brushes.Red;

private ArrayList list = new ArrayList();

private ArrayList linelist = new ArrayList();

public Form1()

{

InitializeComponent();

}

private void Form1_MouseDown(object sender, MouseEventArgs e)

{

g = this.CreateGraphics();

g.FillEllipse(brush, e.X, e.Y, 5, 5);

list.Add(e.Location);

}

private void TuBao(Point A,Point B,ArrayList C)//判断C中所有点是否在A,B连线的同一侧。。。。

{

int count;

count = 0;

foreach (Point D in C)

{

//int count;

double z;

//count = 0;

z = (D.X - A.X) * (B.Y - A.Y) / (B.X - A.X) + A.Y;

if (z > D.Y)

{

count++;

}

}

if (count == list.Count - 2||count==0)

{

Line line = new Line();

line.Begin = A;

line.End = B;

linelist.Add(line);

line = null;

}

}

private void button1_Click(object sender, EventArgs e)

{

for (int i = 0; i

{

for (int j = i + 1; j < list.Count; j++)

{

TuBao((Point)list[i], (Point)list[j], list);

}

}

for (int i = 0; i <= linelist.Count-1; i++)

{

g.DrawLine(pen,((Line)linelist[i]).Begin,((Line)linelist[i]).End);

}

}

public float Angle(Point cen, Point first, Point second)//三个点的夹角CEN为顶点

{

float dx1, dx2, dy1, dy2;

float angle;

dx1 = first.X - cen.X;

dy1 = first.Y - cen.Y;

dx2 = second.X - cen.X;

dy2 = second.Y - cen.Y;

float c = (float)Math.Sqrt(dx1 * dx1 + dy1 * dy1) * (float)Math.Sqrt(dx2 * dx2 + dy2 * dy2);

if (c == 0) return -1;

angle = (float)Math.Acos((dx1 * dx2 + dy1 * dy2) / c);

return angle;

}

public double Distance(Point first, Point second)//两点距离

{

double dis;

dis = Math.Sqrt((second.Y - first.Y) * (second.Y - first.Y) + (second.X - first.X) * (second.X - first.X));

return dis;

}

private void button2_Click(object sender, EventArgs e)

{

double ang;

ArrayList tinline = new ArrayList();

/*******与第一点最近的点********/

double mindis = 1000000000000;

double dis;

int count=0;

Line tl = new Line();

for (int i = 1; i < list.Count; i++)

{

dis = Distance((Point)list[0], (Point)list[i]);

if (dis < mindis)

{

mindis = dis;

count = i;

}

}

tl.Begin =(Point)list[0];

tl.End = (Point)list[count];

// tl.ID = 1;

相关文档
最新文档