Узнать координаты после трансформации матрицей

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Neco
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 06.07.2005 (Ср) 1:21

Узнать координаты после трансформации матрицей

Сообщение Neco » 18.11.2006 (Сб) 10:58

трансформирую GraphicPath матрицей, путь отображается нормально. если этой же матрицей трансформирую определённую точку, то потом она фактически указывает мне свои координаты спроецированные с path'а на плоскость окна.
теперь мне надо наоборот - с плоскости окна спроецировать точку на path и получить координаты относительно его начала координат (фактически узнать, где сейчас центр окна).
пробовал инвертировать каждую трансформацию и накладывать на определённую точку - не выходит - при вращательных трансформациях съезжает.
пробовал накапливать (multiply) изменения в другой матрице и потом инвертно применять их для точки с экрана - тоже бред какой-то.
подскажите, пжлста, как надо...
вот кусок кода - до мрака черновой...
Код: Выделить всё
        Dim mt As New Matrix
        Public Sub Transform(ByVal mat As Matrix)
            'm_ctr_grid.Offset(CInt(mat.OffsetX), CInt(mat.OffsetY))

            'Debug.WriteLine(m_ctr_grid.X.ToString + ";" + m_ctr_grid.Y.ToString + " " + mt.OffsetX.ToString + ";" + mt.OffsetY.ToString + " " + (arr(m_rng \ 2, m_rng \ 2).Corner.X + m_side_pxl \ 2).ToString + " " + rrr(0).X.ToString)
            m_grid_path.Transform(mat)
            'mat.Invert()
            mt.Multiply(mat)
            mat.TransformPoints(m_ctr_grid)
            'mat.VectorTransformPoints(m_ctr_grid)
        End Sub
        Dim fnt As New Font("Courier New", 10)
        Public Sub Paint(ByVal G As Graphics)
            G.DrawPath(Pens.Blue, m_grid_path)
            G.DrawEllipse(Pens.Red, m_ctr_grid(0).X, m_ctr_grid(0).Y, m_ctr_rad, m_ctr_rad)
            Dim foo() As Point
            ReDim foo(0)
            Dim mtt As New Matrix
            mtt.Multiply(mt)
            mtt.Invert()
            mtt.TransformPoints(foo)
            Dim coor_x, coor_y As Single
            coor_x = foo(0).X ' m_ctr_grid(0).X 'm_field_size.Width \ 2 -
            coor_y = foo(0).Y ' m_ctr_grid(0).Y 'm_field_size.Height \ 2 -
            G.DrawString(coor_x.ToString + ";" + coor_y.ToString, fnt, Brushes.Brown, m_field_size.Width \ 2, m_field_size.Height \ 2)
            G.DrawEllipse(Pens.Brown, m_field_size.Width \ 2, m_field_size.Height \ 2, m_ctr_rad, m_ctr_rad)
        End Sub

Neco
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 06.07.2005 (Ср) 1:21

Сообщение Neco » 18.11.2006 (Сб) 11:05

отмена!
сделал вроде бы аналогичный вариант, но вначале инвертил матрицу изменений, а потом уже прибавлял её к накопительной и всё получилось!

хотя вообще-то логично - вращение идёт относительно некоей точки, поэтому надо именно в таком порядке...


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 72

    TopList