Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.25;
Скачать: 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 вся ветка

Текущий архив: 2007.03.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.054 c
2-1172686033
NGPOL
2007-02-28 21:07
2007.03.25
Особенности SELECT


2-1173040725
gosha73
2007-03-04 23:38
2007.03.25
WideString - > UnicodeString


15-1172737610
Ega23
2007-03-01 11:26
2007.03.25
Не ставятся breakpoint-ы в проекте....


1-1170368901
FAskerQ
2007-02-02 01:28
2007.03.25
Как узнать время создания процесса?


11-1152008286
Maloric
2006-07-04 14:18
2007.03.25
Чтение имени компонента из файла