Форум: "Игры";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
ВнизКоллизия Круга и Линии?? Найти похожие ветки
← →
ArhangelM (2004-02-03 19:57) [0]Как определить столкновения линии и круга при том условии что параметры круга: x,y,радиус, а параметры линии: x,y начальные и конечные. => Линия может быть под углом!! Желательно Функцию целиком!! ЗАранее благодарен!!
← →
VMcL © (2004-02-03 20:50) [1]Система ур-ний:
sqr(x - x0) + sqr(y - y0) = sqr(R);
ax + by + c = 0;
где x0, y0 - центр окружности, R - ее радиус; a, b - параметры прямой.
← →
Wild (2004-02-04 10:09) [2]:) недавно столкнулся с похожей проблемой - может тебе поможет.
У меня была задача определить попала ли точка на линию, но...с заданной погрешностью, т.е. можно трактовать, что погрешность это и есть радиус окружности вокруг проверяемой точки.
Итак, у нас есть отрезок A(x1,y1) - B(x2,y2), и точка C(x3,y3) {твой центр окружности}. Построим мысленно треугольник ACB и опустим высоту из точки С на основание АВ. Нам надо посчитать ее длину. Высота, ессно, поделит наш треугольник на два прямоугольных треугольника...и построив систему уравнений - я пришел к такой формуле: Обозначим длину высоты - h. Пусть высота пересекает основание АВ в точке D. Найдем длины строн a=AC, b=CB, c=AB. Я уверен, что длину отрезков этих ты знаешь как найти, но на всякий случай напишу:
Например АС, a = SQRT( SQR(x3-x1)+SQR(y3-y1) )
остальные аналогично.
Пусть d=AD, для нее я построил такую формулу:
d = (c*c+a*a-b*b)/(2*c) //если надо, пришлю ход мыслей :)
Теперь мы должны проверить d:
- если оно меньше 0, то угол CAD тупой и высота AD не опускается на основание AB (этот случай рассмотрим ниже)
- если d > C, то другой угол тупой и тоже высота не опускается
:) Ну а если все нормально, то теперь считаем высоту:
h = SQRT( a*a-d*d );
Проверяем значение h - если оно 0<=h<=R(твой радиус), то прямая пересекает окружность, и обратно....
Теперь, мне кажется, надо разобраться с теми двумя случаями, когда углы тупые получаются (в моей задаче это просто не надо было). Я думаю, что здесь надо просто проверить попадание концов отрезка внутрь окружности:
sqr(x - x0) + sqr(y - y0) <= sqr(R); //как написано выше...
теперь вместо x,y подставляешь по очереди начало и конец отрезка
и проверяешь неравенство.
Успехов.
← →
MBo © (2004-02-04 10:20) [3]согласно определению круга достаточно вычислить расстояние от цетра до отрезка, например, как здесь:
http://algolist.manual.ru/maths/geom/distance/pointline.php
← →
Wild (2004-02-04 11:28) [4]кста, VMcL - мне кажется твой метод не будет работать, если отрезок будет внутри круга, а ведь коллизия имеется....
← →
VMcL © (2004-02-04 19:13) [5]>>Wild (04.02.04 11:28) [4]
Аргументируй.
← →
Vertex (2004-02-04 21:10) [6]Блин MBo прав, че за геморой?
Проводим из центра окружности перпендикуляр к прямой, если он меньге равен радиусу окружности, значит коллизия есть.
← →
MBo © (2004-02-05 06:15) [7]>Vertex
Не только это, еще концы отрезка проверить.
← →
Wild (2004-02-05 12:26) [8]>VMcL
сорри, :) прямая не может быть полностью внутри окружности - она ж бесконечная
НО! нам интересна не прямая, а отрезок. Читай сабж.
← →
ArhangelM (2004-02-05 18:14) [9]>Vertex
Это коллизия с точкой!!
← →
MBo © (2004-02-05 18:23) [10]>ArhangelM (05.02.04 18:14) [9]
>Это коллизия с точкой!!
Это ты о чем?
← →
VMcL © (2004-02-06 15:05) [11]>>Wild (05.02.04 12:26) [8]
>НО! нам интересна не прямая, а отрезок. Читай сабж.
Прочитай сам: "линия"; что есть линия в пониманиии автора неизвестно. Может он имел в виду прямую, а может отрезок прямой.
← →
Wild (2004-02-06 15:32) [12]блин, ну не сабж
> а параметры линии: x,y начальные и конечные.
Лан, пусть автор сам-то появится. Заделал пост и смылся :)
← →
ArhangelM (2004-02-08 21:15) [13]Кхм... я просто уже решил эту проблему!!
Чё целую неделю коллизию писать чтоль???
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.033 c