В графике можно выполнять преобразования используя так называемые матрицы преобразования. Если кратко, то суть этих матриц заключается в том, что бы выполнять работу над вектором или точкой, в общем над объектом.
Например, нам нужно повернуть объект на не который угол. В данном случае мы можем использовать так называемую матрицу поворота (Rotation Matrix или просто R). Как ее получить?
Вместо θ вы подставите свой угол и получите матрицу, которую потом можно перемножить с объектом, если объект состоит из множество точек, то необходимо будет каждую точку перемножить на матрицу. В результате мы получим новые координаты объекта, которые и будут отображать уже повернутый объект.
В нашей задаче при зеркальной симметрии относительно прямой, мы также можем использовать матрицы. Для начала, посмотрим какие преобразования нам необходимо сделать:
Сначала мы повернем объект до нуля, потом отразим его и вернем в конечное положение. Данные преобразования выполнить достаточно легко - необходимо использовать матрицу поворота и отражения. Для удобства все преобразования сведем к одной матрице, назовем ее Result Matrix и Result Matrix = Rotation Matrix * Reflection Matrix * Rotation Matrix. А уже потом результирующую матрицу мы применим к объекту, в данном случае к точке.
Как же мы узнаем угол поворота до оси абсцисс, легко мы знаем, что y = kx + b; и мы знаем, что k - это угловой коэффициент, который как раз и показываем отклонение относительно оси абсцисс, k = tan(alpha). Угол мы легко получим, alpha = atan(k). Но у нас же уравнение вида ax + by = 0 - не проблема, приведем его к нужному нам виду y = -(a/b)x; Тогда угол поворота alpha = atan(-a/b), обратный угол поворота это просто -alpha. Итого, у нас есть угол поворота, осталось найти матрицу отражения. А это легко, она также заранее известна, матрица отражения относительно оси абсцисс равна:
Далее, мы просто перемножим между собой три матрицы, а после чего перемножим на них координаты нашей точки и получим желаемую преобразованную точку.
Код проекта на C#, который демонстрирует решение данной задачи я выложил здесь. Внимание! Проект работает в Visual Studio 2010, желательно Premium. Если же проект вам не удастся открыть, то достаточно скопировать код из файла Program.cs и перенести его в другой проект.
Если заметите ошибки - сообщите, спасибо и успехов вам!
Дружище, спасибо, дай бог тебе здоровья
ОтветитьУдалитьЗдравствуйте! Спасибо вам!!!
ОтветитьУдалить