2 Pluspunkte 0 Minuspunkte

Wenn ich eine Linie habe. 

PointF startPoint; 
PointF endPoint; 

Wie kann ich diese Linie wie einen Uhrzeiger um startPoint drehen?

von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

Du kannst die neuen Koordinaten des Endpunktes mit einfachen trigonometrischen Funktionen nach dem Satz des Pythagoras berechnen.

  • Übersetze den Ursprung des Koordinatensystems so, dass der Drehpunkt im Ursprung liegt.
  • Rotiere den Punkt um den Ursprung.
  • Übersetze den Ursprung zurück an seine ursprüngliche Position.

float angleRadians = (float)(angleDegrees * Math.PI / 180.0);

float newX = (float)(Math.Cos(angleRadians) * (point.X - rotationPoint.X) - Math.Sin(angleRadians) * (point.Y - rotationPoint.Y) + rotationPoint.X);

float newY = (float)(Math.Sin(angleRadians) * (point.X - rotationPoint.X) + Math.Cos(angleRadians) * (point.Y - rotationPoint.Y) + rotationPoint.Y);


Das Prinzip des Pythagoras wird verwendet, um die Längen der Seiten im rechtwinkligen Dreieck zu berechnen, das durch die Bewegung des Punktes entsteht. Hier ist ein Beispiel dazu.

using System;
using System.Drawing;
using System.Windows.Forms;

class Program
{
    static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MyForm());
    }
}

public class MyForm : Form
{
    private PointF startPoint = new PointF(200, 200);
    private PointF endPoint = new PointF(200, 0);
    private PointF rotationPoint = new PointF(200, 200);

    public MyForm()
    {
        this.Size = new Size(420, 440);
        this.Paint += MyForm_Paint;
    }

    private void MyForm_Paint(object sender, PaintEventArgs e)
    {
        RotateLine(0.03f);
        e.Graphics.DrawLine(Pens.Black, startPoint, endPoint);
    }

    private void RotateLine(float degrees)
    {
        float angleRadians = (float)(degrees * Math.PI / 180.0);
        
        PointF newEndPoint = RotatePoint(endPoint, rotationPoint, angleRadians);
        
        endPoint = newEndPoint;
        
        this.Invalidate();
    }

    private PointF RotatePoint(PointF point, PointF rotationPoint, float angleRadians)
    {    
        float newX = (float)(Math.Cos(angleRadians) * (point.X - rotationPoint.X) - Math.Sin(angleRadians) * (point.Y - rotationPoint.Y) + rotationPoint.X);
        float newY = (float)(Math.Sin(angleRadians) * (point.X - rotationPoint.X) + Math.Cos(angleRadians) * (point.Y - rotationPoint.Y) + rotationPoint.Y);
        
        return new PointF(newX, newY);
    }
}

von (716 Punkte)  
Das verstehe ich nicht und wie berechne ich dann den Winkel und wo der neue Punkt der Linie ist?
Die Variablen newX und newY sind die Koordinaten des neuen (gedrehten) Punkt. Den Winkel definierst du in angleInDegrees. Da du die Linie ja um den Startpunkt drehst bleibt der gleich, das bedeutet du musst eine Linie von Startpoint zum neuen Endpoint (newX, newY) zeichnen.
Kannst du mir das an einem Beispiel zeigen?