Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2009, 09:22   #1
pavelstraut
Пользователь
 
Регистрация: 17.07.2009
Сообщений: 91
По умолчанию алгоритм поиска общих точек двух прямых

нужно найти точки пересечения 2 прямых вида
a1*x+b1*y=c1
a2*x+b2*y=c2
или указать что они не пересекаются или совпадают
pavelstraut вне форума Ответить с цитированием
Старый 27.09.2009, 10:34   #2
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Код:
...
struct Line{
   double a , b , c;
};
...
void getIntersect(double *x , double *y , Line f , Line s){
  double d = f.a * s.b - s.a * f.b;
  *x = (f.b * s.c - s.b * f.c) / d;
  *y = (f.c * s.a - s.c * f.a) / d;
}
...
Да-да: для линии структура есть, а точки по отдельности. Просто я взял кусок из своей программы.
Проверишь d - если d = 0, то прямые параллельны(а значит, возможно, совпадают).

Последний раз редактировалось megachuhancer; 27.09.2009 в 10:41.
megachuhancer вне форума Ответить с цитированием
Старый 27.09.2009, 10:52   #3
Skrip
Пользователь
 
Аватар для Skrip
 
Регистрация: 04.06.2009
Сообщений: 45
По умолчанию

у прямых точка пересечения одна (за исключением случаев совпадения и параллельности)

тут надо всего лишь провести анализ формул:
общий вид прямой: y=kx+b, следовательно для 2-х прямых
y1=k1x+b1 и y2=k2x+b2
точка пересечения имеет координаты (приравнять правые части)
(x=(b2-b1)/(k1-k2), y = y1(x) или y=y2(x) );
так же: если k1=k2 и b1=b2 - прямые совпадают (формулы одинаковые)
если k1=k2 и b1 != b2 - прямые параллельны (углы наклона одинаковые а смещение различно).

в твоем случае: a1x+b1y=c1 получаем
y=(c1-a1x)/b1, т.е. k=-a1/b1, b=c1/b1, аналогично для второй.
Я спокойный, вежливый и уравновешенный человек
Skrip вне форума Ответить с цитированием
Старый 27.09.2009, 12:02   #4
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Ax + By + C = 0 круче. Можно задать прямые параллельные оси y, не рассматривая частные случаи.

К предыдущему своему посту могу добавить, что если прямые параллельны, то совпадают они, когда c1 = c2

Последний раз редактировалось megachuhancer; 27.09.2009 в 12:06.
megachuhancer вне форума Ответить с цитированием
Старый 27.09.2009, 14:07   #5
pavelstraut
Пользователь
 
Регистрация: 17.07.2009
Сообщений: 91
По умолчанию

еще нужно указать если прямая не существует
при каких условиях она может не существовать?
pavelstraut вне форума Ответить с цитированием
Старый 27.09.2009, 14:14   #6
pavelstraut
Пользователь
 
Регистрация: 17.07.2009
Сообщений: 91
По умолчанию

и можно еще пример рабочего кода
pavelstraut вне форума Ответить с цитированием
Старый 27.09.2009, 15:00   #7
pavelstraut
Пользователь
 
Регистрация: 17.07.2009
Сообщений: 91
По умолчанию

рабочий код не нужен
но прямые могут совпадать не только когда a1=a2 b1=b2
но и когда x*a1=a2 x*b1=b2 x*c1=x*c2
pavelstraut вне форума Ответить с цитированием
Старый 28.09.2009, 04:54   #8
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Цитата:
и можно еще пример рабочего кода
pavelstraut, что такое?! Вот тебе рабочий код(смотри пост вверху) - вполне рабочая функция.
Цитата:
рабочий код не нужен
Не нужен, так не нужен.
Цитата:
но прямые могут совпадать не только когда a1=a2 b1=b2
но и когда x*a1=a2 x*b1=b2 x*c1=x*c2
Прямые совпадают, тогда и только тогда, когда они параллельны и c1 = c2. А параллельны они тогда и только тогда, когда A1 * B2 - A2 * B1 = 0. Т.е. d = 0. Про что я уже вообще-то сказал.

См. также http://programmersforum.ru/showthread.php?t=64057

Последний раз редактировалось megachuhancer; 28.09.2009 в 05:06.
megachuhancer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение двух точек. alien608 Паскаль, Turbo Pascal, PascalABC.NET 0 11.05.2009 19:49
Определить какая из точек находится ближе к началу координат(алгоритм ветвления). Rakfeller Паскаль, Turbo Pascal, PascalABC.NET 16 25.01.2009 02:01
(С++)построить окружность, проходящую через k>=3 точек каждого из двух множеств... Suitable Помощь студентам 1 18.01.2009 23:19
Алгоритм поиска... Johnson Общие вопросы Delphi 1 26.10.2008 08:35