Хобрук: Ваш путь к мастерству в программировании

Запутался в чтении из файла и в структуру внутри структуры

Итак, я пытаюсь написать небольшой фрагмент кода на С++, который будет считываться в файле (вертикали, нормали векторов, координаты текстур и грани вершин (v/vt/vn v/vt/vn v/vt/vn) и т. д. ) и я немного потерял себя.

Я начал с малого, читая только куб с только вершинами, цветами и гранями, но теперь я получил гораздо более полигональную модель (126 граней), где грани описываются по-другому (до того, как не было векторной нормали). или vert текстуры), поэтому я решил, что структура внутри структуры будет хорошим способом хранения этой информации.

inFile >> NUM_POLY;
indices = new polygon[NUM_POLY];
for (int i=0; i < NUM_POLY; i++)
{   
inFile >> indices[i].a;
inFile >> indices[i].b;
inFile >> indices[i].c;
}

Это мой код в настоящее время со старой системой, но я изменил структуру на эту...

struct vertA {
int v;
int vt;
int vn;
};

struct vertB {
int v;
int vt;
int vn;
};

struct vertC {
int v;
int vt;
int vn;
};

struct polygon {
struct vertA;
struct vertB;
struct vertC;
};

Итак, что меня смутило, так это то, как я должен хранить первые 3 целых числа в структуре vertA, следующие 3 в vertB, затем vertC и снова возвращаться в цикл до конца файла...

Если кто-то может помочь, это будет большое спасибо!

15.04.2013

  • Ваш struct polygon так не скомпилируется, не так ли? А зачем вам три одинаковых типа структуры? 15.04.2013
  • Ммм, точка, не уверен... каждая структура должна хранить информацию о вершине, которая составляет 1 полигон (треугольник) 15.04.2013

Ответы:


1

Я не уверен, что правильно понимаю проблему (поэтому, пожалуйста, поправьте меня, если это необходимо), но похоже, что вы хотите что-то вроде этого:

struct vertex
{
    int v;
    int vt;
    int vn;
}

struct polygon
{
    struct vertex a;
    struct vertex b;
    struct vertex c;
}

Затем, чтобы инициализировать его, перефразируя исходный пример:

inFile >> NUM_POLY;
indices = new polygon[NUM_POLY];
for (int i = 0; i < NUM_POLY; i++)
{   
    inFile >> indices[i].a.v;
    inFile >> indices[i].a.vt;
    inFile >> indices[i].a.vn;
    inFile >> indices[i].b.v;
    inFile >> indices[i].b.vt;
    inFile >> indices[i].b.vn;
    inFile >> indices[i].c.v;
    inFile >> indices[i].c.vt;
    inFile >> indices[i].c.vn;
}

Вы также можете немного сократить этот код, используя массив, а не три отдельные структуры вершин:

struct polygon
{
    struct vertex v[3];
}

И затем инициализировать с помощью цикла:

inFile >> NUM_POLY;
indices = new polygon[NUM_POLY];
for (int i = 0; i < NUM_POLY; i++)
{   
    for (int i = 0; j < 3; j++)
    {
        inFile >> indices[i].v[j].v;
        inFile >> indices[i].v[j].vt;
        inFile >> indices[i].v[j].vn;
    }
}
15.04.2013
  • Хорошо, теперь я вижу, что я сделал неправильно! Глупый я, спасибо за ваши очень быстрые ответы и решения, ошибки ушли, хотя у меня нет времени, чтобы как следует проверить это, но моя путаница определенно ушла! 15.04.2013

  • 2

    Это не правильно

    struct polygon {
    struct vertA;
    struct vertB;
    struct vertC;
    };
    

    Я предполагаю, что вы имели в виду

    struct polygon {
        vertA va;
        vertB vb;
        vertC vc;
    };
    

    Тогда это довольно просто (при условии, что я вас правильно понимаю)

    for (int i=0; i < NUM_POLY; i++)
    {   
        inFile >> indices[i].va.v;
        inFile >> indices[i].va.vt;
        inFile >> indices[i].va.vn;
        inFile >> indices[i].vb.v;
        inFile >> indices[i].vb.vt;
        inFile >> indices[i].vb.vn;
        inFile >> indices[i].vc.v;
        inFile >> indices[i].vc.vt;
        inFile >> indices[i].vc.vn;
    }
    

    Одна любопытная вещь в вашем коде заключается в том, что struct vertA и struct vertB и struct vertC идентичны. Так что, возможно, вам не нужны три разные структуры.

    15.04.2013
  • Да, я не думал в то время, чувствуя, что они будут хранить 3 разных набора информации, а не создавать из них новые, ха-ха. 16.04.2013
  • Новые материалы

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..