Сглаживание 3d треугольника - PullRequest
1 голос
/ 08 ноября 2011

Я хотел бы написать функцию, которая принимает трехмерный треугольник (как 3 точки (vector3ds)) и возвращает двумерный треугольник (как 3 точки (vector2ds)):

Когда дан трехмерный треугольник, этодолжен вернуть двумерные координаты своих точек, когда они лежат на его плоскости.(Под «плоскостью» я подразумеваю плоскость, на которой лежат все три точки).

Я могу придумать длинный путь, чтобы сделать это:

  • вращайте треугольник, пока его нормаль не станетравный + z (0,0,1), затем построить треугольник из (x, y) координат каждой точки.

Не могу помочь, но думаю, что должен быть более простой способ достичьто же самое.

Если вы публикуете примеры кода, пожалуйста, не используйте греческий алфавит.Некоторый псевдокод на языке стиля C / java был бы идеальным.

Ответы [ 2 ]

4 голосов
/ 08 ноября 2011

Из ваших комментариев я делаю вывод, что вы можете выбрать систему координат плоскости произвольным образом, если евклидова метрика этой системы координат совпадает с метрикой, индуцированной евклидовой метрикой вашей трехмерной координаты система. (То есть евклидовы расстояния останутся прежними.)

Одно из возможных решений:

x0' = 0
y0' = 0

x1' = sqrt((x1 - x0)^2 + (y1 - y0)^2 + (z1 - z0)^2)
y1' = 0

x2' = ((x1 - x0) * (x2 - x0) + 
       (y1 - y0) * (y2 - y0) + 
       (z1 - z0) * (z2 - z0)) / x1'
y2' = sqrt((x2 - x0)^2 + (y2 - y0)^2 + (z2 - z0)^2 - x2'^2)
3 голосов
/ 08 ноября 2011

Единственного ответа на эту проблему не существует.

Плоскость, в которой расположен треугольник, не имеет определенного источника и не имеет определенной ориентации.

Лучшее, что вы можете сделать, это определить одно извершины как начало координат, а одно из ребер лежит вдоль оси X:

v1 = (0, 0)

Вам нужно будет вычислить векторы A (то есть v2 - v1) и B (то есть v3 - v1).

Вершина 2 будет тогда в:

v2 = (|A|, 0)

Положение вершины 3 можно определить с помощью Правило векторного перекрестного произведения , например:

A x B = |A| * |B| sin(theta)

Итак, получится A x B, и из этого вы сможете вычислить синус угла тета между A и B:

sin(theta) = | A x B | / (|A| * |B|)

Тогда вершина 3 находится в координатах:

v3 = |B| (cos(theta), sin(theta)) 

Вы можетеиспользуйте cos(theta) = sqrt(1 - sin(theta) ^ 2), чтобы избежать любых обратных операций триггера.

Вы также должны увидеть, что |B| sin(theta) это просто | A x B | / | A |

...