Определение расположения отрезка относительно другого

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
hllh
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 26.02.2004 (Чт) 21:39

Определение расположения отрезка относительно другого

Сообщение hllh » 24.03.2004 (Ср) 23:03

Мне надо решить вот такую задачу: начертить четырехугольник с координатами (х1, у1), (x2, y2), (x3, y3), (x4, y4) и отрезок с координатами (Х5, у5) и (х6,у6), и найти наименьшее расстояние от отрезка до фигуры.
Для определения расположения отрезка я пишу так:
p = True
z1 = (x5 - x1) * (y2 - y1) - (y5 - y1) * (x2 - x1)
x2 = (x6 - x1) * (y2 - y1) - (y6 - y1) * (x2 - x1)
If z1 * z2 > 0 Then p = False
z3 = (x1 - x5) * (y6 - y5) - (y1 - y5) * (x6 - x5)
z4 = (x2 - x5) * (y6 - y5) - (y2 - y5) * (x6 - x5)
If z3 * z4 > 0 Then p = False
Text13 = p
Иногда выдается правильное значание, но чаще всего неправильное.
Что здесь неправильно???
И ещё я не знаю как определить расстояние между двумя отрезками..
Прдскажите пожалуйста как все это сделать.

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 25.03.2004 (Чт) 11:49

Насколько я понимаю, здесь ты вычисляешь, пересекаются ли отрезки (x5, y5) - (x6, y6) и (x1, y1) - (x2, y2).

Правильно ли я понимаю, что расстоянием от отрезка до четырехугольника ты будешь считать
1) 0 - если пересекается с одним из отрезков
2) наименьшее расстояние от любого конца отрезка до одной из сторон четыреугольника (выберешь наименьшее из всех возможных)

Еще есть вопрос, ято ты считаешь расстоянием от точки до отрезка - расстояние от точки до прямой, включающей отрезок?

Такое расстояние я бы считала по формуле вычисления высоты треугольника (1 конец нашего отрезка + 2 вершины стороны 4х-угольника образуют треугольник) через полупериметр. Но может, народ подскажет что-нибудь получше.
h(a) = sqrt( p(p-a)(p-b)(p-c) )/a, где р = (a+b+с)/2
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

hllh
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 26.02.2004 (Чт) 21:39

Сообщение hllh » 25.03.2004 (Чт) 12:04

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

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 25.03.2004 (Чт) 13:14

hllh писал(а):
под расстоянием я подразумеваю перпендикуляр от отрезка к ближайшей стороне.

По-моему, ты не прав. В том смысле, что кратчайшим расстоянием тогда будет
1) либо перпендикуляр из конца отрезка до стороны
2) перпендикуляр из конца стороны до отрезка
3) расстояние между концами

Что ты об этом думаешь?

И про взаимное положение - неправильно вычисляет, пересекает фигуру или нет?
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

hllh
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 26.02.2004 (Чт) 21:39

Сообщение hllh » 25.03.2004 (Чт) 20:11

По-моему, ты не прав. В том смысле, что кратчайшим расстоянием тогда будет
1) либо перпендикуляр из конца отрезка до стороны
2) перпендикуляр из конца стороны до отрезка
3) расстояние между концами
Я тут подумал и согласился с этим.

И про взаимное положение - неправильно вычисляет, пересекает фигуру или нет?
Иногда вычисляет правильно, а иногда нет.
Вообще смысл вот этого
p = True
z1 = (x5 - x1) * (y2 - y1) - (y5 - y1) * (x2 - x1)
x2 = (x6 - x1) * (y2 - y1) - (y6 - y1) * (x2 - x1)
If z1 * z2 > 0 Then p = False
z3 = (x1 - x5) * (y6 - y5) - (y1 - y5) * (x6 - x5)
z4 = (x2 - x5) * (y6 - y5) - (y2 - y5) * (x6 - x5)
If z3 * z4 > 0 Then p = False
Text13 = p
в том, что если (x5 - x1) * (y2 - y1) - (y5 - y1) * (x2 - x1)=0 то точка принадлежит отрезку, а если <> то лежит либо по одну сторону от него либо по другую. Если 2 точки отрезка лежат по разные стороны, то z1*z2<0 (отрезок пересекает сторону) а если по одну то z1*z2>0 и отрезок не пересекает сторону.

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 26.03.2004 (Пт) 11:42

Я не могу понять, почему у тебя выдает неправильный результат... Я открыла проект, создала форму, на нее кинула 2 отрезка A и O. Написала для них функцию проверки, что отрезки пересекаются

Код: Выделить всё
Dim bResult As Boolean
bResult = True
Dim z1 As Double, z2 As Double, z3 As Double, z4 As Double
z1 = (O.X1 - A.X1) * (A.Y2 - A.Y1) - (O.Y1 - A.Y1) * (A.X2 - A.X1)
z2 = (O.X2 - A.X1) * (A.Y2 - A.Y1) - (O.Y2 - A.Y1) * (A.X2 - A.X1)
If (z1 * z2 > 0) Then
    bResult = False
End If

z3 = (A.X1 - O.X1) * (O.Y2 - O.Y1) - (A.Y1 - O.Y1) * (O.X2 - O.X1)
z4 = (A.X2 - O.X1) * (O.Y2 - O.Y1) - (A.Y2 - O.Y1) * (O.X2 - O.X1)
If (z3 * z4 > 0) Then
    bResult = False
End If

MsgBox IIf(bResult, "yes", "no")


Теоретическое обоснование факта я тоже теперь могу написать - это из параметрического уравнения прямой, проходящей через 2 точки. Вроде, все правильно :roll:
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

hllh
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 26.02.2004 (Чт) 21:39

Сообщение hllh » 27.03.2004 (Сб) 9:37

Все заново набрал стало работать. Видимо гдето допустил тупую описку. :oops:

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 29.03.2004 (Пн) 12:17

А дальше ты нашел способ, как сделать? Как вычислять расстояние от точки до отрезка? Там через скалярное произведение векторов и то же параметрическое уравнение прямой, вроде, неплохо получается...
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

hllh
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 26.02.2004 (Чт) 21:39

Сообщение hllh » 29.03.2004 (Пн) 19:57

Да я все сделал :P . Через высоты и расстояния между концами отрезков, правда пришлось там проверять чтобы высота падала на отрезок


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

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

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

    TopList  
cron