private void button4_Click(object sender, EventArgs e) { if ((pol == null) || (points.Count < 1)) { MessageBox.Show("Нарисуйте только многоугольник и точку!", "Ошибка!"); return; } My_point pt = points[points.Count - 1]; bool fromRight = true; foreach (Edge ed in pol.edges) { if (posToEdge(ed, pt) != -1) { fromRight = false; break; } } if (fromRight) { MessageBox.Show("Точка находится внутри многоугольника", "Положение точки"); } else { MessageBox.Show("Точка находится вне многоугольника", "Положение точки"); } }
private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { edgeStart = null; foreach (My_point p in points) { if (Math.Abs(p.X - e.X) <= 3 && Math.Abs(p.Y - e.Y) <= 3) { edgeStart = p; } } }
My_point intersection(My_point A, My_point B, My_point C, My_point D) { double xo = A.X, yo = A.Y; double p = B.X - A.X, q = B.Y - A.Y; double x1 = C.X, y1 = C.Y; double p1 = D.X - C.X, q1 = D.Y - C.Y; double x = (xo * q * p1 - x1 * q1 * p - yo * p * p1 + y1 * p * p1) / (q * p1 - q1 * p); double y = (yo * p * q1 - y1 * p1 * q - xo * q * q1 + x1 * q * q1) / (p * q1 - p1 * q); return(new My_point((int)Math.Round(x), (int)Math.Round(y))); }
private void pictureBox1_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { if (CheckBox1.Checked) { if (newPol) { pol = new Polygon(); newPol = false; My_point p = new My_point(e.X, e.Y); pol.points.Add(p); } else { My_point p = new My_point(e.X, e.Y); pol.points.Add(p); if (pol.points.Count > 2) { pol.edges.Remove(pol.edges.Last()); } Edge edg = new Edge(pol.points[pol.points.Count - 2], p); Edge edg2 = new Edge(pol.points[pol.points.Count - 1], pol.points[0]); pol.edges.Add(edg); pol.edges.Add(edg2); } redrawImage(); } else { My_point p = null; foreach (My_point pp in points) { if (Math.Abs(pp.X - e.X) <= 3 && Math.Abs(pp.Y - e.Y) <= 3) { p = pp; } } if (p == null) { My_point new_p = new My_point(e.X, e.Y); points.Add(new_p); redrawImage(); } } } }
private int posToEdge(Edge ed, My_point pt) { double z = (ed.P2.Y - ed.P1.Y) * pt.X + (ed.P1.X - ed.P2.X) * pt.Y + (ed.P1.X * (ed.P1.Y - ed.P2.Y) + ed.P1.Y * (ed.P2.X - ed.P1.X)); if (z < 0) { return(-1); } else if (z > 0) { return(1); } else { return(0); } }
private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { if (edgeStart != null) { My_point edgeEnd = null; foreach (My_point p in points) { if (Math.Abs(p.X - e.X) <= 3 && Math.Abs(p.Y - e.Y) <= 3) { edgeEnd = p; } } if (edgeEnd != null) { Edge ed = new Edge(edgeStart, edgeEnd); edges.Add(ed); ed.Draw(g, pen); redrawImage(); } } }
private void button3_Click(object sender, EventArgs e) { if ((pol == null) || (points.Count < 1)) { MessageBox.Show("Нарисуйте только многоугольник и точку!", "Ошибка!"); return; } My_point pt = points[points.Count - 1]; double sum_degrees = 0; foreach (Edge ed in pol.edges) { sum_degrees += edgesDeg(new Edge(pt, ed.start()), new Edge(pt, ed.end())) * (-posToEdge(ed, pt)); } if (sum_degrees == 360) { MessageBox.Show("Точка находится внутри многоугольника", "Положение точки"); } else { MessageBox.Show("Точка находится вне многоугольника", "Положение точки"); } }
private bool haveIntersection(Edge e1, Edge e2) { My_point its = intersection(e1.P1, e1.P2, e2.P1, e2.P2); if (its.X == e2.P1.X && its.Y == e2.P1.Y && e2.P1.Y < e2.P2.Y) { return(false); } if (its.X == e2.P2.X && its.Y == e2.P2.Y && e2.P2.Y < e2.P1.Y) { return(false); } if ((its.X >= Math.Min(e1.P1.X, e1.P2.X)) && (its.X <= Math.Max(e1.P1.X, e1.P2.X)) && (its.X >= Math.Min(e2.P1.X, e2.P2.X)) && (its.X <= Math.Max(e2.P1.X, e2.P2.X)) && (its.Y >= Math.Min(e1.P1.Y, e1.P2.Y)) && (its.Y <= Math.Max(e1.P1.Y, e1.P2.Y)) && (its.Y >= Math.Min(e2.P1.Y, e2.P2.Y)) && (its.Y <= Math.Max(e2.P1.Y, e2.P2.Y))) { return(true); } else { return(false); } }
public bool contains(My_point p) { return(p == P1 || p == P2); }
public Edge(My_point p1, My_point p2) { P1 = p1; P2 = p2; }