#math #geometry
Вопрос:
У меня есть тонны треугольников, определенных тремя 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.
Комментарии:
1. Это кажется интересной идеей, особенно в сочетании с формулой Херона для площади.
2. спасибо, этот метод звучит хорошо
3. @JohnColeman спасибо за понимание, я решил использовать этот метод. Я отмечу это как решение, если вы опубликуете это как ответ.
Ответ №1:
Есть умная идея, придуманная учителем математики из Бруклина, штат Нью-Йорк, по имени Патрик Хоннер. Он состоит в том, чтобы принять отношение площади треугольника к площади равностороннего треугольника, имеющего тот же периметр. Это дает число от 0 до 1, причем 1 соответствует совершенно равностороннему. В сочетании с формулой Херона для площади треугольника вы получаете довольно простое вычисление (особенно после объединения в один квадратный корень и упрощения).
Вот реализация 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
Создание 1 миллиона треугольников занимает больше времени, чем поиск самого равностороннего. Если скорость является проблемой, вы можете рассмотреть возможность удаления sqrt из функции eq
, так как это все равно приведет к функции, принимающей значения в диапазоне [0,1].
Комментарии:
1. спасибо за публикацию в качестве ответа и примера сценария, мне было очень неловко публиковать ответ на свой собственный вопрос. Большое вам спасибо. и да, мне не нужна функция sqrt (), так как все, что я хочу знать, это то, какой из них ближе всего к равностороннему треугольнику, мне не нужно знать точное соотношение площади каждого треугольника и площади равностороннего треугольника одного и того же периметра.