Как добавить точку где-то между двумя точками полного многоугольника

У меня есть список пунктов. Я беру первую и следующую точку (вторую точку) и провожу линию между первой и второй точкой.

Я хочу добавить еще одну вершину между существующими точками.

Это мой метод.

  • 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.

    Просчитываю все точки линий. используя y = mx + c.

    Моя проблема в том, что я могу получить все вертикальные точки x = a, некоторые диагональные точки и горизонтальные точки, но не все. Мне нужно знать, в чем причина и как ее исправить?
    Я создаю наложение растрового изображения, предоставляемое библиотекой захвата видео ICImaging. Поэтому я ограничен передачей только целочисленных точек для рисования на экране.

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

    Редактировать

    Я изменил свой метод.

  • Calculate center point.
  • Добавить новое местоположение MouseDoubleClicked e.Location в список PathPoint.
  • Найдите угол каждой вершины многоугольника.
  • Сортировать список по возрастанию.
  • Вставьте первую точку в конце списка, чтобы завершить многоугольник.
  • Код в ответе.


    person BlueDragon96    schedule 14.06.2018    source источник