Точка пересечения двух линий

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.06.2006 (Чт) 13:47

Зла не хватает :twisted:
Ты системы уравнений решать умеешь только численно? или символьно тоже?
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 22.06.2006 (Чт) 14:23

Конь
Напиши на бумажке 4 уравнения для Х1, Y1, X2 и Y2 координат пересечения и перенеси их в вб. Подставляй значения координат центров и радиусы и будет тебе щастье.
Лучший способ понять что-то самому — объяснить это другому.

VT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 22
Зарегистрирован: 22.06.2006 (Чт) 16:31
Откуда: Санкт-Петербург

Сообщение VT » 22.06.2006 (Чт) 17:52

Рисунок:Изображение
И код:
Код: Выделить всё
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

Проверил на тривиальном тесте.

PS. Русские буквы - бяка. Долго мучился с кодировкой.

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 22.06.2006 (Чт) 19:50

Прошу прощения, если мой вопрос опять-таки связан с элементарной геометрией :oops: , но:

Как вычислить угол, имея его синус? :roll:
Подпись находится в стадии разработки...

VT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 22
Зарегистрирован: 22.06.2006 (Чт) 16:31
Откуда: Санкт-Петербург

Сообщение VT » 22.06.2006 (Чт) 20:18

Вроде так
Код: Выделить всё
Function ASin(ByVal SinValue As Double) As Double
ASin = Atn(Sqr(1 / (1 / SinValue ^ 2 - 1)))
End Function

В радианах ответ даст.

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 93

    TopList