ПОНЯТНО О Visual Basic NET (том 2)

Преобразования системы координат


Я уже вам говорил, что начало системы координат для элемента управления находится в его верхнем левом углу, причем ось Y направлена вниз. У объекта класса Graphics есть методы, позволяющие изменять положение начала координат, направление осей, их масштаб, вращать систему координат.

Сдвиг, растяжение, сжатие, смена направления на обратное. Поставим задачу поменять компьютерную систему координат на привычную нам по школе, когда ось Y направлена вверх и начало координат лежит посредине тетрадного листа. Создадим для этого программу:

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

        Dim Гр As Graphics = Me.CreateGraphics

        Гр.ScaleTransform(1, -1)                               'Меняем направление оси Y

        Гр.TranslateTransform(300, -100)                 'Смещаем начало координат

        Гр.DrawLine(Pens.Black, 0, 0, 150, 70)

        Гр.DrawString("Новое начало координат", Me.Font, Brushes.Black, 0, 0)

        Гр.DrawString("Точка 150, 70", Me.Font, Brushes.Black, 150, 70)

    End Sub

Пояснения: Для изменения направления оси Y оператор

        Гр.ScaleTransform(1, -1)                               'Меняем направление оси Y

использует процедуру  ScaleTransform, которая позволяет растягивать или сжимать обе оси координат и менять их направление. Первый параметр относится к оси X, второй – к оси Y. Знак минус означает, что ось меняет направление на обратное. Если бы первым параметром мы вместо 1 написали 3, то все размеры по оси X увеличились бы в 3 раза, то есть любая картинка или фигура троекратно растянулась бы по горизонтали.



Для смещения начала координат из верхнего левого угла приблизительно в середину формы использован оператор

        Гр.TranslateTransform(300, -100)                 'Смещаем начало координат

Первый параметр процедуры TranslateTransform смещает начало координат направо на 300 пикселей, второй – вниз на 100 пикселей. Не перепутайте: именно вниз, а не вверх, так как теперь, после того, как ось Y стала смотреть вверх, отрицательные величины означают направление вниз, а не вверх.


Следующий оператор для иллюстрации рисует (см. Рис. 12.23 с перевернутым текстом) отрезок от начала координат (0, 0) до точки (150, 70), причем обратите внимание, что начало координат теперь лежит где-то посредине формы, а точка (150, 70) находится правее и выше начала координат, что привычно для математика, но не для компьютерщика.

Рис. 12.23
Все бы хорошо, но когда мы после такого преобразования системы координат рисуем объекты, имеющие «форму», такие, как текст или фотографии, они, естественно, получаются перевернутыми, что и видно на рисунке, где изображен текст "Новое начало координат" и  "Точка 150, 70".
Упражнение. Выполните Задание 84 о построении графика функции  y = (Sin x)/x  (см. Рис. 12.8) с использованием преобразования системы координат. Указание: После того, как вы начертите оси координат и сделаете все надписи, сместите начало координат в точку пересечения осей координат, поменяйте направление оси ординат и растяните ось x примерно в 10, а ось y – в 100 раз. Тогда для вычерчивания графика вам не придется преобразовывать числа  x и y  в координаты на экране.
Вращение. Мы можем и вращать систему координат. Рассмотрим программу:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Гр As Graphics = Me.CreateGraphics
        Dim Фото As New Bitmap("Spacescape.JPG")
        Dim П1 As New Rectangle(400, 0, 150, 130)
        Гр.DrawEllipse(Pens.Black, 100, 0, 250, 40)
        Гр.DrawImage(Фото, П1)
        Гр.RotateTransform(20)                      'Вращаем систему координат вокруг ее начала на 20 градусов
        Гр.DrawEllipse(Pens.Black, 100, 0, 250, 40)
        Гр.DrawImage(Фото, П1)
End Sub
Результат ее работы вы видите на Рис. 12.24.

Рис. 12.24
Пояснения: Четвертая и пятая строки процедуры
        Гр.DrawEllipse(Pens.Black, 100, 0, 250, 40)
        Гр.DrawImage(Фото, П1)
рисуют верхний эллипс и верхнюю фотографию. Следующая строка


        Гр.RotateTransform(20)                      ' Вращаем систему координат вокруг ее начала на 20 градусов
незримо поворачивает систему координат вокруг ее начала (а оно находится в левом верхнем углу формы) по часовой стрелке на 20 градусов. Делает это процедура RotateTransform.
Седьмая и восьмая строки процедуры
        Гр.DrawEllipse(Pens.Black, 100, 0, 250, 40)
        Гр.DrawImage(Фото, П1)
являются копиями четвертой и пятой строк, но несмотря на это, рисуют эллипс и фотографию в другом месте, так как система координат уже повернута.
Вы можете вращать систему координат вокруг любой точки формы, предварительно сместив туда начало координат процедурой TranslateTransform.
Задание 75.    
Заставьте картинку (например, монетку с Рис. 12.15) непрерывно вращаться. Указание: Сместите начало координат примерно в середину формы и нарисуйте монетку так, чтобы ее центр был как можно ближе к новому началу координат. Затем немного поверните систему координат и снова нарисуйте монетку. И так далее.

Содержание раздела