コード例 #1
0
ファイル: Form1.cs プロジェクト: divash95/grapichs4
        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("Точка находится вне многоугольника", "Положение точки");
            }
        }
コード例 #2
0
ファイル: Form1.cs プロジェクト: divash95/grapichs4
 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;
         }
     }
 }
コード例 #3
0
ファイル: Form1.cs プロジェクト: divash95/grapichs4
        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)));
        }
コード例 #4
0
ファイル: Form1.cs プロジェクト: divash95/grapichs4
 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();
             }
         }
     }
 }
コード例 #5
0
ファイル: Form1.cs プロジェクト: divash95/grapichs4
        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);
            }
        }
コード例 #6
0
ファイル: Form1.cs プロジェクト: divash95/grapichs4
 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();
         }
     }
 }
コード例 #7
0
ファイル: Form1.cs プロジェクト: divash95/grapichs4
        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("Точка находится вне многоугольника", "Положение точки");
            }
        }
コード例 #8
0
ファイル: Form1.cs プロジェクト: divash95/grapichs4
        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);
            }
        }
コード例 #9
0
ファイル: Form1.cs プロジェクト: divash95/grapichs4
 public bool contains(My_point p)
 {
     return(p == P1 || p == P2);
 }
コード例 #10
0
ファイル: Form1.cs プロジェクト: divash95/grapichs4
 public Edge(My_point p1, My_point p2)
 {
     P1 = p1; P2 = p2;
 }