Как хранить Примитивы OpenGL в древовидной структуре данных на C ++? - PullRequest
1 голос
/ 04 октября 2010

Я новичок в OpenGL и C ++. Скажем, я начинаю с 2D квадрата (слева), как показано на рисунке ниже. Я хочу сделать его интерактивным с glutKeyboardFunc(), поэтому, когда я нажимаю число, рядом с соответствующим ребром будет нарисовано новое поле.

alt text

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

Я знаю, что я могу позвонить glutDisplayFunc(myDisplay) только один раз, а остальные должны обработать glutKeyboardFunc()

Любая помощь будет оценена :)

Обновление : спасибо, что указали на glutPostRedisplay(), но что, если я хочу сделать флажок выбираемым и продолжать отслеживать текущее выбранное поле с помощью glutMouseFunc(), и оттуда, когда я добавляю больше ящиков, я Мне нужно знать, сколько дочерних блоков он создал, чтобы я мог указать правильную позицию при рисовании нового блока. Кажется, что теперь имеет смысл использовать древовидную структуру данных? Просто не знаю, как я могу хранить необходимую информацию в дереве.

1 Ответ

1 голос
/ 04 октября 2010

Если я понимаю ваш вопрос, вы можете создать класс, представляющий коробку, например:

class Box {
public:
  void Move(int newx, int newy) {
    x = newx;
    y = newy;
  }
  void Resize(int newx, int newy) {
    w = newx;
    h = newy;
  }
  int getX() { return x; }
  int getY() { return y; }
  int getW() { return w; }
  int getH() { return h; }
private:
  int x, y, w, h;
};

Затем вы можете иметь глобальный вектор для хранения всех коробок:

#include <vector>

vector<Box> box;

Затем вы можете добавить поле, подобное этому:

Box newbox;
newbox.Move(40,50);
newbox.Resize(10,10);
box.push_back(newbox);

И переместить существующее, как это:

box[3].Move(70,20);

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

РЕДАКТИРОВАТЬ: Чтобы получить древовидную структуру, вы можете добавить эти переменные в класс Box:

private:
  Box* parent;
  vector<Box*> child;

Это позволит вам отслеживать древовидную структуру.Затем, сделав что-то вроде:

myBox->getChild(0)->getChild(1)

, получим второго потомка первого потомка myBox.Я надеюсь, что это имеет смысл для вас.

...