C ++ / OpenGL - указатель массива - PullRequest
0 голосов
/ 30 марта 2012

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

Ниже мой код. Обратите внимание, что я прокомментировал, где проблема, кажется, но я все равно вставил большую часть кода:

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

Обычно, когда я щелкаю мышью по экрану, необходимо рисовать точку, и в то же время эти координаты сохраняются в массиве. Пользователь может продолжать щелкать левой кнопкой мыши, чтобы рисовать точки, пока эти координаты сохраняются. Линии не начнут рисовать, пока не будет нажата правая кнопка мыши, в которой массив хранится в связанном списке. Связанный список предназначен для хранения всех различных полилиний. Проблема, однако, заключается в том, что указатель неправильно указывает на массив, а функция drawlines неправильно рисует линии.

Так, например, если щелкнуть две точки на дисплее (обратите внимание на операторы cout в коде), а затем щелкнуть правой кнопкой мыши, линия будет проведена с использованием этих двух точек. Однако, если я нажму на другую точку, линия будет проведена из предыдущих координат БЕЗ моего нажатия правой кнопки мыши.

(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

Обратите внимание, как он рисует дополнительную линию, не добавляя ее к указателю?

Я пытался использовать memcpy - линии отлично прорисованы, если было использовано менее 5-6 точек, и приложение перестало работать. Следовательно, почему я верю в проблему указателя

1 Ответ

1 голос
/ 30 марта 2012

Хорошо, наверное, я понял.

Вы используете статический массив Lines [].Когда вы делаете "temp-> pointer = Lines;"вы указываете на этот статический массив для каждого из ваших полигонов.Таким образом, когда вы рисуете свой первый многоугольник, а затем при попытке запустить второй многоугольник, вы редактируете линии первого.

Вместо линии, которую вы уже нашли проблемной, вы можете скопировать каждую точку вцикл for, повторяющий "угловые" времена.

вместо:

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

try:

temp->pointer = new mousePoint[corner];
for(int a = 0; a < corner; a++)
{
   temp->pointer[a] = Lines[a];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...