#c #arrays #opengl #for-loop #vertex
#c #массивы #opengl #for-цикл #вершина
Вопрос:
Что мне нужно сделать, так это создать квадрат, состоящий из 8 треугольников одинакового размера, с использованием массивов. Координаты четырех углов квадрата, (-10, -10, 10), (-10, -10, -10), (10, -10, -10), (10, -10, 10). И это начинается с верхнего левого угла и идет против часовой стрелки.
Я уже создал его, прежде чем просто вводить значения в массив, но теперь мне нужно выяснить, как это сделать, используя циклы for в C . Итак, я знаю, что для каждого массива (мне нужно создать массив вершин, индексов и цветов) мне нужно создать цикл for и что в этом цикле for внутри него должен быть цикл for .
Комментарии:
1. почему бы не определить точки и цвета в параллельных массивах, а затем просто повторить их один раз?
2. @user931794 во-первых, я не совсем уверен, что понимаю, что вы имеете в виду (как я уже сказал, я очень новичок в этом), я действительно не знаю, что такое параллельный массив. Но если я вроде понимаю, что вы имеете в виду, то я не думаю, что это сработает, поскольку я не могу жестко запрограммировать ни одно из значений, я должен создавать массивы исключительно через циклы for . Извините, если я недостаточно ясно выражаюсь, как я уже сказал, я очень новичок в этом, поэтому я немного не уверен, как это объяснить.
3. Возможно, вы захотите указать язык, который вы используете, иначе люди предоставят вам решения на INTERCAL .
4. @genpfault да, я только что подумал об этом, спасибо за помощь в редактировании 🙂
5. Похоже, вы хотите разделить прямоугольник на два в каждом направлении.
Ответ №1:
Мне нравится использовать Eigen::Vector2f
for Vec
, но все, что имеет аналогичный интерфейс, должно работать:
template< typename Vec >
void glVec2d( const Vecamp; vec )
{
glVertex2d( vec.x(), vec.y() );
}
template< typename Vec >
void glTex2d( const Vecamp; vec )
{
glTexCoord2d( vec.x(), vec.y() );
}
template< typename Vec >
void glQuad2d
(
const Vecamp; A, // lower left coord
const Vecamp; B, // lower right coord
const Vecamp; C, // upper right coord
const Vecamp; D, // upper left coord
unsigned int divs = 2,
const Vecamp; At = Vec(0,0),
const Vecamp; Bt = Vec(1,0),
const Vecamp; Ct = Vec(1,1),
const Vecamp; Dt = Vec(0,1)
)
{
// base case
if( divs == 0 )
{
glTex2d( At );
glVec2d( A );
glTex2d( Bt );
glVec2d( B );
glTex2d( Ct );
glVec2d( C );
glTex2d( Dt );
glVec2d( D );
return;
}
Vec AB = (A B) * 0.5;
Vec BC = (B C) * 0.5;
Vec CD = (C D) * 0.5;
Vec AD = (A D) * 0.5;
Vec ABCD = (AB CD) * 0.5;
Vec ABt = (At Bt) * 0.5;
Vec BCt = (Bt Ct) * 0.5;
Vec CDt = (Ct Dt) * 0.5;
Vec ADt = (At Dt) * 0.5;
Vec ABCDt = (ABt CDt) * 0.5;
// subdivided point layout
// D CD C
//
// AD ABCD BC
//
// A AB B
// subdivide
glQuad2d( A, AB, ABCD, AD, divs - 1, At, ABt, ABCDt, ADt );
glQuad2d( AB, B, BC, ABCD, divs - 1, ABt, Bt, BCt, ABCDt );
glQuad2d( ABCD, BC, C, CD, divs - 1, ABCDt, BCt, Ct, CDt );
glQuad2d( AD, ABCD, CD, D, divs - 1, ADt, ABCDt, CDt, Dt );
}
В настоящее время это рекурсивно, но вы всегда можете добавить явный стек для некоторого действия цикла for.
Комментарии:
1. Спасибо за помощь, но, к сожалению, это далеко за пределами того, что я знаю до сих пор. Я учусь в колледже, изучаю игровое программирование, и это мой первый курс, поэтому я действительно не слишком много знаю. Но я действительно ценю всю помощь!
2. это довольно качественный код. очень элегантно. хотя, как вы упоминали, если вы собираетесь вызывать это много раз, вы можете захотеть использовать явный стек, выделенный в куче, вместо системного стека (т. Е. Изменить функцию, чтобы она не была рекурсивной), чтобы избежать возможности ПЕРЕПОЛНЕНИЯ СТЕКА.