Barassa Posted May 1, 2009 at 02:16 AM Report #260459 Posted May 1, 2009 at 02:16 AM Boas , tou aqui com um prob deve tar a escapar-me qualquer coisa que eu fiz include dos modulos mas mm assim diz-me que as funcoes nao estao definidas ... alguem sabe qual pode ser o problema ? os nomes tao iguais ..
Triton Posted May 1, 2009 at 02:17 AM Report #260461 Posted May 1, 2009 at 02:17 AM Show us the code. <3 life
Barassa Posted May 1, 2009 at 05:47 PM Author Report #260585 Posted May 1, 2009 at 05:47 PM Entretanto ja resolvi o problema agora : Diz que rectangle * quadrantes[] = divide®; "Is an invalid initializer" Alguem me explica pq? int intersects (rectangle *r, rectangle *t) { rectangle * quadrantes[] = divide(r); rectangle *divide (rectangle *r) { rectangle *quadrantes[4]; quadrantes[0].x = r->x; quadrantes[0].y = r->y; quadrantes[0].w = (r->w)/2; quadrantes[0].h = (r->h)/2; quadrantes[1].x = r->x; quadrantes[1].y = (r->y)+((r->h)/2) quadrantes[1].w = (r->w)/2; quadrantes[1].h = (r->h)/2; quadrantes[2].x = (r->x)+((r->w)/2) quadrantes[2].y = (r->y)+((r->h)/2) quadrantes[2].w = (r->w)/2; quadrantes[2].h = (r->h)/2; quadrantes[3].x = (r->x)+((r->w)/2) quadrantes[3].y = r->y; quadrantes[3].w = (r->w)/2; quadrantes[3].h = (r->h)/2; return quadrantes; } Obrigado
Ferreira Posted May 1, 2009 at 06:14 PM Report #260597 Posted May 1, 2009 at 06:14 PM Porque aquilo o left-value (aquilo a que estás a tentar atribuir um valor) não é uma variável. O que estás a tentar fazer nessa linha? http://twitter.com/ferreira
pedrosorio Posted May 1, 2009 at 06:20 PM Report #260600 Posted May 1, 2009 at 06:20 PM Eu não estou a perceber como é que essa função divide compila. Tu dás-lhe tipo de retorno rectangle* mas estás a devolver quadrantes que teoricamente é rectangle** Não respondo a dúvidas por mensagem.
Barassa Posted May 1, 2009 at 06:28 PM Author Report #260602 Posted May 1, 2009 at 06:28 PM queria passar os rectangulos devolvidos pelo divide para verificar se intersectam como devo fazer entao ?
Barassa Posted May 2, 2009 at 12:51 AM Author Report #260692 Posted May 2, 2009 at 12:51 AM .... alguem ..?
pedrosorio Posted May 2, 2009 at 07:57 AM Report #260702 Posted May 2, 2009 at 07:57 AM A tua função divide não está a dar erros na compilação? Tens rectangle *quadrantes[4]; que é um array de apontadores. Depois fazes: quadrantes[0].x = r->x; quadrantes[0].x ? quadrantes[0] supostamente é um apontador para rectangle. Quanto muito seria quadrantes[0]->x. Depois estás a tentar declarar um array e atribuir-lhe um array criado numa função. Impossível. Aquilo que é possível fazer é devolver apontadores, mas como tu crias quadrantes dentro da função divide, quando fazes return toda a memória desse array é libertada. A única forma de fazeres isso é alocares memória dinamicamente (malloc) e alterares essa memória, devolvendo depois o apontador e atribuindo-o ao apontador declarado cá fora. Ou seja, no intersect terias: rectangle **quadrantes = divide®; E depois rectangle **divide(rectangle *r) { rectangle **quadrantes=(rectangle**) malloc(4*sizeof(rectangle*)); etc. etc. return quadrantes; } Atenção que terias que ter cuidado para libertar a memória alocada (apesar de não ser muita). Não respondo a dúvidas por mensagem.
Barassa Posted May 2, 2009 at 09:31 PM Author Report #260932 Posted May 2, 2009 at 09:31 PM Sim ... Muito obrigado .. Acho que fica assim ... #include <math.h> #include "rectangle.h" #include "quadtree.h" /*Verifica se o rectangulo apontado por t colide mais do que 1 vez com um dos quadrantes do rectangulo apontado por r*/ int intersects (rectangle *r, rectangle *t) { int count = 0; rectangle **quadrantes = divide(r); printf("Dentro do Intersect:\nQuadrante 0 \nX: %d Y: %d W: %d H: %d\n", quadrantes[0]->x , quadrantes[0]->y , quadrantes[0]->w , quadrantes[0]->h); if (colide(quadrantes[0], t) == 1) // Colide com o 1 quadrante { count++; } if (colide(quadrantes[1], t) == 1) //Colide com o 2 quadrante { count++; } if (colide(quadrantes[2], t) == 1) //Colide com o 3 quadrante { count++; } if (colide(quadrantes[3], t) == 1) //Colide com o 4 quadrante { count++; } if (count > 1) // Se colidir com mais de 1 quadrante nao se pode dividir devolve 1 { return 1; } return 0; // senao devolve 0 } /*Divide o rectangulo apontado por r em 4 quadrantes, e retorna estes num vector de rectangulos*/ rectangle **divide (rectangle *r) { rectangle **quadrantes=(rectangle**) malloc(4*sizeof(rectangle*)); //printf("Rectangulo A dividir \nX: %d Y: %d W: %d H: %d\n", r->x , r->y , r->w , r->h); rectangle um; um.x = r->x; um.y = r->y; um.w = (r->w)/2; um.h = (r->h)/2; //printf("Rectangulo 1 da divisao X: %d Y: %d W: %d H: %d\n", um.x , um.y , um.w , um.h); rectangle dois; dois.x = r->x; dois.y = (r->y)+((r->h)/2); dois.w = (r->w)/2; dois.h = (r->h)/2; rectangle tres; tres.x = (r->x)+((r->w)/2); tres.y = (r->y)+((r->h)/2); tres.w = (r->w)/2; tres.h = (r->h)/2; rectangle quatro; quatro.x = (r->x)+((r->w)/2); quatro.y = r->y; quatro.w = (r->w)/2; quatro.h = (r->h)/2; quadrantes[0] = &um; quadrantes[1] = &dois; quadrantes[2] = &tres; quadrantes[3] = &quatro; return quadrantes; } /* Verifica se 2 rectângulos colidem, se sim retorna 1.*/ int colide ( rectangle *r1 , rectangle *r2) { int u1 = r1->x + r1->w; int v1 = r1->y + r1->h; int u2 = r2->x + r2->w; int v2 = r2->y + r2->h; printf("\nRectangulo 1 \nX: %d Y: %d U: %d V: %d", r1->x , r1->y , u1 , v1); printf("\nRectangulo 2 \nX: %d Y: %d U: %d V: %d", r2->x , r2->y , u2 , v2); if((r1->x <= u2) && (u1 >= r2->x) && (r1->y <= v2) && (v1 >= r2->y)) { return 1; } return 0; } Bem supostamente eu na função intersect tou a passar mal o argumento quadrante porque tao-me a dar numeros gigantescos para o rectangulo quando faço print na função colide. Como se passa como deve ser ?
Barassa Posted May 3, 2009 at 03:02 PM Author Report #261012 Posted May 3, 2009 at 03:02 PM void organize (rectangle quad [], Quadtree * tree, Quadtree_Node * node, rectangle * r, rectangle * t) { if (node == NULL) //Se o node onde se quer inserir nao existe { node = create_node(tree, node); //Cria o node } /*Verifica se o rectângulo pertence a este node, se sim adiciona, se não executa esta função para um dos quatro quadrantes do rectângulo onde se queria inserir.*/ if (intersects(quad, r, t)==1) // Se na proxima divisao que vem o rectangulo nao se pode dividir { printf("Adicionado ao node o rectanglo com coordenadas X:%d Y:%d\n", t->x , t->y); addToNode(node, t); // Adiciona o rectangulo ao node printf("\nAdicionado\n"); } else printf("Rectangulo Grande \nX: %d Y: %d W: %d H: %d\n",r->x , r->y , r->w , r->h); divide(quad , r); if (colide(&quad[0], t) == 1) { printf("Colisao no 1 quadrante"); organize(quad , node->rect[0], node, &quad[0], t); } //exit(0); if (colide(&quad[1], t) == 1) { printf("Colisao no 2 quadrante"); organize(quad , node->rect[1], node, &quad[1], t); } if (colide(&quad[2], t) == 1) { printf("Colisao no 3 quadrante"); organize(quad, node->rect[2], node, &quad[2], t); } if (colide(&quad[3], t) == 1) { printf("Colisao no 4 quadrante"); organize(quad , node->rect[3], node, &quad[3], t); } } Supostamente se executa o if não faz o else né? Mas ele ta a entrar no if do intersect e adicionar ao node e depois ainda vai testar as outras condições. 😉
pedrosorio Posted May 3, 2009 at 03:05 PM Report #261013 Posted May 3, 2009 at 03:05 PM Tens que pôr {} a seguir ao else Não respondo a dúvidas por mensagem.
TheDark Posted May 3, 2009 at 07:50 PM Report #261044 Posted May 3, 2009 at 07:50 PM Se indentares o código torna-se mais fácil ver o erro apontado pelo pedrosorio. Desaparecido.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now