& quot; векторный итератор не может быть увеличен & quot; с OpenGL, приложением LeapMotion

Я успешно написал код, который принимает положение (x, y) одного из моих пальцев, измеренное моим контроллером Leap Motion (инфракрасное сканирующее устройство, которое отслеживает движения пальцев и рук), и рисует точку с аналогичными (x, y) координатами используя OpenGL. По сути, вы двигаете пальцем, вы перемещаете точку, отображаемую на экране.

Что я хотел бы сделать сейчас, так это отобразить последние 100 записанных местоположений, поэтому вместо того, чтобы видеть движение одной точки, вы видите змеевидную совокупность точек, которые змеятся вокруг и следуют за движением кончика пальца.

Я попытался сделать это, используя два вектора — один для удержания позиции x и y в данном кадре, а второй для хранения группы ранее упомянутых векторов. Отталкивая первый элемент в векторе после того, как его размер превысит 100, я решил, что смогу перебрать все эти точки и нарисовать их в моем методе отображения.

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

Код:

#include <iostream>
#include <fstream>
#include "Leap.h"#include <math.h>
#include "GL/glut.h"#include <deque>

using namespace Leap;
using namespace std;

bool one = true;

double x = 10, y = 100;
double screenWidth = 480, screenHeight = 480;
double time, timeDisplayed = 5.0 * (pow(10.0, 9.0));

vector < double > entry, *temp;
vector < vector< double > > collection;

class SampleListener : public Listener {
public:
int firstFrame, firstTime;
bool first;
virtual void onInit(const Controller&);
virtual void onConnect(const Controller&);
virtual void onExit(const Controller&);
virtual void onFrame(const Controller&);
};

void SampleListener::onInit(const Controller& controller){
cout << "Initialized.\n";
first = true;
}

void SampleListener::onConnect(const Controller& controller){
cout << "Connected.\n";
controller.enableGesture(Gesture::TYPE_SCREEN_TAP);
}

void SampleListener::onExit(const Controller& controller){
cout << "Exited.\n";
}

void SampleListener::onFrame(const Controller& controller) {
const Frame frame = controller.frame();

//some initial frame processing/file writing
if (first){
first = !first;
firstFrame = frame.id();
firstTime = frame.timestamp();
}
else {

//record hand information
if (!frame.hands().isEmpty()){
const Hand hand = frame.hands().frontmost();
const Finger track = hand.fingers().frontmost();
x = track.tipPosition().x;
y = track.tipPosition().y;
time = frame.timestamp() - firstTime;
entry.push_back(x);
entry.push_back(y);
entry.push_back(time);
collection.push_back(entry);
entry.clear();
while (collection.size() > 100 && !collection.empty()){
collection.erase(collection.begin());
}
}
}

}

// Create a sample listener and controller
SampleListener listener;
Controller controller;

void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_POINTS);
for (auto i = collection.begin(); i != collection.end(); *i++){
cout << collection.size() << endl;
glVertex2f(i->at(0), i->at(1));
}

glEnd();

glFlush();
glutSwapBuffers();
}

void init(){
cout << "in init" << endl;
glClearColor(0.0, 0.0, 0.0, 0.0);
glColor3f(1.0, 1.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-screenWidth/2, screenWidth/2, 0, screenHeight);
glViewport(0, 0, screenWidth, screenHeight);
glPointSize(3.0f);
cout << "leaving init" << endl;

}void idle(void){
glutPostRedisplay();
}

//<<<<<<<<<<<<<<<<<<<<<<< myKeys >>>>>>>>>>>>>>>>>>>>>>>>
void myKeys(unsigned char key, int x, int y)
{

switch(key)
{
case 'q':   // Quit
// Remove the sample listener when done
controller.removeListener(listener);

exit(0);
}
}

int main (int argc, char** argv) {

listener.first = true;

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(screenWidth, screenHeight);
glutInitWindowPosition(800, 100);
glutCreateWindow("test");
init();
glutDisplayFunc(display);
glutKeyboardFunc(myKeys);
glutIdleFunc(idle);

controller.addListener(listener);

glutMainLoop();return 0;

}

-1

Решение

Если это с резьбой, то ваш collection.erase() в SampleListener::onFrame() сделает недействительным итератор в display(), Тебе нужен мьютекс. Черт, push_back() может сделать ваш итератор недействительным. Похоже, вам нужна структура фиксированной длины с указателями головы / хвоста, а не этот динамический вектор.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]