Как определить точку поворота многоугольника (треугольника)? - PullRequest
0 голосов
/ 12 марта 2020

Я хотел бы нарисовать толстую прозрачную стрелку со стрелкой:

enter image description here

Вот код, который dr aws вала стрелы. Обратите внимание, что я должен сместить прямоугольник, чтобы вычисления выполнялись с середины прямоугольника.

  private void DrawMovementArrow(bool color, double StartX, double StartY, double EndX, double EndY)

    {

        SolidColorBrush partiallyTransparentSolidColorBrush;
        Rectangle myRectangle = new Rectangle();

        // This will be replaced by piece size
        int width = 35;
        myRectangle.Width = width;

        // Apparently necessary to offset the drawing of the path so that the point is in the center of the path; not the edge.
        StartX -= width / 2;
        EndX -= width / 2;

        myRectangle.Height = Map.EuclideanDistance(StartX, StartY, EndX, EndY) ;

        int angle = CalculateAngle(StartX , StartY , EndX , EndY );

        // This selects the midpoint of edge of the rectangle to rotate around (weird system)
        myRectangle.RenderTransformOrigin = new Point(0.5, 0);

        angle = angle - 180;
        RotateTransform rotateTransform1 = new RotateTransform(angle, 0 , 0  );
        myRectangle.RenderTransform = rotateTransform1;


        if (color)
            partiallyTransparentSolidColorBrush  = new SolidColorBrush(Colors.Blue);
        else
            partiallyTransparentSolidColorBrush = new SolidColorBrush(Colors.Red);

        partiallyTransparentSolidColorBrush.Opacity = 0.4;

        myRectangle.Fill = partiallyTransparentSolidColorBrush;

        MovementCanvas1.Children.Clear();
        MovementCanvas1.Children.Add(myRectangle);
        Canvas.SetTop(myRectangle, StartY);
        Canvas.SetLeft(myRectangle, StartX);

        DrawArrowhead(color, EndX, EndY, angle + 90, width);

        ShowUnitCenter(MovementArrowList[0]);
    }

Обратите внимание, что этот код выбирает точку в середине края для поворота прямоугольника:

            // This selects the midpoint of edge of the rectangle to rotate around (weird system)
        myRectangle.RenderTransformOrigin = new Point(0.5, 0);

Проблема в том, что я не могу найти эту точку с помощью стрелки (треугольника). Вот код, который показывает aws наконечник стрелки:

   public void DrawArrowhead(bool color, double x, double y, int angle, int width)
    {
        x += width /2 ;

        width = width + (width / 2);

        //Add the Polygon Element
        Polygon myPolygon = new Polygon();
        myPolygon.Opacity = 0.4;

        if (color)
        {
            myPolygon.Fill = new SolidColorBrush(Colors.Blue);
            myPolygon.Stroke = System.Windows.Media.Brushes.Blue;
        }
        else
        {
            myPolygon.Fill = new SolidColorBrush(Colors.Red);
            myPolygon.Stroke = System.Windows.Media.Brushes.Red;
        }
        myPolygon.StrokeThickness = 0;

        RotateTransform rotateTransform1 = new RotateTransform(angle, 0, 0);
        myPolygon.RenderTransform = rotateTransform1;

        // This selects the midpoint of edge of the triangle to rotate around (weird system)
        myPolygon.RenderTransformOrigin = new Point(0.0, 0.5);

        System.Windows.Point Point1 = new System.Windows.Point(0, 0);
        System.Windows.Point Point2 = new System.Windows.Point(width / 2, width / 2);
        System.Windows.Point Point3 = new System.Windows.Point(0,width);
        PointCollection myPointCollection = new PointCollection();
        myPointCollection.Add(Point1);
        myPointCollection.Add(Point2);
        myPointCollection.Add(Point3);
        myPolygon.Points = myPointCollection;

        MovementCanvas1.Children.Add(myPolygon);
        Canvas.SetTop(myPolygon, y );
        Canvas.SetLeft(myPolygon, x );
    }

Обратите внимание на myPointCollection, которая создает треугольник. Проблема в том, что я попробовал почти все мыслимые комбинации значений в RenderTransformOrigin, чтобы найти точку (центр внизу треугольника), которую нужно использовать для точки вращения. Кажется, ничего не получается.

Кто-нибудь может предложить правильное значение?

Править Решено Я решил это, изменив точки треугольника. Это было проще, чем пытаться определить точку вращения.

enter image description here

1 Ответ

0 голосов
/ 12 марта 2020

Изменение точек, составляющих треугольник, решило проблему. Это было проще, чем пытаться найти точку вращения.

enter image description here

...