Лежит ли точка в эллипсе

Mar 14, 2012 15:38

Уже в который раз встречаю код, написанный для проверки того, лежит ли искомая точка в заданном эллипсе или нет. При том, что существует масса различных реализаций этого метода (включая численный, sic!), сама задача тривиальна по сути и решается всего лишь парой строчек кода. Фактически, всё что нужно, это сравнить сумму расстояние искомой точки от обоих фокусов с максимальным расстоянием (которое будет константным для данного эллипса и может быть легко дефинировано)

Усложним задачу, пусть задан только прямоугольник, в который вписан искомый эллипс. Тогда, в начале, вам потребуется найти фокусы эллипса. Если эллипс имеет фиксированную длину и ширину, то сделать это тоже нужно будет всего один раз.

Итак, пусть прямоугольник задан двумя точками (X1, Y1) и (X2, Y2). Большая (a) и малая (b) полуоси будут, соответственно, равны:

a = abs(X1 - X2) / 2;
b = abs(Y1 - Y2) / 2;

Далее, если a > b (в противном случае эллипс расположен вертикально и всю систему нужно будет просто повернуть), эксцентриситет (e) эллипса будет равен равен:

e = sqrt (1 - (b*b) / (a*a));

Фокальный радиус (с) равен:

с = a * e;

Координаты фокусов, соответственно, равны:

FX1 = (X1 + X2) / 2 - c;
FX2 = (X1 + X2) / 2 + c;
FY = (Y1 + Y2) / 2;

Максимальное расстояние (D) будет равно:

D = a * (3 - e);

Расстояние (P) точки (PX, PY) до фокусов, соответственно, будет равно

P = sqrt((FX1 - PX) * (FX1 - PX) + (FY - PY) * (FY - PY)) + sqrt((FX2 - PX) * (FX2 - PX) + (FY - PY) * (FY - PY));

Если P <= D, точка лежит на поверхности или внутри эллипса.

Вопрос, современные программисты не изучали геометрию в школе?

c++, пособие по вкручиванию лампочек, сломай себе моск

Previous post Next post
Up