Зла не хватает
Ты системы уравнений решать умеешь только численно? или символьно тоже?
Private Type vtCirc
x As Double
y As Double
r As Double
End Type
Private Sub CircleCrossPoints(Cir0 As vtCirc, Cir1 As vtCirc, _
ByRef x1 As Double, ByRef y1 As Double, _
ByRef x2 As Double, ByRef Y2 As Double)
Dim CosAlpha As Double
Dim SinAlpha As Double
Dim ex As Double, ey As Double 'единичный направляющий вектор, _
от Cir0 в сторону Cir1
Dim dx As Double, dy As Double 'вектор Cir0->Cir1
Dim Le As Double
'вектор из 0 в 1
dx = Cir1.x - Cir0.x
dy = Cir1.y - Cir0.y
'его нормировка и подсчет длины
Le = Sqr(dx * dx + dy * dy)
ex = dx / Le
ey = dy / Le
'подсчет косинуса через теорему косинусов
CosAlpha = (Cir0.r ^ 2 + Le ^ 2 - Cir1.r ^ 2) / (2 * Cir0.r * Le)
'Если знаменатель равен нулю, значит _
опорная окружность нулевого радиуса (бяка), _
или центры окружностей совпадают (тоже бяка)
If Abs(CosAlpha) > 1 Then
'косинус угла по модулю больше единицы - нет такого угла
Err.Raise 1212, , "No intersection!"
End If
SinAlpha = Sqr(1 - CosAlpha ^ 2)
x1 = Cir0.x + ex * CosAlpha + ey * SinAlpha
y1 = Cir0.y + ey * CosAlpha + -ex * SinAlpha
x2 = Cir0.x + ex * CosAlpha + ey * -SinAlpha
Y2 = Cir0.y + ey * CosAlpha + -ex * -SinAlpha
End Sub
Function ASin(ByVal SinValue As Double) As Double
ASin = Atn(Sqr(1 / (1 / SinValue ^ 2 - 1)))
End Function
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 93