|
发表于 2020-3-29 17:54:36
|
显示全部楼层
本帖最后由 TJBEST 于 2020-3-30 21:16 编辑
不知道对不对,有点麻烦,可能会有错误,需要楼主检验,我自己测的暂时没问题。
- def fun362(points):
- def gcd(num1,num2):
- while num2:
- num1,num2 = num2,num1%num2
- return num1
- def gcd3(num1,num2,num3):
- if num1*num2 == 0:
- yue1 = num1+num2
- else:
- yue1 = gcd(num1,num2)
- if num2*num3 == 0:
- yue2 = num2+num3
- else:
- yue2 = gcd(num2,num3)
- if yue1 * yue2 == 0:
- return yue1+yue2
- else:
- return gcd(yue1,yue2)
- def getLine(point1,point2):
- A = points[point2][1] - points[point1][1]
- B = points[point1][0] - points[point2][0]
- C = points[point2][0]*points[point1][1] -points[point1][0]*points[point2][1]
- if A < 0:
- A = -A
- B = -B
- C = -C
- elif A == 0:
- if B < 0:
- B = -B
- C = -C
- yueshu = gcd3(A,abs(B),abs(C))
- return (A//yueshu,B//yueshu,C//yueshu)
- def getH(Line,point):#代入距离方程 注意有正负号的
- return Line[0]*points[point][0]+Line[1]*points[point][1]+Line[2]
- def getX(temp,point):#找端点
- return points[temp][0] - points[point][0]
- def getDistance(point1,point2):
- return (((points[point1][0]-points[point2][0])**2)+((points[point1][1]-points[point2][1])**2))**(1/2)
- M = len(points)
- OutPoint = set()#记录外点
- InnerPoint = set()#记录内点
- DeadLine = set()#记录直线
- index_arr = [i for i in range(0,M)]
- S = 0
- while len(index_arr) > 2:
- if index_arr[0] in InnerPoint:#如果内点 则忽略
- pass
- elif index_arr[0] in OutPoint:#如果外点 则遍历其他点
- temp = index_arr[0]
- for eachPoint in index_arr[1:]:
- if eachPoint in InnerPoint:#内点不考虑
- pass
- else:#外点 与 未知点需要计算
- Line = getLine(temp,eachPoint)#计算两点所在直线方程
- if Line in DeadLine:#该直线已经算过
- pass
- else:
- H_arr = [getH(Line,i) for i in range(0,M)]
- LinePoint = [i for i in range(0,M) if H_arr[i] == 0]#直线上点
- X_arr = [getX(temp,i) for i in LinePoint]#协助查找端点
- if max(H_arr)*min(H_arr) < 0:#内直线
- M_Num = max(X_arr)
- m_Num = min(X_arr)
- Duan1 = LinePoint[X_arr.index(M_Num)]
- Duan2 = LinePoint[X_arr.index(m_Num)]
- InnerPoint |= (set(LinePoint) - {Duan1,Duan2})
- else:#外直线
- OutPoint |= set(LinePoint)
- M_Num = max(X_arr)
- m_Num = min(X_arr)
- Duan1 = LinePoint[X_arr.index(M_Num)]
- Duan2 = LinePoint[X_arr.index(m_Num)]
- if Duan1 in InnerPoint or Duan2 in InnerPoint:
- pass
- else:
- Standard = ((Line[0]**2)+(Line[1]**2))**(1/2)
- H = max([abs(max(H_arr)),abs(min(H_arr))])/Standard
- Distance = getDistance(Duan1,Duan2)
- tempS = (1/2)*(H*Distance)
- S = S if tempS <= S else tempS
- DeadLine.add(Line)
- else:#未知的
- temp = index_arr[0]
- for eachPoint in index_arr[1:]:
- if eachPoint in InnerPoint:#内点不考虑
- pass
- else:#外点 与 未知点需要计算
- Line = getLine(temp,eachPoint)#计算两点所在直线方程
- if Line in DeadLine:#该直线已经算过
- pass
- else:
- H_arr = [getH(Line,i) for i in range(0,M)]
- LinePoint = [i for i in range(0,M) if H_arr[i] == 0]#直线上点
- X_arr = [getX(temp,i) for i in LinePoint]#协助查找端点
- if max(H_arr)*min(H_arr) < 0:#内直线
- M_Num = max(X_arr)
- m_Num = min(X_arr)
- Duan1 = LinePoint[X_arr.index(M_Num)]
- Duan2 = LinePoint[X_arr.index(m_Num)]
- InnerPoint |= (set(LinePoint) - {Duan1,Duan2})
- else:#外直线
- OutPoint |= set(LinePoint)
- M_Num = max(X_arr)
- m_Num = min(X_arr)
- Duan1 = LinePoint[X_arr.index(M_Num)]
- Duan2 = LinePoint[X_arr.index(m_Num)]
- if Duan1 in InnerPoint or Duan2 in InnerPoint:
- pass
- else:
- Standard = ((Line[0]**2)+(Line[1]**2))**(1/2)
- H = max([abs(max(H_arr)),abs(min(H_arr))])/Standard
- Distance = getDistance(Duan1,Duan2)
- tempS = (1/2)*(H*Distance)
- S = S if tempS <= S else tempS
- DeadLine.add(Line)
- if temp in InnerPoint:
- break
- index_arr = index_arr[1:]
- return S
复制代码 |
评分
-
查看全部评分
|