Вниз
Скачать: CL | DM;

Вопрос к любителям 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) под 45
Private 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.032 c
15-1172592012
AntiUser
2007-02-27 19:00
2007.03.25
Покритикуйте, посоветуйте.


2-1173099742
Нуб
2007-03-05 16:02
2007.03.25
окно ошибки в Delphi


15-1172722039
Константинов
2007-03-01 07:07
2007.03.25
Сегодня 1-ый день на новом месте. Что меня ждет – не знаю…


15-1172740308
DiamondShark
2007-03-01 12:11
2007.03.25
Поздравляю с первым днём весны!


15-1172479522
xayam
2007-02-26 11:45
2007.03.25
Музыка из фильма Призрачный гонщик




   Наверх