Example #1
0
 private void draw_edge(edge e)
 {
     g.DrawLine(new Pen(Color.Blue, 1), e.P1.X, e.P1.Y, e.P2.X, e.P2.Y);
 }
Example #2
0
        private void butt_triangulator_Click(object sender, EventArgs e)
        {
            redrawImage();
            living_edges = new List <edge>();
            my_point fst_point = find_first_point(points);

            draw_point(fst_point);
            my_point sec_point = find_second_point(points, fst_point);

            draw_point(sec_point);
            pictureBox.Image = bmp;

            living_edges.Add(new edge(fst_point, sec_point));

            while (living_edges.Count() > 0)
            {
                edge living = living_edges[living_edges.Count() - 1];
                living_edges.RemoveAt(living_edges.Count() - 1);
                double   radius      = double.MaxValue;
                my_point third_point = null;
                foreach (my_point p in points)
                {
                    draw_point(p);
                    if (pos_rel_edge(living, p) != -1) // Определяет c какой стороны относительно направленного ребра лежит точка
                    {
                        continue;                      //1 - слева, -1 - справа, 0 - на ребре
                    }
                    triad tr = new triad(living.start(), living.end(), p);
                    if (radius > tr.dist)
                    {
                        radius      = tr.dist;
                        third_point = p;
                    }
                }

                draw_edge(living);

                if (third_point != null)
                {
                    edge ed  = new edge(living.start(), third_point);
                    int  ind = living_edges.FindIndex(new Predicate <edge>(ee => ee == new edge(ed.end(), ed.start())));
                    if (ind >= 0)
                    {
                        draw_edge(living_edges[ind]);
                        living_edges.RemoveAt(ind);
                    }
                    else
                    {
                        living_edges.Add(ed);
                        //draw_edge(ed);
                    }

                    ed  = new edge(third_point, living.end());
                    ind = living_edges.FindIndex(new Predicate <edge>(ee => ee == new edge(ed.end(), ed.start())));
                    if (ind >= 0)
                    {
                        draw_edge(living_edges[ind]);
                        living_edges.RemoveAt(ind);
                    }
                    else
                    {
                        living_edges.Add(ed);
                        //draw_edge(ed);
                    }
                }
            }
        }