Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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) под 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.045 c
2-1172599961
Василиус
2007-02-27 21:12
2007.03.25
помогите позжалста...


9-1145644020
KiberKot
2006-04-21 22:27
2007.03.25
Обрезание (нафиг)


2-1172756880
сетевик
2007-03-01 16:48
2007.03.25
Сеть


2-1172806023
zap8
2007-03-02 06:27
2007.03.25
Обмен данными между динамическим и статическим массивами


15-1172488794
cosinus
2007-02-26 14:19
2007.03.25
Мониторинг здоровья HDD





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский