вычисление точки пересечения между прямой и эллипсом - питоном - PullRequest
0 голосов
/ 10 декабря 2018

В последнее время я пытался вычислить точку эллипса

enter image description here

Желаемой точкой является зеленая точка, зная красныйточки и уравнение эллипса.

Я использовал крошечное пространство для создания массива на точках и итерировал их, используя zip (ось x, ось y) между красными точками и используя фигуру уравнения эллипсакакая из точек ближе всего к 1. (которая является результатом уравнения эллипса).

эта концепция работает большую часть времени, но в некоторых местах красной внешней точки этот метод некажется, дают хороший результат

Короче говоря, есть идеи, как рассчитать зеленую точку в питоне?ps - эллипс может иметь угол, обе оси которых известны.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Я в конечном итоге использую уравнение эллипса из этого ответа :

и создал функцию in_ellipse

, затем Iv'e использовал теорему о промежуточном значении , чтобы получить точную оценку точки

def in_ellipse(point, ellipse):
    return true if point in ellipse
return false


dot_a = ellipse_center
dot_b = dot
for i in range(20):
    center_point = ((dot_b.y - dot_a.y)/2, (dot_b.x - dot_a.x)/2)
    if in_ellipse(center_point):
        dot_a = center_point
    else:
        dot_b = center_point

return center_point

эта система дает точку с разрешением в 7 (2 ^ 20) цифр после десятичной точки, вы можете увеличить диапазон для лучшего разрешения.

0 голосов
/ 10 декабря 2018

Пусть центр эллипса равен (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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...