我有大量由三個 3d 點定義的三角形,例如
T1 = ((x1, y1, z1), (x2, y2, z2), (x3, y3, z3))
T2 = ((x1, y1, z1), (x2, y2, z2), (x3, y3, z3))
T3 = ((x1, y1, z1), (x2, y2, z2), (x3, y3, z3))
T4 = ((x1, y1, z1), (x2, y2, z2), (x3, y3, z3))....
我想知道的是,找出這些三角形中哪個最接近等邊三角形的最佳方法是什么。我能想到的最佳策略是,以某種方式計算每個三角形的三個內角,然后得到這三個角的乘積,然后查看哪個三角形的乘積最大。如果我沒記錯的話,三角形越接近等邊三角形的三個角的乘積越大(當一個三角形是完美的等邊三角形時,內角的乘積是 60 乘以 60 乘以 60 = 216000)但是,我覺得有很多完成此任務的更好方法。如果您能為我提出更好的解決方案,我將不勝感激。這些三個 3d 點的集合都不在直線上。在這些三角形中沒有長度為 0 的邊。
uj5u.com熱心網友回復:
一位來自紐約布魯克林的數學老師帕特里克·霍納提出了一個聰明的想法。取三角形的面積與周長相同的等邊三角形的面積之比。這會產生一個介于 0 和 1 之間的數字,其中 1 對應于完全等邊。當結合Heron 的三角形面積公式時,您會得到一個相當簡單的計算(特別是在組合為單個平方根并簡化之后)。
這是一個 Python 實作:
import math
#computation given the sides:
def eq(a,b,c):
p = a b c
s = p/2
e = p/3
return math.sqrt((s-a)*(s-b)*(s-c)/(s-e)**3)
def dist(p,q):
return math.sqrt(sum((x-y)**2 for x,y in zip(p,q)))
#computation given the vertices:
def eq_vertices(vertices):
p,q,r = vertices
a = dist(p,q)
b = dist(p,r)
c = dist(q,r)
return eq(a,b,c)
def most_equilateral(triangles):
return max(triangles,key = eq_vertices)
出于測驗目的,我寫道:
import random
def rand_triangle():
nums = tuple(random.uniform(0,10) for _ in range(9))
return nums[:3],nums[3:6],nums[6:]
def rand_triangles(n):
return [rand_triangle() for _ in range(n)]
p,q,r = most_equilateral(rand_triangles(10**6))
print(p)
print(q)
print(r)
print(dist(p,q),dist(p,r),dist(q,r))
典型輸出:
(5.78980790676774, 9.853230008053409, 4.974470485333855)
(8.824990996578379, 4.403159314576518, 3.1039937224539615)
(2.7571861861239597, 5.607135338917225, 1.0725696230700976)
6.512625451616404 6.515438955183434 6.511105693852511
生成 100 萬個三角形比找到最等邊的三角形花費的時間更長。如果速度是一個問題,您可以考慮從函式中洗掉 sqrt,eq因為這仍然會產生一個取值在 [0,1] 范圍內的函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/312895.html
