Пусть центр эллипса равен (0,0)
(в противном случае просто вычтите координаты центра), полуоси равны a, b
, а угол поворота равен theta
.Мы можем построить аффинное преобразование для преобразования эллипса в круг и применить то же преобразование к точке P.
1) Повернуть на -theta
px1 = px * Cos(theta) + py * Sin(theta)
py1 = -px * Sin(theta) + py * Cos(theta)
2) Расширить (или сжать) вдоль оси OYв a/b
раз
px2 = px1
py2 = py1 * a / b
3) Найти точку пересечения
plen = hypot(px2, py2) (length of p2 vector)
if (a > plen), then segment doesn't intersect ellipse - it fully lies inside
ix = a * px2 / plen
iy = a * py2 / plen
4) Сжать назад
ix2 = ix
iy2 = iy * b / a
5) Сделать вращение назад
ixfinal = ix2 * Cos(theta) - iy2 * Sin(theta)
iyfinal = ix2 * Sin(theta) + iy2 * Cos(theta)