Làm cách nào để có được ước tính nhanh về khoảng cách giữa một điểm và bề mặt đường tròn bicubic bằng Python? Có một giải pháp hiện có mà tôi có thể tận dụng trong SciPy, NumPy, hoặc một số gói khác?Làm cách nào để có được ước tính nhanh về khoảng cách giữa một điểm và bề mặt đường tròn bicubic trong Python?
Tôi đã có mặt xác định bởi một suy bicubic như thế này:
import numpy as np
import scipy.interpolate
# Define regular grid surface
xmin,xmax,ymin,ymax = 25, 125, -50, 50
x = np.linspace(xmin,xmax, 201)
y = np.linspace(ymin,ymax, 201)
xx, yy = np.meshgrid(x, y)
z_ideal = (xx**2 + yy**2)/400
z_ideal += z_ideal + np.random.uniform(-0.5, 0.5, z_ideal.shape)
s_ideal = scipy.interpolate.interp2d(x, y, z_ideal, kind='cubic')
và tôi đã có một số điểm đo của bề mặt:
# Fake some measured points on the surface
z_measured = z_ideal + np.random.uniform(-0.1, 0.1, z_ideal.shape)
s_measured = scipy.interpolate.interp2d(x, y, z_measured, kind='cubic')
p_x = np.random.uniform(xmin,xmax,10000)
p_y = np.random.uniform(ymin,ymax,10000)
p_z = s_measured(p_x, p_y)
Tôi muốn tìm gần nhất chỉ trên bề mặt s_ideal
đến từng điểm trong p
. Một trường hợp tổng quát có thể có nhiều giải pháp cho splines cực kỳ khác nhau, vì vậy tôi giới hạn vấn đề với các bề mặt được biết là chỉ có một giải pháp trong vùng lân cận của phép chiếu của điểm dọc theo z. Đây không phải là một số lượng nhỏ các điểm đo lường hoặc độ nét bề mặt, vì vậy tôi muốn tối ưu hóa tốc độ ngay cả với chi phí chính xác có thể là 1E-5
.
Phương pháp mà nói đến cái tâm là sử dụng một phương pháp gradient descent và làm điều gì đó giống như cho mỗi điểm đo p
:
- Sử dụng
pt = [p_x, p_y, p_z]
như là điểm thử nghiệm ban đầu, nơip_z = s_ideal(pt)
- Tính dốc (tangent) vector
m = [ m_x, m_y ]
tạipt
- Tính vector
r
pt
-p
:r = p - pt
012.
- Nếu góc
theta
giữar
vàm
nằm trong ngưỡng tối đa là 90 độ, thìpt
là điểm cuối cùng. - Nếu không, cập nhật
pt
như:
r_len = numpy.linalg.norm(r)
dx = r_len * m_x
dy = r_len * m_y
if theta > 90:
pt = [ p_x + dx, p_y + dy ]
else:
pt = [ p_x - dx, p_y - dy ]
tôi thấy this gợi ý một phương pháp có thể tạo ra kết quả nhanh chóng đến một độ chính xác rất cao đối với trường hợp 1D, nhưng nó cho một chiều hướng duy nhất và có thể là quá khó cho tôi để chuyển đổi thành hai.
Tôi không nghĩ rằng điều này giải quyết vấn đề. 'p_z' không phải là giải pháp lý tưởng, nó là phép chiếu của điểm trên bề mặt trong Z. Điểm gần nhất' Ps' trên bề mặt tới một điểm đã cho 'P' sẽ là điểm có véc tơ thông thường bề mặt đi qua' P '. Mỗi điểm kiểm tra sẽ dẫn đến điểm bề mặt gần nhất tương ứng, vì vậy việc phân cụm dường như không phục vụ mục đích đó. – Brian