Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > прямая и точка


Автор: duk 1.11.2008, 00:32
Здравствуйте! У меня такой вопрос (когда-то я эту задачу решал, но сейчас как-то торможу): есть прямая (даны координаты точек, через которые она проходит), где-то рядом находится точка (координаты тоже известны), нужно определить с какой стороны от прямой находится точка. 

Решал её раньше через функцию похожую на  арктангенс из набора дельфийского. Позабывал напрочь все  smile .
Если кому не влом, дайте код на делфи. smile 

Автор: 4d5a 1.11.2008, 07:07
функция прямой есть f(x)=kx+b
если она проходит через 2 точки, то
k=(y2-y1)/(x2-x1), а
b=y1-kx1
пусть точка (которая гдето рядом с прямой) упала на (x3 y3), тогда
если f(x3)>y3, значит точка ниже прямой, если равны, значит на прямой иначе выше прямой.


Автор: Rickert 1.11.2008, 07:10
У этой задачи нет однозначного решение, потому что нет условия "что значит с какой стороны"? Скольки-мерное пространство?

Автор: duk 1.11.2008, 11:15
Цитата(Rickert @  1.11.2008,  07:10 Найти цитируемый пост)
Скольки-мерное пространство?

двух

Цитата(Rickert @  1.11.2008,  07:10 Найти цитируемый пост)
"что значит с какой стороны"

если прямая вертикальная - слева или справа, если нет - сверху или снизу, ну как-то так.

Автор: duk 1.11.2008, 11:32
Rickert, вообще задача вот в чем. Есть массив координат - это координаты реки. Напрваление течения реки определяется так - из первой точки в последнюю. У реки есть притоки - нужно определить правый приток или левый.
Наверное точне было бы спросить, с какой стороны находится точка по отношению к вектору.

Автор: Rickert 1.11.2008, 11:47
Поиск угла между векторами:
Код
aVector vec;//нормализованный вектор 1
aVector vec2;//нормализованный вектор 2

float dot = aaDotMulty(vec, vec2);//скалярное произведение

if (dot > 1.0)
  dot = 1.0;
if (dot < (-1.0))
  dot = -1.0;

return (acos(dot));//получаем угол

Автор: duk 1.11.2008, 16:56
4d5aRickert, спасибо! Вам по плюсу. smile 

Автор: maxim1000 2.11.2008, 00:10
Цитата(Rickert @  1.11.2008,  11:47 Найти цитируемый пост)
Поиск угла между векторами

если быть более точным, то это - поиск косинуса угла между векторами
а косинус не зависит от того, в какую сторону происходит поворот
для определения знака угла можно использовать определитель (если посмотреть на это из трёхмерного пространства, получится z-координата векторного произведения):
Код

bool Right(double dx1,double dy1,double dx2,double dy2)
{
    return dx1*dy2>dx2*dy1;
}

(Возможно, нужно будет развернуть неравенство - зависит от того, от какого к какому вектору считать угол)

Автор: duk 2.11.2008, 02:34
maxim1000, это то, что мне было нужно!!! Спасибо! +2 (второй добавлю завтра) тебе за это.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)