«Стрельба по мишени. Пример реализации на Visual Basic»

Привожу пример решения задачи, описанной в статье, студентом Алексеем в среде Visual Studio 2017 Community, использовавшим пакет «Разработка классических приложений .Net» и язык Visual Basic.

Интерфейс программы почти совпадает c интерфейсом  примера на C#. Отличия состоят в задании распределения пробоин, вместо круга задается прямоугольник на плоскости с координатам углов (Xmin, Ymin) и (Xmax, Ymax). Не рисуются концентрические окружности мишени. Отсутствует проверка параметров стрельбы на диапазон. Массив точек, в соответствии с условием задачи, одномерный.

Текст файла Form1.vb:

' В одномерном массиве с четным количеством элементов (2N) 
' находятся координаты (x,y) N точек на плоскости.
' Они располагаются в следующем порядке x1, y1, x2, y2, и т.д.
' Определить максимальный радиус круга с центром в начале 
' координат, который содержит все эти точки.

' (C) Алексей

Public Class Form1

' Точка входа для программы
' Shared Sub Main()
' Application.Run(New Form1())
' End Sub

Dim P(2000) As Integer ' массив точек - не более 1000
Dim Rmin As Integer = 0 ' Результат - минимальный радиус
Dim Graph1 As Graphics ' Графический контент - холст

' Задание точек и нахождение минимального радиуса
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' Задание числа точек
Dim n As Integer
n = Convert.ToInt32(TextBox1.Text)
' Диапазон координат
Dim Xmin As Integer = Convert.ToInt32(TextBox2.Text)
Dim Xmax As Integer = Convert.ToInt32(TextBox3.Text)
Dim Ymin As Integer = Convert.ToInt32(TextBox4.Text)
Dim Ymax As Integer = Convert.ToInt32(TextBox5.Text)
' Заполнение массива случайными числами
Randomize()
For i As Integer = 0 To 2 * n - 2 Step 2
P(i) = (Xmax - Xmin) * Rnd() + Xmin
P(i + 1) = (Ymax - Ymin) * Rnd() + Ymin
Next i
' Вывод массива точек (x,y) в ListBox1
ListBox1.Items.Clear()
For i As Integer = 0 To 2 * n - 2 Step 2
ListBox1.Items.Add(Space12(P(i).ToString()) + P(i).ToString() + " " + Str(P(i + 1)))
Next i
' Нахождение минимального радиуса и "номера" точки
Dim R As Double = 0.0 ' минимальный радиус
Dim R1 As Double ' радиус точки (x,y)
Dim k As Integer = -1 ' номер точки, умноженный на 2
' Цикл по всем точкам, нахождение радиуса R
For i As Integer = 0 To 2 * n - 2 Step 2
R1 = Math.Sqrt(P(i) * P(i) + P(i + 1) * P(i + 1))
If R1 > R Then
R = R1
k = i
End If
Next i
Rmin = R ' Текстовый результат
' Вывод результата
ListBox2.Items.Clear()
ListBox2.Items.Add("Результат :")
ListBox2.Items.Add("Радиус круга = " + Rmin.ToString())
' Для контроля:
ListBox2.Items.Add("точка № " + (k / 2 + 1).ToString() + " x = " + P(k).ToString() + " y = " + P(k + 1).ToString())
End Sub

' Для выравнивания вывода чисел
Public Function Space12(s As String) As String
Dim t As Integer = 12 - s.Length
Dim s1 As String = String.Empty
For j As Integer = 0 To t - 1
s1 = s1 + " "
Next j
Return s1
End Function

' Графическая иллюстрация
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim Pen1 As New Pen(Color.Black, 2) ' Линии
Dim Pen2 As New Pen(Color.Red, 1) ' Окружность
Dim Pen3 As New Pen(Color.Blue, 2) ' Точки
Dim brush1 As New SolidBrush(Color.Black) ' Текст меток на осях
Dim font1 As New Font("Arial", 10) ' Шрифт и размер меток
Dim X, Y As Single

Graph1 = Me.PictureBox1.CreateGraphics() ' Связывание холста с pictureBox
'Рисуем шкалу координат
'По оcи X
For X = -200 To 200 Step 50
Graph1.DrawString(X, font1, brush1, X + 200, 200)
Next X
'По оcи Y
For Y = -200 To 200 Step 50
Graph1.DrawString(Y, font1, brush1, 200, 200 - Y)
Next Y
'Преобразование компьютерной системы координат в математическую
'Поворот оси Y
Graph1.ScaleTransform(1, -1)
'Сдвиг по осям X и Y
Graph1.TranslateTransform(200, -200)
'Рисование осей математической системы координат
'Ось X
Graph1.DrawLine(Pen1, -200, 0, 200, 0)
'Ось Y
Graph1.DrawLine(Pen1, 0, -200, 0, 200)
'Делаем засечки по осям координат
'По оси X
For X = -200 To 200 Step 50
Graph1.DrawLine(Pen1, X, -5, X, 5)
Next X
'По оси Y
For Y = -200 To 200 Step 50
Graph1.DrawLine(Pen1, -5, Y, 5, Y)
Next Y
'Рисуем точки и окружность
Dim n = Convert.ToInt32(TextBox1.Text)
For i As Integer = 0 To 2 * n - 2 Step 2
Graph1.DrawEllipse(Pen3, P(i), P(i + 1), 2, 2)
Next i
Graph1.DrawEllipse(Pen2, -Rmin, -Rmin, 2 * Rmin, 2 * Rmin)
End Sub

' Очистка поля рисования
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Graph1.Clear(Color.AliceBlue)
End Sub
End Class

Результаты:

Сравните тексты программ, особенно в части графической иллюстрации, и вы увидите почти полное совпадение. И это не удивительно, ведь используются одни и те же  библиотеки .Net Ftamework.

Попробуйте перевести программы с языка C# на Visual Basic, руководствуясь  представлениями об общих библиотеках.


NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.


Помощь проекту:

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x