利用C#生成一个简单的TIN三角网

本文介绍了一种从TXT文件读取数据的方法,并详细展示了如何使用这些数据来构建TIN三角网。该过程包括数据输入、TIN三角网的生成算法及关键步骤的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

###输入TXT数据

private void inputbutton_Click(object sender, EventArgs e)
        {
            OpenFileDialog opg = new OpenFileDialog();
            opg.Title = "选择文本数据";
            opg.Filter = "Txt数据(*.txt)|*.txt";
            opg.ShowDialog();
            strName = opg.FileName;
            if (strName == "") return;
            inputBox.Text = strName;
            FileStream fs = new FileStream(strName, FileMode.Open);
            StreamReader sr = new StreamReader(fs, Encoding.Default);
            string strLine = sr.ReadLine();
            while (strLine != "" && strLine != null)
            {
                Lines.Add(strLine);
                Console.WriteLine(strLine);
                strLine = sr.ReadLine();
            }
            Point point = new Point();
            for (int i = 1; i < Lines.Count; i++)
            {

                string[] strArray = Lines[i].Split(charArray);
                //point. = Convert.ToInt32(strArray[0]);
                point.X = Convert.ToInt32(strArray[1]);
                point.Y = Convert.ToInt32(strArray[2]);
                pointList.Add(point);
               
            }
            
        }

###生成TIN三角网

private void probutton_Click(object sender, EventArgs e)
        {
            g = this.CreateGraphics();
            double ang;
            this.Refresh();
            ArrayList tinlines = new ArrayList();
            //定义与第一点最近的点
            double mindis = Distance((Point)pointList[0], (Point)pointList[1]);
            double dis;
            int count = 1;
            TinLine tl = new TinLine();
            for(int i = 1;i<pointList.Count ;i++)
            {
                dis = Distance((Point)pointList[0], (Point)pointList[i]);
                if (dis < mindis)
                {
                    mindis = dis;
                    count = i;
                }
            }
            //将第一条边反向已进行三角形扩展
            tl.Begin = (Point)pointList[0];
            tl.End = (Point)pointList[count];
            tinlines.Add(tl);
            TinLine line = new TinLine();
            Point a = ((TinLine)tinlines[0]).Begin;
            Point b = ((TinLine)tinlines[0]).End;
            line.Begin = b;
            line.End = a;
            tinlines.Add(line);
            //对每一条边进行扩展
            for (int j = 0; j < tinlines.Count; j++)
            {
                double minang = 0;
                bool OK;
                OK = false;
                TinLine tling1 = new TinLine();
                TinLine tling2 = new TinLine();
                for (int i = 0; i < pointList.Count; i++)
                {
                    int youbian;
                    //判断第三点与前两点的位置关系
                    youbian = ZuoYou((Point)pointList[i], ((TinLine)tinlines[j]).Begin, ((TinLine)tinlines[j]).End);
                    if (youbian == 1)
                    {
                        //获取角度最大点
                        ang = Angle((Point)pointList[i], ((TinLine)tinlines[j]).Begin, ((TinLine)tinlines[j]).End);
                        if (ang > minang)
                        {
                            minang = ang;
                            count = i;
                        }
                        OK = true;
                    }

                }
                if (OK == true)
                {
                    //将新生成两条边添加入集合中
                    int t1 = 0;
                    int t2 = 0;
                    tling1.Begin = ((TinLine)tinlines[j]).Begin;
                    tling1.End = (Point)pointList[count];
                    tling2.Begin = (Point)pointList[count];
                    tling2.End = ((TinLine)tinlines[j]).End;
                    tinlines.Add(tling1);
                    tinlines.Add(tling2);
                    for (int i = 0; i < tinlines.Count - 2;i++ )
                    {
                        //判断新生成的两边是否与已生成的边重合
                        if ((tling2.Begin == ((TinLine)tinlines[i]).Begin && tling2.End == ((TinLine)tinlines[i]).End)|| 
                            (tling2.Begin == ((TinLine)tinlines[i]).End && tling2.End == ((TinLine)tinlines[i]).Begin))
                        {
                            t2 = 1;
                        }
                        if ((tling1.Begin == ((TinLine)tinlines[i]).Begin && tling1.End == ((TinLine)tinlines[i]).End) || 
                            (tling1.Begin == ((TinLine)tinlines[i]).End && tling1.End == ((TinLine)tinlines[i]).Begin))
                        {
                            t1 = 1;

                        }
                    }
                    //两条边都重合
                    if (t2 == 1 && t1 == 1)
                    {
                        for (int i = 0; i < 2;i++ )
                        {
                            tinlines.Remove(tinlines[tinlines.Count - 1]);
                        }
                    }
                    //第二条边重合
                    else if (t2 == 1)
                    {
                        tinlines.Remove(tinlines[tinlines.Count - 1]);
                    }
                    //第一条边重合
                    else if (t1 == 1)
                    {
                        tinlines.Remove(tinlines[tinlines.Count - 2]);
                    }                        
                }
            }
            tinlines.Remove(tinlines[0]);//将集合中的第一条边删除
            Pen pen = new Pen(Color.Red, 1);
            for (int i = 0; i <= tinlines.Count - 1; i++)
            {
                g.DrawLine(pen, ((TinLine)tinlines[i]).Begin, ((TinLine)tinlines[i]).End);
            }
            g.Dispose();

        }

###程序中用到的自定义方法

public double Distance(Point a, Point b)
        {
            double d;
            d = Math.Sqrt((b.X - a.X) * (b.X - a.X) + (b.Y - a.Y) * (b.Y - a.Y));

            return d;
        }
        public int ZuoYou(Point c, Point a, Point b)
        {
            int youbian;
            double S;
            S = (a.X - c.X) * (b.Y - c.Y) - (a.Y - c.Y) * (b.X - c.X);
            if (S > 0)
            {
                youbian = 1;
            }
            else if (S < 0)
            {
                youbian = -1;
            }
            else
            {
                youbian = 0;
            }
            return youbian;
        }
        public double Angle(Point c, Point a, Point b)
        {
            double ang;
            double l1 = Math.Sqrt((b.X - c.X) * (b.X - c.X) + (b.Y - c.Y) * (b.Y - c.Y));
            double l2 = Math.Sqrt((a.X - c.X) * (a.X - c.X) + (a.Y - c.Y) * (a.Y - c.Y));
            double l3 = Math.Sqrt((b.X - a.X) * (b.X - a.X) + (b.Y - a.Y) * (b.Y - a.Y));
            ang = Math.Acos((l1 * l1 + l2 * l2 - l3 * l3) / (2 * l1 * l2));
            return ang;
        }
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值