点到三角形(二维平面)的距离 算法笔试python

不确定理解的对不对,仅供参考

点可能在三角形内,也可能在三角形外,点在三角形内则返回0;在三角形外则返回点到三角形的最短距离。
三角形三个点为(A,B,C),另外一点为P
思路是:利用面积来计算
如果点在三角形内:
则该点P与点ABC组成的三角形PAB,PAC,PBC面积之和等于ABC,包括点在边上的情况。
如果点在三角形外:
则计算PAB,PAC,PBC的面积和ABC的面积以及各边边长,利用面积等于底×高/2,可以求出距离d。点到AB的距离dAB:
dAB=2*PAB/AB;
PAB表示三角形PAB的面积
AB表示AB的边长;
同时,点如果在三角形外,则PAB,PAC,PBC面积之和肯定大于ABC。
面积公式如下:
点到三角形(二维平面)的距离 算法笔试python_第1张图片
可以分为两个函数写:
第一,计算三角形的面积;
第二,计算距离;
然后判断。

T = [[0,0],[1,1],[2,0]]#三角形坐标
D = [-1,0]#点
flags = 1
def S_trangile(T):#计算三角形的面积
    """T为三角形的三个点的坐标,return :如果是第一次计算,则返回面积和边长,其余只返回面积"""
    bianc = []
    global flags#控制第一次返回
    for i in range(len(T)-1):
        if i+1<=2:
            for j in range(i+1,len(T)):
                bianc.append(sum(list(map(lambda x:(x[0]-x[1])**2,zip(T[i],T[j]))))**0.5)
    p = 0.5*(sum(bianc))
    S2 = p
    for l in bianc:
        S2*=(p-l)
    if flags ==1:
        flags =0
        return S2**0.5,bianc
    else:
        return S2**0.5
def point_t(T,D):
    """T三角形的坐标 ,D到你的坐标;return 三角形的面积,边长和点与三角形的其中两点构成的三角形的面积"""
    S ,bianc= S_trangile(T)#第一次返回
    Si = []
    for i,_ in T:
        T1 = T.copy()#copy,防止原始三角形数据改变
        T1[i] = D
        Si.append(S_trangile(T1))
    return S,Si,bianc
S,Si,bianc = point_t(T,D)
if abs(S-sum(Si)) <0.00001:#判断,因为有小数,所以在判断时很难恰好是等于
    print(0)#在三角形内或边上
else:
    dis = []
    for i,s in enumerate(Si):
        dis.append(2*s/bianc[2-i])#d = 2*s/边长
    dis.sort()#排序,点如果在三角形边的延长线上,也会出现0,但最小距离却不是0
    for d in dis:
        if d!=0:#取出不是零的最小值
            print(d)
            break#结束

你可能感兴趣的:(Python,算法,python)