bool gambs_pontoPertence(ListaEnc<Coordenada> pontos, Coordenada obj){ Elemento<Coordenada>* it = pontos.getHead(); for(int i =0; i<pontos.getSize(); i++){ if(igual(it->info->getX(),obj.getX()) && igual(it->info->getY(),obj.getY())) return true; it = it->_next; } return false; }
void transformaObjeto(Objeto* b, vector<vector<double> >transformada){ ListaEnc<Coordenada>* coordenadas = b->pontos(); for(int i=0; i<coordenadas->getSize(); i++){ Coordenada antiga = coordenadas->retiraDoInicio(); vector<vector<double> > nova = manipulador->multiplicaMatriz(antiga.getVector(), transformada); Coordenada nova_c(nova[0][0],nova[1][0],nova[2][0]); coordenadas->adiciona(nova_c); } }
ListaEnc<string> *PegarListaNomeArquivos() { ListaEnc<string>* lista = new ListaEnc<string>; std::string nome; nome.clear(); ifstream myfile("E:\\ManPages\\nomes\\nomesManPages.txt"); if (myfile.is_open()) { while (!myfile.eof()) { getline(myfile, nome); lista->adiciona(nome); } myfile.close(); } return lista; }
Objeto* reta_clippada(Objeto obj){ ListaEnc<Coordenada>* pontos = obj.pontos(); Coordenada ponto_A = *pontos->posicaoMem(0); Coordenada ponto_B = *pontos->posicaoMem(1); int codeA = rcCode(ponto_A); int codeB = rcCode(ponto_B); while(true){ if((codeA | codeB) ==0){ Objeto* novo = new Objeto(obj.nome(), obj.getTipo(), obj.isPreenchido()); novo->adiciona(ponto_A); novo->adiciona(ponto_B); return novo; } else if(codeA & codeB){ return 0; } else{ double novo_x, novo_y; int rcFora = codeA ? codeA : codeB; if (rcFora & 8) { // point is above the clip rectangle novo_x = ponto_A.getX() + (ponto_B.getX() - ponto_A.getX()) * (1 - ponto_A.getY()) / (ponto_B.getY() - ponto_A.getY()); novo_y = 1; } else if (rcFora & 4) { // point is below the clip rectangle novo_x = ponto_A.getX() + (ponto_B.getX() - ponto_A.getX()) * (-1 - ponto_A.getY()) / (ponto_B.getY() - ponto_A.getY()); novo_y = -1; } else if (rcFora & 2) { // point is to the right of clip rectangle novo_y = ponto_A.getY() + (ponto_B.getY() - ponto_A.getY()) * (1 - ponto_A.getX()) / (ponto_B.getX() - ponto_A.getX()); novo_x = 1; } else if (rcFora & 1) { // point is to the left of clip rectangle novo_y = ponto_A.getY() + (ponto_B.getY() - ponto_A.getY()) * (-1 - ponto_A.getX()) / (ponto_B.getX() - ponto_A.getX()); novo_x = -1; } if (rcFora == codeA) { ponto_A = Coordenada(novo_x, novo_y, 1); codeA = rcCode(ponto_A); } else { ponto_B = Coordenada(novo_x, novo_y, 1); codeB = rcCode(ponto_B); } } } }
void adiciona(const Coordenada & c) { _pontos.adiciona(c); }
void clip_Poligono(Objeto obj, DisplayFile* virt_clip){ //CHANCE DE DAR MERDA EM TUDO POR COMPARAR IGUALDADE ENTRE DOUBLES //Inicializando as 3 listas ListaEnc<Coordenada> pontos_obj; ListaEnc<Coordenada> pontos_obj_ori;//usado para percorrer os pontos do objeto. pontos_obj será modificado. ListaEnc<Coordenada> pontos_window; ListaEnc<Coordenada> pontos_window_ori; ListaEnc<Coordenada> entrantes; ListaEnc<Coordenada>* pontos_obj_ = obj.pontos(); for(int i =0; i<pontos_obj_->getSize();i++){ pontos_obj.adiciona(*pontos_obj_->posicaoMem(i)); pontos_obj_ori.adiciona(*pontos_obj_->posicaoMem(i)); } pontos_window.adiciona(Coordenada(-1,-1,1)); pontos_window.adiciona(Coordenada(-1,1,1)); pontos_window.adiciona(Coordenada(1,1,1)); pontos_window.adiciona(Coordenada(1,-1,1)); pontos_window_ori.adiciona(Coordenada(-1,-1,1)); pontos_window_ori.adiciona(Coordenada(-1,1,1)); pontos_window_ori.adiciona(Coordenada(1,1,1)); pontos_window_ori.adiciona(Coordenada(1,-1,1)); bool gambiarraTudoDentro = true; //percorrendo os segmentos de reta do polígono e montando as 3 listas Elemento<Coordenada>* it_objeto = pontos_obj_ori.getHead(); for(int i =0; i<pontos_obj_ori.getSize();i++){ Coordenada pontoA = *pontos_obj_ori.posicaoMem(i); Coordenada pontoB = *pontos_obj_ori.posicaoMem((i+1) % (pontos_obj_ori.getSize())); it_objeto = it_objeto->_next; if(rcCode(pontoA)==0){ // A dentro; if(rcCode(pontoB)!=0){ //pontoB fora; //caso dentro-fora Objeto reta(" ", Reta, false); reta.adiciona(pontoA); reta.adiciona(pontoB); Objeto *nova_reta = reta_clippada(reta); ListaEnc<Coordenada>* pontos_reta = nova_reta->pontos(); Coordenada novoB = *pontos_reta->posicaoMem(1);//pode dar problema de índice; insereNaWindow(&pontos_window, novoB); insereNoObjeto(&pontos_obj, pontoA, novoB); gambiarraTudoDentro = false; }else{ // cout << "dentro dentro" << endl; } } else{ gambiarraTudoDentro = false; Objeto reta(" ", Reta, false); reta.adiciona(pontoA); reta.adiciona(pontoB); Objeto *nova_reta = reta_clippada(reta); if(rcCode(pontoB)==0){ //pontoB dentro; //caso fora-dentro; ListaEnc<Coordenada>* pontos_reta = nova_reta->pontos(); Coordenada novoA = *pontos_reta->posicaoMem(0);//pode dar problema de índice; insereNaWindow(&pontos_window, novoA); insereNoObjeto(&pontos_obj, pontoA, novoA); entrantes.adiciona(novoA); } else{ //caso fora-fora if(nova_reta==0){ continue; } //cortando 2 pontos da window: ListaEnc<Coordenada>* pontos_reta = nova_reta->pontos(); Coordenada novoA = *pontos_reta->posicaoMem(0);//pode dar problema de índice; Coordenada novoB = *pontos_reta->posicaoMem(1);//pode dar problema de índice; insereNaWindow(&pontos_window, novoA); insereNaWindow(&pontos_window, novoB); insereNoObjeto(&pontos_obj, pontoA, novoA, novoB); entrantes.adiciona(novoA); } } } while(!entrantes.listaVazia()){ Objeto* novo = new Objeto(obj.nome(), obj.getTipo(), obj.isPreenchido()); Coordenada inicial = entrantes.retiraDoInicio(); Coordenada atual = inicial; novo->adiciona(atual); Coordenada* it_pontos_obj = pontos_obj.posicaoMem(0); Coordenada* it_pontos_window = pontos_window.posicaoMem(0); //ajustando iteradores para as posićões corretas. bool varreWindow =false; int fuck1=0, fuck2=0; do{ if(varreWindow){ while(!igual(it_pontos_window->getX(), atual.getX()) || !igual(it_pontos_window->getY(),atual.getY())){ it_pontos_window = pontos_window.posicaoMem(fuck1); fuck1 = (fuck1+1) % pontos_window.getSize(); } it_pontos_window = pontos_window.posicaoMem(fuck1); fuck1 = (fuck1+1) % pontos_window.getSize(); atual = *it_pontos_window; // cout << "adicionou" << endl; cout<< atual.getX() << ", " << atual.getY() << endl; novo->adiciona(atual); if(gambs_pontoPertence(pontos_window_ori, atual)){ continue; } varreWindow = false; } else{ while(!igual(it_pontos_obj->getX(), atual.getX()) || !igual(it_pontos_obj->getY(),atual.getY())){ it_pontos_obj = pontos_obj.posicaoMem(fuck2); fuck2 = (fuck2+1) % pontos_obj.getSize(); } it_pontos_obj = pontos_obj.posicaoMem(fuck2); fuck2 = (fuck2+1) % pontos_obj.getSize(); atual = *it_pontos_obj; novo->adiciona(atual); if(gambs_pontoPertence(pontos_window, atual)){ varreWindow = true; continue; } if(gambs_pontoPertence(pontos_obj_ori, atual)){ continue; } varreWindow = true; } }while(!igual(atual.getX(), inicial.getX()) || !igual(atual.getY(), inicial.getY()));//atual!=inicial virt_clip->adiciona(novo); } if(gambiarraTudoDentro){ ListaEnc<Coordenada>* pontos_obj_ = obj.pontos(); Objeto* novo = new Objeto(obj.nome(), obj.getTipo(), obj.isPreenchido()); for(int i =0; i<pontos_obj_->getSize();i++){ novo->adiciona(*pontos_obj_->posicaoMem(i)); } virt_clip->adiciona(novo); } }