Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Август 07, 2014, 12:04



Название: Итератор (?) для shared/unshared
Отправлено: Igors от Август 07, 2014, 12:04
Добрый день

Сколько "вершин" (вертексов) имеет простейший кубик? Нормальный человек ответит 8 (восемь). Однако изучающий OpenGL скажет 24. Да, обычно так, чтобы удобнее было "рисовать массивами", в каждом углу по 3 вертекса. И вот пользователь кликнул на один вертекс, допустим чтобы изменить его цвет. И требуется менять у всех 3 "совпадающих". Ясно что сначала, на этапе предрасчета надо посчитать какие совпадают, напр
Код
C++ (Qt)
int ver[24] = { 0, 1, 0, 5, 6, 0, 1 ... };   // значения 0..7 для 24 вертексов  
 
Т.е. известно что нулевой, второй и пятый вертексы совпадают. Теперь как, получив напр только 5-й вертекс удобно применить ту же операцию для 0-го и 2-го?

Спасибо


Название: Re: Итератор (?) для shared/unshared
Отправлено: __Heaven__ от Август 07, 2014, 13:32
Я вижу так:
Описать каждую реальную вершину в виде 3 значений, которые будут указывать на вершины GL.
Обращаясь к реальной вершине мы получаем 3 вершины GL.


Название: Re: Итератор (?) для shared/unshared
Отправлено: Igors от Август 07, 2014, 16:29
Я вижу так:
Описать каждую реальную вершину в виде 3 значений, которые будут указывать на вершины GL.
Обращаясь к реальной вершине мы получаем 3 вершины GL.
Три в каждой - всего лишь частный случай, а в общем любое число unshared может соответствовать 1 позиции shared


Название: Re: Итератор (?) для shared/unshared
Отправлено: __Heaven__ от Август 07, 2014, 17:30
Не совсем понимаю что такое shared/unshared.

Я бы взял структуру наподобии
Код:
struct MyVertex
{
    int count;                     //Число вершин в точке
    int* glVertexesId;          //Номера этих вершин
    //double x, y, z;
};

Создал бы вектор таких структур, который бы полностью описал бы "человеческие" вершины.

Для каждой вершины GL записал бы номер, соответствующий номеру "человеческой" вершины в этом векторе.

Получается, что пользователь выбирает gl вершину (я понял, что происходит это именно так). Для вершины у нас записан номер в векторе MyVertex. Далее смотрим, что за gl вершины у нас записаны в glVertexesId.


Название: Re: Итератор (?) для shared/unshared
Отправлено: Igors от Август 07, 2014, 18:03
Не совсем понимаю что такое shared/unshared.
Если полигоны используют (шарят) одни и те же индексы вертексов - то это shared (кубик 8). Если же используются разные индексы (для совпадающих позиций) - это unshared (кубик 24).

Я бы взял структуру наподобии
Код:
struct MyVertex
{
    int count;                     //Число вершин в точке
    int* glVertexesId;          //Номера этих вершин
    //double x, y, z;
};

Создал бы вектор таких структур, который бы полностью описал бы "человеческие" вершины.

Для каждой вершины GL записал бы номер, соответствующий номеру "человеческой" вершины в этом векторе.

Получается, что пользователь выбирает gl вершину (я понял, что происходит это именно так). Для вершины у нас записан номер в векторе MyVertex. Далее смотрим, что за gl вершины у нас записаны в glVertexesId.
Поняли правильно. Такой подход в стиле С вполне возможен. Однако надо иметь и второй массив для хранения glVertexesId, причем создать его не так уж просто. Использование выглядит несколько громоздким, напр
Код
C++ (Qt)
// получен index одного из вертексов
for (int i = 0; i < indices[index]; ++i)
 SetColor(indices[index].glVertexesId[i]);
Хотелось бы более "в духе плюсов"  :)


Название: Re: Итератор (?) для shared/unshared
Отправлено: __Heaven__ от Август 07, 2014, 18:39
Код
C++ (Qt)
// получен index одного из вертексов
for (int i = 0; i < indices[index]; ++i)
 SetColor(indices[index].glVertexesId[i]);
Хотелось бы более "в духе плюсов"  :)
А я бы это же сделал так
Код:
int* currentVertex = &indices[index];
int* endVertex = currentVertex + indices[index].count;
while (currVertex != endVertex)
{
    SetColor(currVertex->glVertexesId[i]);
    currVertex++;                     // <-- в стиле плюсов ;)
}

или короче

Код:
for (; currVertex != endVertex; ++currVertex)
    SetColor(currVertex->glVertexesId[i]);

или суперкратко :)

Код:
while (currVertex != endVertex)
    SetColor((currVertex++)->glVertexesId[i]);


не в духе плюсов, но почему бы и нет :)

можно использовать ссылку на переменную MyVertex перед применением цикла.