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++,
пособие по вкручиванию лампочек,
сломай себе моск