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); }
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); } } } }