Найдите нормальный угол поверхности треугольника в 3D, учитывая координаты его вершин

std::ifstream имеет метод rdbuf(), который возвращает указатель на filebuf. Можно тогда "продвинуть" это filebuf в Ваш stringstream:

#include <fstream>
#include <sstream>

int main()
{
    std::ifstream file( "myFile" );

    if ( file )
    {
        std::stringstream buffer;

        buffer << file.rdbuf();

        file.close();

        // operations on the buffer...
    }
}

РЕДАКТИРОВАНИЕ: Как Martin York отмечает в комментариях, это не могло бы быть быстрым решением, так как stringstream operator<< считает filebuf символ символом. Вы могли бы хотеть проверить его ответ, где он использует ifstream read метод, как Вы раньше делали, и затем устанавливали эти stringstream буфер для указания на ранее выделенную память.

14
задан Peter O. 1 July 2015 в 12:32
поделиться

4 ответа

Если вы возьмете векторное произведение двух векторов:

p1 - p0

и

p2 - p0

, где p0 , p1 и p2 - три вершины треугольника, вы получите нормаль. Считается, что треугольник указывает на вас, если вершины расположены по часовой стрелке относительно его внешней нормали. Это называется правилом левой руки. Представьте, что вы держите левую руку с пальцами, загнутыми от p0 до p1 , большой палец торчит в направлении нормали лица:

face pointing away from camera face pointing towards camera

34
ответ дан 1 December 2019 в 06:21
поделиться

Перекрестное произведение - правильный ответ. Не забудьте нормализовать результат и не забывайте, что если треугольник имеет нулевую площадь, результат недействителен, потому что нет четко определенной нормали. По сути, если ваши три вершины - это p0, p1 и p2:

vector temp = cross(p1 - p0, p2 - p0);
if (length(temp) < epsilon) then
    Degenerate_triangle_error;
else
    return normalize(temp);

Кроме того, как говорится в другом ответе, то, получите ли вы нормаль «вверх» или «вниз», будет зависеть от порядка ваших вершин.

10
ответ дан 1 December 2019 в 06:21
поделиться

Чтобы закончить ответ на ваш вопрос, если у вас есть единичный вектор нормали вашего треугольника, вы можете вычислить угол, используя скалярное произведение.

Скалярное произведение двух единичных векторов равно косинус угла между ними, поэтому, если вы вычисляете arccos скалярного произведения вашего единичного вектора нормали и единичного вектора Up, вы получите угол наклона вашего треугольника (угол от горизонтали).

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

3
ответ дан 1 December 2019 в 06:21
поделиться

Есть 2 нормали к треугольнику (конечно), и одна, которую вы получаете из стандартных алгоритмов, зависит от порядка их вершин. Цитата из wiki

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

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

2
ответ дан 1 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: