三角网生成
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;