2012-03-30 21 views
0

Ich habe derzeit ein Problem beim Speichern von Mauskoordinaten in einem Array, in dem ein Zeiger dieses Arrays an eine Funktion übergeben wird, die dann diese Koordinaten verwenden, um eine Polylinie auf dem Bildschirm anzuzeigen.C++/OpenGL - Zeiger eines Arrays

Unten ist mein Code. Beachten Sie, dass ich kommentiert habe, wo das Problem zu sein scheint, aber ich dachte, dass ich die meisten der Code sowieso einfügen würde:

struct mousePoint{ 
    int x, y; 
}; 

struct Node{ 
    mousePoint *pointer; 
    int corner; 
    Node *next; 
}; 

Node *Top; 
Node *Bottom; 


void init(void){ // doesnt need to be shown, but initialises linked list 

// Adds the mouse coords array to the top of the linked list 
void AddLines(mousePoint Lines[], int corner){ 
    Node *temp; 
    temp = new Node; 
    cout << "(AddLines func) array x1: "; 
cout << Lines[0].x << endl; 
cout << "(AddLines func) array y1: "; 
cout << Lines[0].y << endl; 
cout << "(AddLines func) array x2: "; 
cout << Lines[1].x << endl; 
cout << "(AddLines func) array y1: "; 
cout << Lines[1].y << endl; 
    temp->pointer = Lines; // <--- I believe this is the error 
    temp->corner = corner; 
    temp->next = NULL; 
    if(Top == NULL){ 
     Top = temp; 
    }else{ 
     temp->next = Top; 
     Top = temp; 
     if(Bottom == NULL){ 
      Bottom = Top; 
     } 
    } 
} 

// Draws the polyline based on the coords in the array 
void DrawLines(mousePoint Lines[], int corner){ 
    cout << "(DrawLines func) array x1: "; 
cout << Lines[0].x << endl; 
cout << "(DrawLines func) array y1: "; 
cout << Lines[0].y << endl; 
cout << "(DrawLines func) array x2: "; 
cout << Lines[1].x << endl; 
cout << "(DrawLines func) array y1: "; 
cout << Lines[1].y << endl; 
    glBegin(GL_LINE_STRIP); 
     for(int i = 0; i < corner; i++){ 
      glVertex2i(Lines[i].x, Lines[i].y); 
     } 
    glEnd(); 

} 

void display(void){ 
    Node *current; 
     current = Top; 
       // cycle through all polylines in linked list 
     for(; current != NULL; current = current->next){ 
      DrawLines(current->pointer, current->corner); 
     } 
    glFlush(); 
} 

void mouse(int button, int state, int x, int y) 
{ 
    static mousePoint Lines[100]; // array to store mouse coords 
    static int NumCorner = 0; // counter for mouse click 
    if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) 
    { 
     Lines[NumCorner].x = x; 
     Lines[NumCorner].y = 480 - y; 
       // draw individual points 
     glBegin(GL_POINTS); 
     glVertex2i(Lines[NumCorner].x, Lines[NumCorner].y); 
     glEnd(); 
     NumCorner++; 
    }else if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN){ 
     AddLines(Lines, NumCorner); // add mouse coords to linked list 
     NumCorner = 0; // reset counter back to 0 
    } 
} 

int main(int argc, char** argv) // doesnt need to be shown 

Grundsätzlich, wenn ich mit der Maus auf dem Bildschirm klicken, sollte ein Punkt gezogen werden und gleichzeitig werden diese Koordinaten in einem Array gespeichert. Der Benutzer kann mit der linken Maustaste klicken, um Punkte zu zeichnen, während diese Koordinaten gespeichert werden. Die Linien werden nicht gezeichnet, bis die rechte Maustaste gedrückt wird, in der das Array in einer verknüpften Liste gespeichert wird. Die verknüpfte Liste dient zum Speichern aller verschiedenen Polylinienformen. Das Problem besteht jedoch darin, dass der Zeiger nicht korrekt auf das Array zeigt und die Zeichnungsfunktion die Linien nicht korrekt zeichnet.

Wenn Sie zum Beispiel auf zwei Punkte auf dem Display klicken (beachten Sie die cout-Anweisungen im Code), dann klicken Sie mit der rechten Maustaste, eine Linie wird mit diesen beiden Punkten gezeichnet. Wenn ich jedoch auf einen anderen Punkt klicke, wird eine Linie von den vorherigen Koordinaten gezogen, OHNE dass ich die rechte Maustaste drücke.

(AddLines func) array x1: 338 
(AddLines func) array y1: 395 
(AddLines func) array x2: 325 
(AddLines func) array y1: 308 
(DrawLines func) array x1: 338 
(DrawLines func) array y1: 395 
(DrawLines func) array x2: 325 
(DrawLines func) array y1: 308 
(DrawLines func) array x1: 383 
(DrawLines func) array y1: 224 
(DrawLines func) array x2: 325 
(DrawLines func) array y1: 308 

Beachten Sie, wie es eine zusätzliche Zeile zeichnet, ohne es zum Zeiger hinzuzufügen?

Ich habe versucht mit memcpy - die Zeilen sind perfekt gezeichnet IF weniger als 5-6 Punkte wurden verwendet, mehr und die Anwendung stürzt ab. Daher, warum ich glaube, es zu einem Zeiger Problem

+0

Gibt es einen Grund, warum Sie nicht std :: list oder std :: vector und std :: vector verwenden? Nur zur Info, es macht die Dinge einfacher zu sehen. – Robinson

+0

Kein besonderer Grund, eher so vorläufig – user1280446

Antwort

1

Ok, ich denke, ich habe es.

Sie verwenden ein statisches Array Lines []. Wenn Sie "temp-> Zeiger = Linien;" Sie zeigen auf dieses statische Array für jedes Ihrer Polygone. Wenn Sie also das erste Polygon zeichnen und dann versuchen, ein zweites Polygon zu erstellen, bearbeiten Sie die Linien des ersten Polygons.

Anstatt der Zeile, die Sie bereits problematisch gefunden haben, können Sie jeden Punkt in einer for-Schleife iterieren "Ecke" mal kopieren.

statt:

temp->pointer = Lines; // <--- I believe this is the error 

Versuch:

temp->pointer = new mousePoint[corner]; 
for(int a = 0; a < corner; a++) 
{ 
    temp->pointer[a] = Lines[a]; 
} 
+0

Das funktioniert! Danke vielmals – user1280446