Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VB_6.doc
Скачиваний:
97
Добавлен:
01.12.2018
Размер:
3.77 Mб
Скачать

12.6.2. Принадлежность точки заданной области.

С помощью графических методов могут быть решены некоторые задачи, решение которых обычными способами может вызвать определенные затруднения. Это так называемые задачи “на принадлежность”. Они состоят в том, что на объекте изображается некоторая замкнутая геометрическая фигура и требуется определить, принадлежит ли области этой фигуры точка с вводимыми произвольными координатами. Например, на плоскости расположен треугольник. Нужно ввести координаты произвольной точки на плоскости и выяснить, принадлежит ли эта точка данному треугольнику.

Если координаты вершин треугольника заданы в условии задачи, то решение задачи элементарно и не требует каких либо специальных знаний. Но если координаты вершин треугольника произвольны и должны быть введены, то для решения такой задачи уже требуется знание начал аналитической геометрии, что не всегда соответствует уровню знаний студента к моменту необходимости решать такую задачу.

С помощью графических методов эта задача может быть решена без каких – либо специальных знаний. Идея такого решения заключается в следующем. Вводим произвольные координаты трех вершин треугольника. С помощью метода Line каждую пару вершин соединяем прямыми линиями. В результате получаем изображение треугольника на плоскости. Затем заливаем внутренность полученного треугольника тем же цветом, каким изображен сам треугольник. После этого вводим координаты произвольной точки и с помощью метода Point опрашиваем цвет ее пикселя. Очевидно, если он совпадает с цветом треугольника, то испытуемая точка принадлежит треугольнику, иначе – не принадлежит.

К сожалению, в VB нет средств, позволяющих залить некоторым цветом произвольную замкнутую фигуру. Это можно сделать, обратившись к функциям Windows API, либо запрограммировать заливку “вручную” с помощью метода PSet.

В качестве примера решим такую задачу, когда исследуемой областью является круг с вырезанным в его произвольных местах произвольным количеством “дырок”.

Откроем новый проект и расположим на форме текстовое окно для вывода результата решения задачи и 2 командные кнопки. Добавим к проекту стандартный модуль, в который запишем процедуру, изображающую на форме координатную систему и процедуру, изображающую в этой системе координат исследуемую область.

Код стандартного модуля

Public x_c%, y_c% ' – координаты центра системы координат

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

Public Sub Coord(objF As Form)

Dim i%, j%, k!

' Эта процедура рисует систему координат на форме.

objF.ForeColor = vbBlack

' Вычисляем коэффициент сжатия, зависящий от установленного

' разрешения экрана

k = 1280 / 1230

' Устанавливаем размеры формы

objF.Width = 8005

objF.Height = Int(objF.Width * k)

' Задаем масштаб на форме

objF.Scale (0, 0)-(250, 250)

' Устанавливаем координаты центра системы координат

x_c = 125: y_c = 125

' Изображаем ось X координатной системы

objF.Line (20, y_c)-(230, y_c)

j = -100

' Размечаем ось X

For i = 25 To 225 Step 10

objF.Line (i, y_c - 2)-(i, y_c + 2)

objF.CurrentX = i - 5: objF.CurrentY = y_c + 2

objF.Print j

j = j + 10

Next i

' Изображаем ось Y координатной системы

objF.Line (x_c, 20)-(x_c, 230)

j = 100

' Размечаем ось Y

For i = 25 To 225 Step 10

objF.Line (x_c - 2, i)-(x_c + 2, i)

objF.CurrentX = x_c + 3: objF.CurrentY = i - 3

If j <> 0 Then objF.Print j

j = j - 10

Next i

End Sub

Процедура изображения исследуемой области

Public Sub Rings(x%(), y%(), r%(), objF As Form)

Dim k%

' Эта процедура изображает на плоскости внешнюю окружность с

‘ расположенными на ней внутренними окружностями произвольных

‘ радиусов с произвольными центрами. Внутренние окружности

‘ образуют "дырки" внутри внешней окружности.

' Рисуем на форме систему координат

Call Coord(objF)

' Вводим параметры внешней окружности

x(0) = InputBox("Введите координату X центра внешней окружности")

x(0) = x(0) + x_c

y(0) = InputBox("Введите координату Y центра внешней окружности")

y(0) = y_c - y(0)

r(0) = InputBox("Введите радиус внешней окружности")

' Рисуем на плоскости красным цветом внешнюю окружность и

‘ заливаем ее так же красным цветом

objF.FillColor = vbRed

objF.FillStyle = vbSolid

objF.Circle (x(0), y(0)), r(0), vbRed

' Восстанавливаем систему координат, так как ее часть

' могла оказаться закрытой внешней окружностью.

Call Coord(objF)

' В цикле изображаем произвольное количество внутренних

‘ окружностей, каждый раз восстанавливая систему координат,

‘ так как любая из них тоже могла закрыть часть системы координат.

k = 0

Do

k = k + 1

objF.FillColor = &HFFFFC0

objF.FillStyle = vbSolid

ReDim Preserve x(0 To k), y(0 To k), r(0 To k)

x(k) = InputBox("Введите координату X центра " & k & "-й внутренней

окружности")

x(k) = x(k) + x_c

y(k) = InputBox("Введите координату Y центра " & k & "-й внутренней

окружности")

y(k) = y_c - y(k)

r(k) = InputBox("Введите радиус " & k & "-й внутренней окружности")

objF.Circle (x(k), y(k)), r(k), vbRed

Call Coord(objF)

Loop Until MsgBox(" Продолжить ввод ?", 36) = vbNo

End Sub

Коды процедур формы

Private Sub Form_Load()

Me.AutoRedraw = True

Me.ScaleMode = vbPixels

End Sub

Private Sub Command1_Click()

Dim k%, x0%, y0%

Dim x%(), y%(), r%()

ReDim x(0 To 0), y(0 To 0), r(0 To 0)

Call Rings(x, y, r, Me)

' РЕШАЕМ ЗАДАЧУ:

' Вводим координаты испытуемой точки

x0 = InputBox("Введите координату X точки"): x0 = x0 + x_c

y0 = InputBox("Введите координату Y точки"): y0 = y_c - y0

' Определяем ее принадлежность заданной области

If Point(x0, y0) = vbRed Then

Text1.Text = " Принадлежит"

Else

Text1.Text = " Не принадлежит"

End If

' Изображаем на координатной плоскости испытуемую точку

PSet (x0, y0), vbBlack

Circle (x0, y0), 1, vbBlue

End Sub

Private Sub Command2_Click()

End

End Sub

Рис. 12.6. Вид формы с результатом решения задачи.

На соответствующем месте рисунка испытуемая точка изображена обведенной небольшим кружком.

Исследуемая область может быть неодносвязной и даже состоять из различных непересекающихся фигур, каждая из которых залита своим цветом. В любом случае достаточно изменить процедуру Rings в модуле для их изображения. Тогда задача будет формулироваться так: Определить, принадлежит ли испытуемая точка хотя бы одной из имеющихся на плоскости фигур и если да, то какой. В этом случае необходимо сравнить цвет пикселя точки с цветом каждой фигуры.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]