Мдя. Была и у меня такая проблема. Нужно было делать программу "Редактор чертежей".
Для того чтобы это сделать нужно очень хорошо знать математику, на всякий случай даю МАТЕМ-МОДУЛЬ
- Код: Выделить всё
Global Const TwoPi As Single = 6.2831853071795
Global Const PI As Single = 3.14159265358979
Public Function ArcSine(TheNumber As Double) As Single
Dim N2 As Double
On Error Resume Next
N2 = Sqr(-TheNumber * TheNumber + 1)
If Not N2 = 0 Then
ArcSine = Atn(TheNumber / N2)
End If
On Error GoTo 0
End Function
Public Function GetAngle(XCenter As Single, YCenter As Single, ToX As Single, ToY As Single) As Single
On Error Resume Next
'Определяем дистанцию между точками
'т.е гипот-зу если катетами будут проэкции
'расстояния между точками на оси Х и У
Distance = Sqr((Abs(XCenter - ToX)) * (Abs(XCenter - ToX)) + (Abs(YCenter - ToY)) * (Abs(YCenter - ToY)))
'Находим угол (в радианах)
Gradus = ArcSine((YCenter - ToY) / Distance)
'Исправляем неточности при высчитывании арксинуса
If XCenter = ToX Then
If ToY < YCenter Then
Gradus = PI / 2
End If
If ToY > YCenter Then
Gradus = TwoPi - PI / 2
End If
End If
If ToY > YCenter And ToX < XCenter Then
Gradus = TwoPi + Gradus
End If
If XCenter < ToX Then Gradus = PI - Gradus
GetAngle = Gradus
End Function
Public Function GetDistance(X1 As Single, Y1 As Single, X2 As Single, Y2 As Single) As Single
GetDistance = Sqr((Abs(X1 - X2)) * (Abs(X1 - X2)) + (Abs(Y1 - Y2)) * (Abs(Y1 - Y2)))
End Function
Описание функций:
GetDistance - расстояние между двумя точками (теорема Пифагора)
GetAngle - возвращает угол между горизонтом и прямой проведённой между двумя точками
ArcSine - код функции "арксинус" (и почему её нет в ВБ
)
Итак что нам нужно сделать чтобы повернуть квадрат:
Первое, что должно было пожаловать в голову, это то, что выполнять это в прямоугольных декартовых координатах неудобно (а точнее сказать невозможно)
Поэтому надо перевести координаты каждой точки из декартовых в полярные.
Полярные координаты характеризуют точку по двум величинам: удалённость от начала координат (R) и угол наклона прямой между началом координат и точкой (тетта).
Так вот нам нужно повернуть фигуру (и не обязательно это должен быть прямоугольник) вокруг какой то точки. Т.е. нам нужно повернуть каждую точку этой фигуры вокруг точки вращения на определённый угол. Используя полярную систему координат нам нужно просто прибавить к тетте каждой точки нужный угол поворота.
Итак, самое сложное МАТЕМАТИКА!
(Модуль с МАТ-Функциями я уже выложил)
Объявим два типа для точки:
- Код: Выделить всё
Public Type POINT_DECART
X as Single
Y as Single
End Type
Public Type POINT_POLAR
Theta as Single
R as Single
End Type
Ещё понадобится два массива, в которых будем хранить точки (хотя можно было обойтись одним)
- Код: Выделить всё
Dim dPoints(1 To 4) as POINT_DECART
Dim pPoints(1 to 4) as POINT_POLAR
А теперь в принципе и сам код
- Код: Выделить всё
'====Инициализируем нашу фигуру (пусть это будет ромб)======
dPoints(1).x = -1: dPoints(1).y = 0
dPoints(2).x = 0: dPoints(2).y = -3
dPoints(3).x = 1: dPoints(3).y = 0
dPoints(4).x = 0: dPoints(4).y = 3
'====Перевод координат (из дек. в полярные)
For i = 1 To 4
pPoints(i).R = GetDistance(0, 0, dPoints(i).x, dPoints(i).y)
pPoints(i).Theta = GetAngle(0, 0, dPoints(i).x, dPoints(i).y)
Next i
'====== ПРОЦЕСС ВРАЩЕНИЯ ============
' Здесь будем вращать картинку на 45 гр.
' Только нужно не забыть перевести градусы в радианы.
For i = 1 To 4
pPoints(i).Theta = pPoints(i).Theta + (45) * PI / 180
Next i
'==== ПЕРЕВОДИМ ОБРАТНО В ДЕКАРТОВЫ==========
For i = 1 To 4
dPoints(i).x = Cos(pPoints(i).Theta) * pPoints(i).R
dPoints(i).y = Sin(pPoints(i).Theta) * pPoints(i).R
Next i
Вот собственно и всё.
Чтобы всё было окончательно понятно прилагаю проект.
Должен будешь
-