Форум: "Прочее";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];
ВнизВопрос к любителям C#... Найти похожие ветки
← →
Cyrax © (2007-02-03 22:41) [0]У объекта класса Matrix есть методы Translate, Scale, Rotate. Но нет Flip"ов...
1. Как получить матрицу, которая отражает точки объекта класса GraphicsPath (метод Transform(Matrix)) относительно координатных осей, или, в общем случае, относительно произвольной прямой ?
2. Как у объекта класса Graphics, сохранив правое направление оси X, повернуть ось Y вниз ?
У Graphics есть методы TransformRotate, TransformScale, TransformTranslate, но нет метода вроде TransformFlip...
← →
default © (2007-02-04 15:10) [1]
> относительно координатных осей,
ну координатных делается по типу ScaleTrasfomtm(-1, 1)
а остальное думай
← →
oxffff © (2007-02-04 15:46) [2]А почему к любителям C#?
Речь же идет о GDI+
← →
Cyrax © (2007-02-04 23:36) [3]default © (04.02.07 15:10) [1]
Ну, по поводу отражения относительно координатных осей понятно...
Чего делать с произвольной прямой ? (думать силы нету...)
oxffff © (04.02.07 15:46) [2]
А ето спроси у Пятачка...
← →
default © (2007-02-05 15:36) [4]ну вот, например, отражение от отрезка идушего под 45 градусов выходящего из точки (100, 0) прямоугольника с окружностью наверху
Dim grfx As Graphics = CreateGraphics()
grfx.DrawLine(Pens.Blue, 100, 0, 100 + 300, 0 + 300)
grfx.ScaleTransform(1, -1)
grfx.RotateTransform(45, MatrixOrder.Append)
grfx.TranslateTransform(100, 0, MatrixOrder.Append)
grfx.DrawRectangle(Pens.Red, 50, -50, 200, 100)
grfx.DrawEllipse(Pens.Green, 100, -100, 50, 50)
grfx.Dispose()
идея отражения проста
считаем осью отражения ось X
задаём отражение от этой оси командой grfx.ScaleTransform(1, -1)
затем поворачиваем на 45 командой grfx.RotateTransform(45, MatrixOrder.Append)
ну и сдвигаем картинку вправо на 100 командой grfx.TranslateTransform(100, 0, MatrixOrder.Append)
что отражение было от 45-ого отрезка выходящего из точки (100, 0)
под своё адаптировать несложно
← →
default © (2007-02-05 16:38) [5]хотя нет, это не то что тебе надо
← →
default © (2007-02-05 18:20) [6]хотя на основе подобного подхода можно сделать и то, что тебе нужно
попробуй сначала сам
← →
default © (2007-02-05 20:01) [7]раз я заварил эту кашу всё-таки покажу как можно сделать отражение
вот отражение от отрезка прямой идущего из (0,0) под 45Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim grfx As Graphics = CreateGraphics()
Dim gp As New GraphicsPath
grfx.DrawLine(Pens.Blue, 0, 0, 400, 400)
gp.AddRectangle(New Rectangle(80, 200, 80, 30))
gp.AddBezier(80, 200, 130, 180, 150, 170, 160, 200)
grfx.DrawPath(Pens.Red, gp)
Dim mx As New Matrix
mx.Rotate(-45)
mx.Scale(1, -1, MatrixOrder.Append)
gp.Transform(mx)
grfx.RotateTransform(45, MatrixOrder.Append)
grfx.DrawPath(Pens.Red, gp)
mx.Dispose()
gp.Dispose()
grfx.Dispose()
End Sub
универсальных методов отражения я тебе писаь не буду
попробуй в этом разобратсья и написать их сам
← →
default © (2007-02-05 23:53) [8]
Dim grfx As Graphics = CreateGraphics()
Dim gp As New GraphicsPath
grfx.DrawLine(Pens.Blue, 0, 0, 400, 400)
gp.AddBezier(80, 200, 130, 180, 150, 170, 160, 200)
gp.AddBezier(40, 200, 90, 150, 120, 150, 170, 200)
gp.AddBezier(170, 200, 220, 250, 250, 250, 300, 200)
grfx.DrawPath(Pens.Red, gp)
Dim mx As New Matrix
mx.Rotate(-45)
mx.Scale(1, -1, MatrixOrder.Append)
gp.Transform(mx)
grfx.RotateTransform(45, MatrixOrder.Append)
grfx.DrawPath(Pens.Green, gp)
mx.Dispose()
gp.Dispose()
grfx.Dispose()
вот это запусти посмотри на глазастое чудище созданное отражение:)
← →
Cyrax © (2007-02-18 09:54) [9]FlipX/FlipY - это зеркальное отражение объекта относительно его геометрического центра вдоль оси X/Y, т.е. относительно горизонтальной прямой с Y=(Ymax + Ymin)/2 (для FlipX) и относительно вертикальной прямой с X=(Xmax + Xmin)/2 (для FlipY)...
С этим разобрался...
С флиповкой координатных осей тоже разобрался: scale(1,-1) и translate(0,-[высота клиентской области окна])...
← →
default © (2007-02-18 14:33) [10]
Sub Flip(ByVal gp As GraphicsPath, ByVal x As Integer, ByVal y As Integer, ByVal angle As Single)
Dim mx As New Matrix
mx.Translate(-x, -y, MatrixOrder.Append)
mx.Rotate(-angle, MatrixOrder.Append)
mx.Scale(1, -1, MatrixOrder.Append)
mx.Rotate(angle, MatrixOrder.Append)
mx.Translate(x, y, MatrixOrder.Append)
gp.Transform(mx)
End Sub
вот это посмотри
прямая от которой отражать задаётся точкой (x,y) и углом angle
← →
default © (2007-02-18 15:42) [11]вот пример использования
Using grfx As Graphics = CreateGraphics()
Using gp As New GraphicsPath
Refresh()
Static angle As Integer = 0
gp.AddBezier(80, 200, 130, 180, 150, 170, 160, 200)
gp.AddBezier(40, 200, 90, 150, 120, 150, 170, 200)
gp.AddBezier(170, 200, 220, 250, 250, 250, 300, 200)
grfx.DrawPath(Pens.Red, gp)
Flip(gp, 200, 200, angle)
grfx.DrawPath(Pens.Green, gp)
angle += 10
End Using
End Using
← →
default © (2007-02-18 15:43) [12]я думал ты сам сможешь сообразить, но ладно...
← →
default © (2007-02-18 15:45) [13][11] это в обработчике щелчка мыши на кнопке формы
← →
Cyrax © (2007-02-26 19:46) [14]Отчёт для Default"а №3
-----------------------
Пока сделал так, как написал в 9-м посте. Флиповку относительно произвольной прямой пока не реализизовывал по причине нехватки времени...
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.045 c