Как найти пересечение между поверхностью и линией в питоне? - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть поверхность, которая определяется списком значений x и y с назначенной им высотой.Непрерывная поверхность построена с помощью сплайн-методов, поэтому в конце я получу высоту всех возможных (x, y).У меня также есть точка и единичный вектор (полученный из этой точки).Мне нужно найти точку, где линия (сделанная из этого единичного вектора) попадает на мою поверхность.У меня возникли проблемы с построением этой линии (и я не уверен, если это необходимо) и найти самый быстрый способ получить пересечение.Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ

Это пример моих координат и код , которые мне посоветовали написать, чтобы иметь мою поверхность.

 Z=[]
    Z.append([20.2, 20.1, 35])
    Z.append([20.1, 24.5, 36])

 Z.append([21.0, 23.2, 33])
    Z.append([22.3, 20.0, 34])
    Z.append([22.3, 19.5, 28])
    Z.append([20.1, 19.5, 27])
    Z.append([20.1, 24.6, 31])
    Z.append([22.3, 24.6, 32])
    # ---------------------------
    xin=np.array(Z)[:,0];
    yin=np.array(Z)[:,1];
    zin=np.array(Z)[:,2];
    # ----------------------------
    xout=np.linspace(20.,23.,10);
    yout=np.linspace(19.,25.,10);
    xout,yout = np.meshgrid(xout,yout);
    # ----------------------------
    zout=griddata((xin,yin),zin,(xout,yout),'cubic');
    # -----------------------------
    from pylab import pcolormesh,show
    pcolormesh(xout,yout,zout);show();

Допустим, у меня есть точка (21,0, 20,0, 60), и она повернута на 9 градусов к северу, на 2 градуса к востоку (здесь 21,0 представляет долготу, 20,0 - широту, 60 - высоту).

1 Ответ

0 голосов
/ 25 сентября 2018

Непростая проблема.

Как кажется, ваш интерполант кусочно, предположительно определяется по триангуляции (если нет, пожалуйста, укажите).

Если вы знаете выражение интерполанта, предположительно кубический полином, вы можете определить диапазон значений, взятых для каждой плитки (вам нужно найти стационарные точки внутри, точки на краях и значения в углах).

Это создает ограничивающий объемдля каждого патча, и поверхность обернута в вертикальные неперекрывающиеся призмы.

Теперь для данного луча вы проецируете его на плоскость XY и видите, через какую основу призмы он пересекается.Если основания являются выпуклыми многоугольниками, они будут пересекать их вдоль отрезка.Для точек входа и выхода вычислите значение Z (вдоль луча) и проверьте, не перекрывается ли диапазон Z патча.

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

Вы должны отследить луч, начинающийся с источника, и остановиться, как только найдете решение (если в одном патче несколько пересечений, держите точки закрытия источника).

...