C#: Поворот фигуры относительно заданной точки или начала координат

Сегодня речь пойдет о том, как поворачивать объекты относительно точки в двумерном пространстве.
Как правило данную задачу можно встретить в университетах на практике по программированию. Звучит она примерно так: «Дана какая-либо фигура. Необходимо реализовать поворот данной фигуры относительно заданной точки на определенный угол». Задача очень простая, так как формула поворота объекта интуитивно понятна.
Пусть Вам дана точка (x,y). При повороте данной точки на угол alpha относительно точки (x0, y0) ее новая координата (X,Y) высчитывается по формуле:
X = (x — x0) * cos(alpha) — (y — y0) * sin(alpha) + x0;
Y = (x — x0) * sin(alpha) + (y — y0) * cos(alpha) + y0;
Если же мы говорим о повороте относительно начала координат, то наша точка (x0, y0) ни что иное как (0, 0). Зная это выводим формулу поворота относительно начала координат подставив нулевые значения в формулу выше.
X = x * cos(alpha) — y * sin(alpha);
Y = x * sin(alpha) + y * cos(alpha);

Реализуем данную формулу в программе на языке C# в проекте windows forms. Добавим на нашу форму элемент picturebox. и в событие загрузки формы Form1_Load добавим следующий код:

pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
Graphics g = Graphics.FromImage(pictureBox1.Image);
//Координаты объекта
PointF[] o = new PointF[] { new PointF(100, 100), new PointF(200, 100), new PointF(100, 200) };
//Рисуем объект для поворота
g.DrawPolygon(Pens.Black, o);
PointF r = new PointF(150, 120); // точка относительно которой поворачиваем
int angle = 25; //угол поворота
double angleRadian = angle * Math.PI / 180; //переводим угол в радианты
PointF[] r = new PointF[o.Length]; //для хранения новых координат обхекта
for (int j = 0; j < o.Length; j++)
{
   float x = (float)((o[j].X - r.X) * Math.Cos(angleRadian) - (o[j].Y - r.Y) * Math.Sin(angleRadian) + r.X);
   float y = (float)((o[j].X - r.X) * Math.Sin(angleRadian) + (o[j].Y - r.Y) * Math.Cos(angleRadian) + r.Y);
   r[j] = new PointF(x, y);
}
//Рисуем повернутый объект
g.DrawPolygon(Pens.Red, r);
Запись опубликована в рубрике C# с метками , , , , , , , . Добавьте в закладки постоянную ссылку.