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