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

Две задачи: Глаз-ватерпас и Мышка-карандаш


Глаз-ватерпас. Создадим программу на определение точности глаза и руки: Поместим на форму кнопку. При нажатии кнопки возникает и тут же исчезает в случайном месте формы маленькая окружность. Вы должны поточнее щелкнуть мышкой там, где она мелькнула (как можно ближе к ее центру). После щелчка происходит вот что: становится видимой исчезнувшая окружность, а на месте, где вы щелкнули, тоже возникает окружность (раза в два поменьше той первой, чтобы вы на глаз могли их различить). Это позволяет вам наглядно определить их близость. Кроме этого, компьютер сообщает вам, на каком точно расстоянии от центра исчезнувшей окружности было острие мышиного курсора во время щелчка.

Здесь подойдет событие MouseDown, так как оно сообщает координаты мыши во время щелчка. Вот программа для поставленной задачи:

Dim X_кружка As Integer

Dim Y_кружка As Integer

Dim Граф As Graphics = Me.CreateGraphics

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim i As Integer

        Randomize()

        X_кружка = 200 * Rnd()                   'Определяем координаты кружка (центра кружка)

        Y_кружка = 200 * Rnd()

        Граф.DrawEllipse(Pens.Black, X_кружка - 10, Y_кружка - 10, 20, 20)      'Чертим кружок

        For i = 1 To 3000000 : Next              'Пауза, чтобы мы успели заметить кружок

        Граф.Clear(Me.BackColor)               'Очищаем форму от кружка



End Sub

Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)  _

Handles MyBase.MouseDown

        Граф.DrawEllipse(Pens.Black, X_кружка - 10, Y_кружка - 10, 20, 20)   'Кружок снова возникает

        Граф.DrawEllipse(Pens.Black, e.X - 5, e.Y - 5, 10, 10)                            'Чертим кружочек на месте щелчка

        Dim Расстояние_до_кружка As Double = Math.Sqrt((e.X - X_кружка) ^ 2 + (e.Y - Y_кружка) ^ 2)

        MsgBox("Промах на " & Math.Round(Расстояние_до_кружка) & " пикс")


        Граф.Clear(Me.BackColor)                                                                         'Очищаем форму от кружков
End Sub
Пояснение того, как вычислялось расстояние ( для тех, кто знает теорему Пифагора): Мысленно соедините отрезком прямой центр первой окружности и точку щелчка. Проведите из концов отрезка вертикальные и горизонтальные линии. Вы легко увидите прямоугольный треугольник. Искомым расстоянием будет гипотенуза этого прямоугольного треугольника. Нетрудно заметить, что горизонтальный катет равен  e.X  - X_кружка, а вертикальный равен  e.Y - Y_кружка  (знак я не учитываю). Теорема Пифагора гласит, что квадрат гипотенузы равен сумме квадратов катетов. Отсюда, гипотенуза равна корню квадратному из суммы квадратов катетов (каковая формула и записана в программе).
Вы можете превратить эту программу в игру. Создайте сумматор расстояний, чтобы игрок видел свой накапливающийся суммарный результат. Предоставьте игроку возможность сделать, скажем, ровно 10 щелчков, после чего игра заканчивается. Цель – набрать наименьшую сумму в конце игры.
Мышка-карандаш. Вот программа, превращающая мышку в карандаш:
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)  _
Handles MyBase.MouseMove
        Dim Граф As Graphics = Me.CreateGraphics
        Граф.FillEllipse(Brushes.Black, e.X, e.Y, 5, 5)
End Sub
Запустите ее и медленно ведите мышкой по форме. За мышкой остается нарисованный след из множества черных кружочков диаметра 5. Кружочки рисуются так близко друг к другу, что образуют непрерывную линию. Если мышку передвигать побыстрее, то след будет прерывистым, потому что, хоть событие MouseMove наступает и часто, но все же не бесконечно часто. В 20.9.2 мы решим проблему непрерывности, хотя, собственно говоря, вы и сейчас можете это сделать.
Задание 96.          
Сделайте так, чтобы мышь-карандаш рисовала только при нажатой левой клавише, что более привычно для всех пользователей компьютера. Сделайте так, чтобы при щелчке по правой клавише толщина линии возрастала на 1. Если сможете, сделайте так, чтобы при двойном щелчке по правой клавише толщина линии убывала на 1.

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