Математика: алгоритм определения пересечения двух отрезков
Так вот, у меня всю жизнь было плохо с математикой и столкнулся с такой проблемой. Есть два отрезка с совершенно рандомными координатами от -10000 до +10000, нужно определить пересекаются ли данные отрезки или нет. В интернете пытался найти готовый алгоритм - не получилось. Видимо, задача тривиальна..
У кого есть идеи или кто сталкивался с таким вопросом, подскажите пожалуйста. От готового решения также не откажусь =) Заранее, спасибо!
Находим точку пересечения двух прямых, и если она есть, проверяем, лежит ли она на обоих отрезках.
Найти пересечение элементарно - нужно решить систему уравнений прямых.
Найти пересечение элементарно - нужно решить систему уравнений прямых.
Это при условие, что у нас есть уравнения описывающие данные отрезки. Но у нас есть только начальные и конечные точки отрезков.
уравнение прямой y= k*x + b
где k тангенс угла наклона прямой (отношение противолежащего катета к прилежащему, катеты можно легко найти, зная координаты точек отрезка)
b - некая постоянная (то значение Y где прямая пересекает ось OY)
таковые легко получить имея две точки прямой (x1, y1, z1), (x2, y2, z2)
(x-x1) (y-y1) (z-z1)
------= ----- = ------
(x2-x1) (y2-y1) (z2-z1)
где знаменатели дробей соответственно равны m, n и p
Для двух прямых имеем:
m1, n1, p1
m2, n2, p2
Если отношения m1/m2 равно n1/n2 и равно p1/p2, то прямые параллельны, в потивном случае они пересекаются.
Для двумерного случая дробь с координатой z не нужна.
Далее, если прямые не параллельны, находим точку пересечения, решая систему уравнений, как это было сказано тов. hardcase
Находим точку пересечения двух прямых, и если она есть, проверяем, лежит ли она на обоих отрезках.
Найти пересечение элементарно - нужно решить систему уравнений прямых.
Имея такую книгу, могу сказать, что найти её не так просто. На сайте издательства она быват далеко не всегда, не говоря о магазинах.
Я бы посоветовал книгу Дмитрия Письменного "Конспект лекций по высшей математике" ( 1-ю часть). Там есть аналитическая геометрия, к которой как раз и относится первоначальный вопрос. К тому же в весьма доступной форме. Да и вообще по аналитической геометрии в недрах паутины материала предостаточно.
где k тангенс угла наклона прямой
Только такое уравнение не подходит для вертикальных прямых так как у 90 градусов нет тангенса. Ето надо учитывать.
(x-x1) (y-y1) (z-z1)
------= ----- = ------
(x2-x1) (y2-y1) (z2-z1)
Ну и тут по сути надо учитывать то же самое. В знаменателе может и 0 получится.
ЗЫ. Также не забудьте что если прямые и паралельни, то отрезки всеровно могут иметь общую точку, а возможно и частично накладываться.
Я бы посоветовал книгу Дмитрия Письменного "Конспект лекций по высшей математике" ( 1-ю часть). Там есть аналитическая геометрия, к которой как раз и относится первоначальный вопрос. К тому же в весьма доступной форме. Да и вообще по аналитической геометрии в недрах паутины материала предостаточно.
Я не говорю о бумажной версии этой книги, я говорю об электронном варианте, который найти в рунете как расплюнуть...;) В ней как раз и рассматриваются вопросы по сабжу... Также обсуждаются вопросы и перекрывающихся прямых, и т.д. и т.п. Да и представленные в ней алгоритмы универсальны...
Да нет там геометрии если я правильно понял. У нево только одна координата Х. Отрезки в одномерном пространстве.
Вы и не будете искать точку пересечения, если это не надо... Вы найдёте один единственный параметр и если он будет лежать вне интервала [0;1], то отрезки прямых не пересекаются. Короче, читайте, учите, ищите, разбирайтесь... Литературу Вам указали...
Короче вот функция на java (с портированием на C я думаю проблем не будет :), определяющая пересекаются ли два отрезка на плоскости:
{
double v1=(bx2-bx1)*(ay1-by1)-(by2-by1)*(ax1-bx1);
double v2=(bx2-bx1)*(ay2-by1)-(by2-by1)*(ax2-bx1);
double v3=(ax2-ax1)*(by1-ay1)-(ay2-ay1)*(bx1-ax1);
double v4=(ax2-ax1)*(by2-ay1)-(ay2-ay1)*(bx2-ax1);
return ((v1*v2<=0) && (v3*v4<=0));
}
Функция возвращает true если отрезки A и B пересекаются.
ax1, ay1 - координаты первой точки отрезка A ну и т.д.
Вот ищу нечто подобное для определения пересекает ли отрезок круг.
Если известны координаты отрезка, координаты центра круга и его радиус.
Ссылка на решение задачи была дана в #6. Автор, кстати, просил хотя бы алгоритм.
Вот ищу нечто подобное для определения пересекает ли отрезок круг.
Если известны координаты отрезка, координаты центра круга и его радиус.
Решите аналитически систему уравнений:
а) окружности
б) прямой
"Линейка", первый курс.
Если "программист" не в сосотоянии прочитать простые формулы из справочника и/или выполнить тривиальные выкладки, то ему наверняка нужно подыскивать новую специальность.
Это ссылка не на решение задачи, а на статью Википедии о прямой.
И естественно никаких алгоритмов там нет.
Решите аналитически систему уравнений:
а) окружности
б) прямой
"Линейка", первый курс.
Очень "полезный" совет, никогдаб не догадался.
Переходим по ссылке, находим подраздел "Взаимное расположение нескольких прямых на плоскости" и (о чудо!) обнаруживаем там формулу, которую вы записали в своем предыдущем посте. А как найти коэффициенты канонического уравнения? - спросите вы. А очень просто: на той же самой странице есть уравнение прямой проходящей через две заданные точки. Имеющий глаза да узрит решение.
С каких это пор язык математики перестал выражать суть исполняемых компьютером действий?
Для общего развития: слова алгоритм и арифметика восходят к одному корню.
Ну так и вперед! Че, лень пошевелить мозгами, ага?
[quote="некто"]
Зачем тогда вообще отвечать на форуме? Можно просто на все посты давать две ссылки на википедию и на Google
[/quote]
Каков вопрос - таков ответ.
исходные данные: отрезок AB, радиус R.
Возможные варианты:
1) растояния до точек отрезка < R -> отрезок внутри окружности
2) одно из растояний до отрезка > R, а другое < R -> ответ очевиден
3) AR & BR > R - строим перпендикуляр от центра окружности к отрезку (точка C)
CR > R -> отрезок находится за пределами окружности.
А центр окружности разве не нужен? :D
исходные данные: отрезок AB, радиус R.
Возможные варианты:
1) растояния до точек отрезка < R -> отрезок внутри окружности
2) одно из растояний до отрезка > R, а другое < R -> ответ очевиден
3) AR & BR > R - строим перпендикуляр от центра окружности к отрезку (точка C)
CR > R -> отрезок находится за пределами окружности.
А решить одно квадратное уравнение с одним неизвестным уже не по силам? ;)
а как же без него?
И точку С необходимо проверит на принадлежность отрезку, и...
А решить одно квадратное уравнение с одним неизвестным уже не по силам?
Может проще привести уравнение, чем каждый раз отвечать вопросом на вопрос???
он даже не желает набрать в гугле пересечение отрезков и выбрать из десятков готовых решений...
public Point Crossing(Point p1, Point p2, Point p3, Point p4)
{
if (p3.X == p4.X) // вертикаль
{
double y = p1.Y + ((p2.Y - p1.Y) * (p3.X - p1.X)) / (p2.X - p1.X);
if (y > Math.Max(p3.Y, p4.Y) || y < Math.Min(p3.Y, p4.Y) || y > Math.Max(p1.Y, p2.Y) || y < Math.Min(p1.Y, p2.Y)) // если за пределами отрезков
return new Point(0, 0);
else
return new Point(p3.X, (int)y);
}
else // горизонталь
{
double x = p1.X + ((p2.X - p1.X) * (p3.Y - p1.Y)) / (p2.Y - p1.Y);
if (x > Math.Max(p3.X, p4.X) || x < Math.Min(p3.X, p4.X) || x > Math.Max(p1.X, p2.X) || x < Math.Min(p1.X, p2.X)) // если за пределами отрезков
return new Point(0, 0);
else
return new Point((int)x, p3.Y);
}
}
Вот пример получения точки пересечения для 2 перпендикулярных отрезков (может кому пригодится):
if ( Math.min(p1.x, p2.x) > p3.x || Math.max(p1.x, p2.x) < p3.x
|| Math.min(p3.y, p4.y) > p1.y || Math.max(p3.y, p4.y) < p1.y) {
// не пересекаются
return {x: 0, y: 0};
} else
return {x: p3.x, y: p1.y};
}