Esempio n. 1
0
 bool isSameLine(TinLine line1, TinLine line2)
 {
     if (((line1.id1 == line2.id1) && (line1.id2 == line2.id2)) || ((line1.id1 == line2.id2) && (line1.id2 == line2.id1)))
     {
         return(true);
     }
     return(false);
 }
Esempio n. 2
0
        bool isTwice(TinLine _line)
        {
            int lineCount = 0;

            for (int ii = 0; ii < linesArray.Count; ii++)
            {
                TinLine pTempLine = linesArray[ii];
                if (isSameLine(pTempLine, _line))
                {
                    lineCount++;
                }
            }
            if (lineCount == 2)
            {
                return(true);
            }
            return(false);
        }
Esempio n. 3
0
        private void 画图ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //定义与第一点最近的点
            double minDist = Distance(zbArray[0], zbArray[1]);
            double dis;
            int    nearPtId = 1;

            for (int i = 0; i < zbArray.Count; i++)
            {
                dis = Distance(zbArray[0], zbArray[i]);
                if (dis < minDist)
                {
                    minDist  = dis;
                    nearPtId = i;
                }
            }
            //if (nearPtId == -1)
            //    return;
            //将第一条边反向已进行三角形扩展
            TinLine tl = new TinLine();

            tl.id1   = 0;
            tl.id2   = nearPtId;
            tl.Begin = zbArray[0];
            tl.End   = zbArray[nearPtId];
            linesArray.Add(tl);
            for (int j = 0; j < linesArray.Count; j++)
            {
                //TinLine line = linesArray[j];
                //if (isTwice(line))
                //    continue;
                double ang;
                double maxAngs    = double.MinValue;
                int    maxAngPtId = -1;
                bool   ok         = false;
                for (int i = 0; i < zbArray.Count; i++)
                {
                    int youbian;
                    //判断第三点与前两点的位置关系
                    youbian = ZuoYou(linesArray[j].Begin, linesArray[j].End, zbArray[i]);
                    //youbian = ZuoYou(zbArray[linesArray[j].id1], zbArray[linesArray[j].id2], zbArray[i]);
                    if (youbian == 1)
                    {
                        //获取角度最大点
                        ang = Angle(linesArray[j].Begin, linesArray[j].End, zbArray[i]);
                        //ang = Angle(zbArray[linesArray[j].id1], zbArray[linesArray[j].id2], zbArray[i]);
                        if (ang > maxAngs)
                        {
                            maxAngs    = ang;
                            maxAngPtId = i;
                        }
                        ok = true;
                    }
                }
                if (ok == true)
                {
                    TinLine tline1 = new TinLine();
                    TinLine tline2 = new TinLine();
                    //将新生成两条边添加入集合中
                    int t1 = 0;
                    int t2 = 0;
                    tline1.id1 = linesArray[j].id1;
                    tline1.id2 = maxAngPtId;
                    tline2.id1 = linesArray[j].id2;
                    tline2.id2 = maxAngPtId;

                    tline1.Begin = linesArray[j].Begin;
                    tline1.End   = zbArray[maxAngPtId];
                    tline2.Begin = zbArray[maxAngPtId];
                    tline2.End   = linesArray[j].End;
                    //将三角顶点的编号添加顶点集合中
                    tagTri Vertex = new tagTri();
                    Vertex.id1 = linesArray[j].id1;
                    Vertex.id2 = linesArray[j].id2;
                    Vertex.id3 = maxAngPtId;
                    for (int i = 0; i < linesArray.Count; i++)
                    {
                        if ((tline1.Begin.x == linesArray[i].Begin.x && tline1.End.x == linesArray[i].End.x) ||
                            (tline1.Begin.x == linesArray[i].End.x && tline1.End.x == linesArray[i].Begin.x))
                        {
                            t1 = 1;
                        }
                        if ((tline2.Begin.x == linesArray[i].Begin.x && tline2.End.x == linesArray[i].End.x) ||
                            (tline2.Begin.x == linesArray[i].End.x && tline2.End.x == linesArray[i].Begin.x))
                        {
                            t2 = 1;
                        }

                        //if ((tline1.id1 == linesArray[i].id1 && tline1.id2 == linesArray[i].id2) ||
                        //  (tline1.id1 == linesArray[i].id2 && tline1.id2 == linesArray[i].id1))
                        //{
                        //    t1 = 1;
                        //}
                        //if ((tline2.id1 == linesArray[i].id1 && tline2.id2 == linesArray[i].id2) ||
                        //  (tline2.id1 == linesArray[i].id2 && tline2.id2 == linesArray[i].id1))
                        //{
                        //    t2 = 1;
                        //}
                    }
                    if (t1 == 0)
                    {
                        linesArray.Add(tline1);
                        VertexArray.Add(Vertex);
                    }
                    if (t2 == 0)
                    {
                        linesArray.Add(tline2);
                        VertexArray.Add(Vertex);
                    }
                    if (t1 == 0 && t2 == 0)
                    {
                        VertexArray.Remove(Vertex);
                    }
                }
            }
            #region
            //MessageBox.Show("Array length=" + linesArray.Count);
            //MessageBox.Show("VertexArray length=" + VertexArray.Count);
            //double minX = Double.MaxValue;//zbArray[0].x;
            //double minY = Double.MaxValue;// zbArray[0].y;
            //double maxX = Double.MinValue;//szbArray[0].x;
            //double maxY = Double.MinValue;// zbArray[0].y;
            //for (int i = 0; i < zbArray.Count; i++)
            //{
            //    double x0 = zbArray[i].x;
            //    double y0 = zbArray[i].y;
            //    if (x0 > maxX)
            //    {
            //        maxX = x0;
            //    }
            //    if (x0 < minX)
            //    {
            //        minX = x0;
            //    }
            //    if (y0 > maxY)
            //    {
            //        maxY = y0;
            //    }
            //    if (y0 < minY)
            //    {
            //        minY = y0;
            //    }
            //}
            //double MapX = maxX - minX;
            //double MapY = maxY - minY;
            //double WinX = panel1.Width - 10;
            //double WinY = panel1.Height - 10;
            //double ScaleX = MapX / WinX;
            //double ScaleY = MapY / WinY;

            //TinLine1 tl1 = new TinLine1();
            //Graphics g = panel1.CreateGraphics();

            //panel1.Refresh();
            //Pen pen = new Pen(Color.Red, 1);
            //for (int i = 0; i < linesArray.Count; i++)
            //{
            //    //tl1.Begin.X = (float)((zbArray[linesArray[i].id1].x - minX) / ScaleX);
            //    //tl1.Begin.Y = (float)(WinY - (zbArray[linesArray[i].id1].y - minY) / ScaleY);
            //    //tl1.End.X = (float)((zbArray[linesArray[i].id2].x - minX) / ScaleX);
            //    //tl1.End.Y = (float)(WinY - (zbArray[linesArray[i].id2].y - minY) / ScaleY);

            //    tl1.Begin.X = (float)((linesArray[i].Begin.x - minX) / ScaleX);
            //    tl1.Begin.Y = (float)(WinY - (linesArray[i].Begin.y - minY) / ScaleY);
            //    tl1.End.X = (float)((linesArray[i].End.x - minX) / ScaleX);
            //    tl1.End.Y = (float)(WinY - (linesArray[i].End.y - minY) / ScaleY);
            //    g.DrawLine(pen, tl1.Begin, tl1.End);
            //    if (i<zbArray.Count)
            //    {
            //        float x = (float)((zbArray[i].x - minX) / ScaleX);
            //        float y = (float)(WinY - (zbArray[i].y - minY) / ScaleY);
            //        g.FillEllipse(Brushes.Black, x-3 ,y-3 , 6, 6);
            //    }
            //}
            #endregion
        }