Возникла сабжевая задача.... Как заправский лентяй прежде чем что-то реализовывать поискал в тырнете... Нашел вот такой вот кусок кода:
bool IntersectCircleLine(const Vec2¢er,float radius,const Vec2&p1,const Vec2&p2)
{
float x01=p1.x-center.x;
float y01=p1.y-center.y;
float x02=p2.x-center.x;
float y02=p2.y-center.y;
float dx=x02-x01;
float dy=y02-y01;
float a=dx*dx+dy*dy;
float b=2.0f*(x01*dx+y01*dy);
float c=x01*x01+y01*y01-radius*radius;
if(-b<0)return (c<0);
if(-b<(2.0f*a))return (4.0f*a*c-b*b<0);
return (a+b+c<0);
}
Вбил, попробовал — таки работает... Но вот только как — не пойму
Мож кто разъяснит убогому?
P.S. Как бы я сам это делал — нашел бы точку пересечения перпендикуляра опущеного с центра круга с отрезком прямой. Если она лежит в середине круга то прямая пересекает круг... Иначе нет... В принципе аналитически я все это даже вывел, но получается несколько более громоздко чем вышепреведенное решение.
Здравствуйте, Esef, Вы писали:
E>Возникла сабжевая задача.... Как заправский лентяй прежде чем что-то реализовывать поискал в тырнете... Нашел вот такой вот кусок кода:
[]
E>Вбил, попробовал — таки работает... Но вот только как — не пойму
E>Мож кто разъяснит убогому?
Вот
здесь решение с объяснением
Здравствуйте, Esef, Вы писали:
E>Возникла сабжевая задача.... Как заправский лентяй прежде чем что-то реализовывать поискал в тырнете... Нашел вот такой вот кусок кода:
skipped
E>Вбил, попробовал — таки работает... Но вот только как — не пойму
E>Мож кто разъяснит убогому?
E>P.S. Как бы я сам это делал — нашел бы точку пересечения перпендикуляра опущеного с центра круга с отрезком прямой. Если она лежит в середине круга то прямая пересекает круг... Иначе нет... В принципе аналитически я все это даже вывел, но получается несколько более громоздко чем вышепреведенное решение.
По-моему можно найти расстояние от центра окружности до прямой (или отрезка — чуть переписать придется) и проверить больше ли радиус этого расстояния или меньше.
Здравствуйте, Esef, Вы писали:
Действительно вначале мы находим вектор проходящий от центра шарика к линии.
тут теория как это сделать без корней и т.д.
http://www.euclideanspace.com/maths/geometry/elements/line/projections/index.htm
потом банально сравниваем длину этого вектора с радиусом , а точнее квадрат длины с квадратом радиуса.