Последовательное отражение объекта (2D графика)
От: mmart  
Дата: 24.10.11 12:17
Оценка:
C#, Windows.Forms... Чё-то типа векторного редактора...
Есть объект "Текст", который задаётся четырьмя вершинами прямоугольника ну и каким-то текстом, который туда вписан.
Цель реализовать отражение объекта на плоскости, относительно "прямой отражения, заданной двумя точками". В общем, как в AutoCAD.

Ну, казалось бы дело не хитрое... Раскладываем отражение как приведение в начало координат, поворачиваем на угол между прямой отражения и осью ОХ, отражаем относительно прямой ОХ, ну, а далее обратный поворот и обратный перенос. Вуаля, всё готово.
            Matrix _mirrorMatrix = new Matrix();
            // перенос начала координат в первую точку прямой отражения
            _mirrorMatrix.Translate(x1, y1);
            // поворот на угол между прямой отражения и ОХ
            float angle = 60;
            _mirrorMatrix.Rotate(angle);
            // матрица отражения
            Matrix mirror = new Matrix(1, 0, 0, -1, 0, 0);
            _mirrorMatrix.Multiply(mirror);
            // обратный поворот
            _mirrorMatrix.Rotate(-angle);
            // обратный перенос
            _mirrorMatrix.Translate(-x1, -y1);

            // применяем матрицу трансформации, рисуем и "восстанавливаем плоскость"
            Matrix old_m = g.Transform;
            g.Transform = _mirrorMatrix;
            g.DrawString("text", new Font(FontFamily.GenericSansSerif, 32), new SolidBrush(Color.Green), p0);
            g.Transform = old_m;


А дальше у меня тупняк. Это работает стабильно и правильно, но ОДИН РАЗ. Я как бы думал, что, чтобы сделать второе отражение объекта достаточно перемножить старую матрицу трансформации, созданную при прошлом отражении (я её легко сохраняю) на новую, которая задаётся таким же способом относительно уже другой прямой отражения... И хрен. На второе отражение получается чушь.
Жду советов... Чё-то в моей математике не так, наверное, давно это было...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.