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

Решил я начать изучение различных преобразований и определился, что хочу начать с поворота отрезка в двумерном пространстве. Чтобы вращать объект, одного слова "вращение" мало. Нужно определиться вокруг чего вращать надо. Вот, например, в двумерном пространстве отрезок можно вращать аж тремя способами:

  Первый мой опыт попытки вращения отрезка пал на вращение относительно его начала.

  Вообще в интернете описаны матрицы-шматрицы и написано: "используйте их, и будет вам счастье в компьютерной графике". Но такие, как я, не обладают математическим знанием, поэтому использование матриц вызывает определенные затруднения. Кроме того, даже глядя на формулу поворота, мне не удавалось её подставить в код должным образом. Попытки найти пример не увенчались успехом. Но сила моя как раз в том, что ищу я упорно и чаще нахожу то, что ищу (хотя не всегда получается). Вот и попалась мне формула:

X = x1+(x2-x1)*cos(A)-(y2-y1)*sin(A)
Y = y1+(x2-x1)*sin(A)+(y2-y1)*cos(A)
(где X и Y новые координаты того конца, который вращаем)
Вот это было как раз тем, что было так нужно.

Код C++ Вращение отрезка вокруг своего начала (или конца) Первый шаг
Здесь надо определится с самим отрезком.

  Итак. Это в принципе простой код, но некоторым понадобятся пояснения. Выполняется только одна функция, в которой одна точка отрезка размещается в центр экрана, вторая точка определяется согласно длины отрезка. Так как вращение отрезка будет вокруг его начала, то значит это самое начало является центром окружности. Сам отрезок получается радиусом окружности и чтобы определить координаты его конца, нужно точку конца отрезка положить на окружность. Если координата х или y известны, то положить точку на окружность не составляет труда. В моем случае я клал по известному x. Не имеет разницы то, как строится отрезок. Если длина его неизвестна, то значит ее придется посчитать по теореме Пифагора.

Код C++ Написание функции поворота отрезка на заданный угол

  Вот можно сравнить по первому коду и увидеть некоторые изменения. В функцию поворота нужно передавать координаты двух точек (концы отрезка) и угол, на который нужно сделать поворот. Так как координаты одного конца должны менять значение, то в принимаемых параметрах внутри функции указываем их как ссылки. Обратите внимание на запоминание параметров (указанных как ссылки) во временные переменные.
Это формула, которую я отыскал. Грамотно пояснить не смогу, но скажу не очень грамотно.
Чтобы повернуть точку на произвольный угол, нужно определить позицию этой точки и только после этого поворачивать. Вот такой расчет и поворот и происходит в формуле.

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

====================
  Вроде задача решена и больше ничего не нужно. Но это не совсем так. Мне, например, всегда было интересно как программировать аналоговые часы. Программировать я их тут не буду, но если присмотреться, то поворот отрезка очень напоминает стрелку с часов. Значит можно реализовать поворот стрелки. Для этого нужно использовать цикл. Я склонен считать, что этот самый цикл может вызывать затруднения, поэтому

Код С++ Поворот отрезка Аналоговые Часы Стрелка

Я рисовал стрелку расположенную фиг знает где. Если надо расположить в начальном положении, то
A.x=O.x;
A.y=O.y-R;
Добавить одну задержку в секунду после вывода первой линии в конец input().

Если нужно зациклить часы до нажатия какой-либо клавиши, то использовать вместо for

и добавить первую прорисовку циферблата (я ее не делал). Там же где прорисовка первой стрелки

======================================

Если вы усвоите этот материал, то без труда сможете реализовать свои первые часики))
Конечно могут возникнуть вопросы, так как я, пытаясь сжать информацию, пропускал разные моменты, но если хотите спросить, на то что смогу — на то отвечу.

4 комментария на «“C++ для начинающих как повернуть отрезок вокруг его начала”»

  1. Артур:

    Огромное спасибо! Очень помогло

  2. Анатолий:

    Блин, чувак, КРЕПКО ЖМУ ТЕБЕ РУКУ!!!

    Хотел бы обратиться по имени, но не знаю как тебя звать )

    В общем, я премного благодарен, очень выручил )

    Моя задача заключается в том, что нужно поворачивать отрезок относительно центра, но глядя на твой код я решу эту задачу без проблем )

    В моем случае середина отрезка это точка начала, а поворачивать буду как бы сразу 2 отрезка (концы) на один и тот же угол ))

  3. Евген:

    Огромное спасибо! Выручил.

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

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

Поиск

 
     

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

https://www.litres.ru/oleg-kalashnikov/assembler-eto-prosto-uchimsya-programmirovat/?lfrom=15589587

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

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