最近發現自己的數學都還給老師了,然後剛好碰到乙個需求,順便把高中知識複習下(捂臉)。
很多3d遊戲,為了簡化邏輯,其實在伺服器上,把高度忽略了,只處理2d的情況,所以這樣降低了問題的複雜性。我們在遊戲中,對於空間物體的表示,一般是中心點和朝向,以及物體的形狀和引數(比如【圓形,半徑】,【矩形,長,寬】)。
點到矩形最近的點,**如下:
import sys
import math
def length(p1, p2):
return math.sqrt((p1[0]-p2[0])**2 + (p1[-1]-p2[-1])**2)
def length_vec(vec):
return math.sqrt(vec[0] **2 + vec[-1]**2)
def clamp(value, min_value, max_value):
return max(min_value, min(max_value, value))
def get_near_point_in_rect_point(origin, yaw, length, width, p1):
d_vec = (p1[0] - origin[0], p1[-1] - origin[-1])
d_len = length_vec(d_vec)
d_angle = math.atan2(d_vec[0], d_vec[-1])
d_length = d_len * math.cos(d_angle - yaw)
d_width = d_len * math.cos(d_angle - yaw + math.pi/2)
point_vec = (clamp(d_length, - length/2.0, length/2.0), clamp(d_width, - width/2.0, width/2.0))
point = (origin[0] + point_vec[0], origin[-1] + point_vec[-1])
return point
if __name__ == "__main__":
origin, yaw, length, width = (2.0, 1.0), math.pi/2, 2.0, 1.0
print(get_near_point_in_rect_point(origin, yaw, length, width, (3.0, 1.5)))
print(get_near_point_in_rect_point(origin, yaw, length, width, (7.0, 7.0)))
print(get_near_point_in_rect_point(origin, yaw, length, width, (-1.0, -2.0)))
origin, yaw, length, width = (6.0, 6.0), 1, 2.0, 2.0
print(get_near_point_in_rect_point(origin, yaw, length, width, (6.5, 6.5)))
print(get_near_point_in_rect_point(origin, yaw, length, width, (6.0, 9.0)))
print(get_near_point_in_rect_point(origin, yaw, length, width, (-1.0, -1.0)))
主要思路就是:如果點在矩形內部,那麼返回該點,如果點a在矩形外部,因為矩形是凸多邊形,那麼離點a最近的點b必然在矩形的邊上(可以通過反論法得證)。 如何計算點到線段的最近距離
在二維 三維圖形學系統當中,線段的拾取是乙個經常使用的功能 如何根據滑鼠點來判斷線段是否被選擇了,最主要的方法之一是通過點到線段的最小距離來判定的 無論二維還是三維情況下,使用點到直線的距離公式似乎是最直接的選擇 但是不要忘記點到直線公式計算的是點和直線之間的關係,而不是點和線段之間的關係 演算法如...
如何計算點到線段的最近距離
在二維 三維圖形學系統當中,線段的拾取是乙個經常使用的功能 如何根據滑鼠點來判斷線段是否被選擇了,最主要的方法之一是通過點到線段的最小距離來判定的 無論二維還是三維情況下,使用點到直線的距離公式似乎是最直接的選擇 但是不要忘記點到直線公式計算的是點和直線之間的關係,而不是點和線段之間的關係 演算法如...
LintCode M K個最近的點
lintcode鏈結 給定一些points和乙個origin,從points中找到k個離origin最近的點。按照距離由小到大返回。如果兩個點有相同距離,則按照x值來排序 若x值也相同,就再按照y值排序。您在真實的面試中是否遇到過這個題?yes 樣例給出 points 4,6 4,7 4,4 2,5...