點到矩形的最近的點

2021-09-29 02:14:44 字數 1768 閱讀 5875

最近發現自己的數學都還給老師了,然後剛好碰到乙個需求,順便把高中知識複習下(捂臉)。

很多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...