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
буфер для указания на ранее выделенную память.
Если вы возьмете векторное произведение двух векторов:
p1 - p0
и
p2 - p0
, где p0
, p1
и p2
- три вершины треугольника, вы получите нормаль. Считается, что треугольник указывает на вас, если вершины расположены по часовой стрелке относительно его внешней нормали. Это называется правилом левой руки. Представьте, что вы держите левую руку с пальцами, загнутыми от p0
до p1
, большой палец торчит в направлении нормали лица:
Перекрестное произведение - правильный ответ. Не забудьте нормализовать результат и не забывайте, что если треугольник имеет нулевую площадь, результат недействителен, потому что нет четко определенной нормали. По сути, если ваши три вершины - это p0, p1 и p2:
vector temp = cross(p1 - p0, p2 - p0);
if (length(temp) < epsilon) then
Degenerate_triangle_error;
else
return normalize(temp);
Кроме того, как говорится в другом ответе, то, получите ли вы нормаль «вверх» или «вниз», будет зависеть от порядка ваших вершин.
Чтобы закончить ответ на ваш вопрос, если у вас есть единичный вектор нормали вашего треугольника, вы можете вычислить угол, используя скалярное произведение.
Скалярное произведение двух единичных векторов равно косинус угла между ними, поэтому, если вы вычисляете arccos скалярного произведения вашего единичного вектора нормали и единичного вектора Up, вы получите угол наклона вашего треугольника (угол от горизонтали).
Также обратите внимание на что OpenGL традиционно использует правостороннюю систему координат, поэтому, если вы используете ее, тогда вершины ваших треугольников будут иметь порядок против часовой стрелки.
Есть 2 нормали к треугольнику (конечно), и одна, которую вы получаете из стандартных алгоритмов, зависит от порядка их вершин. Цитата из wiki
«Для многоугольника (например, треугольника) нормаль к поверхности может быть вычислена как векторное произведение двух (непараллельных) ребер многоугольника».
Но направление вектора нормаль зависит от порядка выбранных точек, вы можете вычислить ее и решить, используя некоторые другие эвристики, является ли обратный вектор нормалью, которая вас интересует.