Cara menambahkan titik di antara dua titik pada poligon lengkap

Saya punya daftar poin. Saya mengambil titik pertama dan berikutnya (titik kedua) dan menarik garis antara titik pertama dan kedua.

Saya ingin menambahkan titik lain di antara titik-titik yang ada.

Ini adalah metode saya.

  • when user double clicks on line a point should be added there.
  • find all points of shape generated by polygon.
  • check if e.Location is in the list of points.
  • if exists then check that point's lowerbound and upperbound.
  • insert that e.Location next to lowerbound.
  • Re-draw the lines with updated list.

    Saya menghitung semua titik garis. dengan menggunakan y = mx + c.

    Masalah saya adalah saya bisa mendapatkan semua titik vertikal x = a, beberapa titik diagonal dan titik Horizontal tetapi tidak semua. Saya perlu tahu apa penyebabnya dan bagaimana cara memperbaikinya?
    Saya membuat hamparan bitmap yang disediakan oleh perpustakaan pengambil video ICImaging. Jadi saya dibatasi hanya meneruskan titik bilangan bulat untuk menggambar di layar.

       private void btnAddPoint_Click(object sender, EventArgs e)
        {
            //IsLineSelected = true;
            Debug.Print("Current Points in List ");
            foreach (System.Drawing.Point P in PathPoints)
            {
                Debug.Print(P.ToString());
            }
            for (int IndexI = 0; IndexI != PathPoints.Count - 1; IndexI++)
            {
                if (IndexI  == PathPoints.Count-1)
                {
                    break;
                }
                else
                {
                    Debug.Print("P1:" + PathPoints[IndexI].ToString() + "P2:"+ PathPoints[IndexI+1].ToString());
                    ShapeDirectory.AllLinePoints(PathPoints[IndexI], PathPoints[IndexI + 1]);
                }
    
            }
    
            foreach (System.Drawing.Point P in ShapeDirectory.LinePoints)
            {
                PathPoints3.Add(P);
            }
            drawLinePoints = true;
    
        }        
    
        public static void AllLinePoints(Point p1, Point p2)
        {
    
            double YDiff = p2.Y - p1.Y;
            double XDiff = p2.X - p1.X;
    
            double SlopM = Math.Round(Math.Abs(YDiff / XDiff));
    
            double YinterceptB = Math.Round(Math.Abs(p1.Y - (SlopM * p1.X)));
    
            Debug.Print("Slop: " + SlopM.ToString() + "Y Intercept: " + YinterceptB.ToString());
    
            if (SlopM == 0)
            {
    
            }
    
    
            if (Double.IsNegativeInfinity(SlopM) || Double.IsPositiveInfinity(SlopM))
            {
                int LowerBoundX = 0;
                int LowerBoundY = 0;
    
                int upperBoundX;
                int upperBoundY;
    
                double distanceBetwwenP1andp2 = GetDistanceBetween2points(p1, p2);
    
                if (p1.X == p2.X )
                {
                    LowerBoundX = p1.X;
                    upperBoundX = p2.X;                   
    
                }
    
                if (p1.Y <= p2.Y)
                {
                    LowerBoundY = p1.Y;
                    upperBoundY = p2.Y;
    
                }
                else
                {
                    LowerBoundY = p2.Y;
                    upperBoundY = p1.Y;
                }
    
                //Vertical 
    
                for (int YIndex = LowerBoundY; YIndex <= upperBoundY; YIndex++)
                {
    
                            TempLinePoint.X = LowerBoundX;
                            TempLinePoint.Y = YIndex;
    
                            //Debug.Print("Current Line Points X: " + XIndex.ToString() + "Y: " + YIndex.ToString());
                            LinePoints.Add(TempLinePoint);                            
                }
            }
            else 
            {
                int LowerBoundX;
                int LowerBoundY;
    
                int upperBoundX;
                int upperBoundY;
    
                double distanceBetwwenP1andp2 = GetDistanceBetween2points(p1, p2);
    
                if (p1.X <= p2.X && p1.Y <= p2.Y)
                {
                    LowerBoundX = p1.X;
                    upperBoundX = p2.X;
    
                    LowerBoundY = p1.Y;
                    upperBoundY = p2.Y;
    
                }
                else
                {
                    LowerBoundX = p2.X;
                    upperBoundX = p1.X;
    
                    LowerBoundY = p2.Y;
                    upperBoundY = p1.Y;
    
                }
    
                //if Vertical 
                for (int YIndex = LowerBoundY; YIndex <= upperBoundY; YIndex++)
                {
    
                    for (int XIndex = LowerBoundX; XIndex <= upperBoundX; XIndex++)
                    {
                        if (YIndex == (SlopM * XIndex) + YinterceptB)
                        {
                            TempLinePoint.X = XIndex;
                            TempLinePoint.Y = YIndex;
    
                            //Debug.Print("Current Line Points X: " + XIndex.ToString() + "Y: " + YIndex.ToString());
                            LinePoints.Add(TempLinePoint);
    
                        }
                    }
                }
    
            }
    

    Sunting

    Saya telah mengubah metode saya.

  • Calculate center point.
  • Tambahkan e.Lokasi MouseDoubleClicked Baru ke Daftar PathPoint.
  • Temukan sudut setiap titik sudut poligon.
  • Urutkan daftar dalam urutan menaik.
  • Masukkan PointAt End pertama dari daftar untuk melengkapi Polygon.
  • Kode ada di jawabannya.


    person BlueDragon96    schedule 14.06.2018    source sumber