C++ для начинающих как повернуть отрезок вокруг его середины

Как повернуть отрезок вокруг его середины? Голова сломаться может от матриц, шматриц и тонны бесполезной информации. Матрицы поворотов нужны, конечно, просто в купе к ним по сайтам всякой ненужной фигни набросано.

  • Чтобы поворачивать отрезок вокруг своего центра, нужно в первую очередь найти координаты этого его центра

Координаты центра отрезка на плоскости найти очень легко, нужно найти две точки: абсциссу (точку Х), ординату (точку Y). Придумали же названий. Есть отрезок, у него две точки, одна точка — точка его начала, другая точка — точка его конца. У каждой точки есть внутри два обозначения. Одно X, другое Y.

Вычисляется центр по формуле:

  • X = (X0 + X1) / 2;
    Y = (Y0 + Y1) / 2;

Для примера:
Отрезок (5,90;99,200);
Первая точка отрезка (5,90), вторая (99,200).
X = (5 + 99) / 2 = 52;
Y = (90 + 200) / 2 = 145;

Точка центра == (52,145);

Вот и вся премудрость нахождения. Просто не все это знают.

  • Чтобы поворачивать отрезок вокруг своего центра, нужно вращать точку его начала и точку его конца вокруг точки его центра

Вокруг произвольной точки (x0,y0) точку можно повернуть используя формулу:

  • xn = -sin(alpha)*(y-y0)+cos(alpha)*(x-x0)+x0;
    yn = cos(alpha)*(y-y0)+sin(alpha)*(x-x0)+y0;

Здесь:
xn и yn — это две единые составляющие новой координаты. (Просто новый Х и новый Y)
x и y — это две единые составляющие координаты той точки, которая вращается (будет вращаться).
x0 и y0 — это две единые составляющие координаты той точки, вокруг которой вращается другая точка. (в нашем случае это две единые составляющие координаты центра отрезка)
alpha — угол, на сколько вращаем.

Это всё, что достаточно знать для вращения отрезка на плоскости вокруг своего центра.

В примере использовано рисование с помощью WinApi.

Основная угроза происходит из неявных преобразований. Так, можно напороться на вычисления с погрешностью, которая способна сильно повлиять на результат. Будьте внимательны, если делаете что-то своё, ориентируясь на эту статью.

Во время перерисовки лучше, чтобы функция стирания шла непосредственно перед функцией рисования, разделяясь обновлением координат. В противном случае вычисления могут повлиять на время работы, и это может сказаться, например на плавности анимации.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/mihail-flenov/programmirovanie-v-delphi-glazami-hakera-4575374/?lfrom=15589587

Последние комментарии

Яндекс.Метрика