Example #1
0
	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);
		}
	}
Example #2
0
File: P1.c Project: hugonomura/CG2
int main(){
	//Pontos iniciais
	Ponto P1, P2, P3, P4, P5, P6, P7, P8;

	float se, co, tz, cpz;

	//Pontos rotacionados
	Ponto *rP1, *rP2, *rP3, *rP4, *rP5, *rP6, *rP7, *rP8;

	//Pontos Projetados perspectivamente
	Ponto *iP1, *iP2, *iP3, *iP4, *iP5, *iP6, *iP7, *iP8;

	//Declaração da matriz de rotação
	struct matriz4x4 mRotaciona;

	int RXmin,RXmax,RYmin,RYmax,a,b;

	Window win;
	Display *display;
	int width = 256, height = 256, x = 0, y = 0, i, tx, ty,ref,rot;
	GC gc;
	unsigned long valuemask = 0;
	XGCValues values;
	XColor cor;


	P1.x =  30; P1.y = -10; P1.z =  10; P1.W = 1;
	P2.x =  30; P2.y = -10; P2.z = -10; P2.W = 1;
	P3.x =  30; P3.y =  10; P3.z =  10; P3.W = 1;
	P4.x =  30; P4.y =  10; P4.z = -10; P4.W = 1;
	P5.x = -30; P5.y = -10; P5.z =  10; P5.W = 1;
	P6.x = -30; P6.y = -10; P6.z = -10; P6.W = 1;
	P7.x = -30; P7.y =  10; P7.z =  10; P7.W = 1;
	P8.x = -30; P8.y =  10; P8.z = -10; P8.W = 1;

	//Variaveis para calculo do seno e cosseno do angulo de rotacao
	se = sin(90*PI/180);
	co = cos(90*PI/180);

	//Inicializacao da matriz de Rotacao em relacao ao eixo z

	mRotaciona.a11 = co; mRotaciona.a12 = -se; mRotaciona.a13 = 0; mRotaciona.a14 = 0;
	mRotaciona.a21 = se; mRotaciona.a22 = co; mRotaciona.a23 = 0; mRotaciona.a24 = 0;
	mRotaciona.a31 = 0; mRotaciona.a32 = 0; mRotaciona.a33 = 1; mRotaciona.a34 = 0;
	mRotaciona.a41 = 0; mRotaciona.a42 = 0; mRotaciona.a43 = 0; mRotaciona.a44 = 1;



//**************************************  (a)  **********************************************

	//Estou utilizando a regra da mão direita
	//Chamada da funcao que rotaciona o ponto
	rP1 = rotaciona(&mRotaciona, &P1);
	rP2 = rotaciona(&mRotaciona, &P2);
	rP3 = rotaciona(&mRotaciona, &P3);
	rP4 = rotaciona(&mRotaciona, &P4);
	rP5 = rotaciona(&mRotaciona, &P5);
	rP6 = rotaciona(&mRotaciona, &P6);
	rP7 = rotaciona(&mRotaciona, &P7);
	rP8 = rotaciona(&mRotaciona, &P8);

	
//**************************************  (b)  **********************************************

	//Projeção Perspectiva

	printf("\n\nDigite o valor Tz: \n");
	scanf("%f",&tz);
	printf("\nDigite o valor Cpz: \n");
	scanf("%f",&cpz);

	iP1 = Projeta(tz, cpz, rP1);
	iP2 = Projeta(tz, cpz, rP2);
	iP3 = Projeta(tz, cpz, rP3);
	iP4 = Projeta(tz, cpz, rP4);
	iP5 = Projeta(tz, cpz, rP5);
	iP6 = Projeta(tz, cpz, rP6);
	iP7 = Projeta(tz, cpz, rP7);
	iP8 = Projeta(tz, cpz, rP8);

	
//**************************************  (c)  **********************************************


	//Entrada dos valores do retangulo de visualizacao
	printf("\n\nDigite o valor do RXmin: \n");
	scanf("%f",&RXmin);
	printf("\nDigite o valor RXmax: \n");
	scanf("%f",&RXmax);

	printf("\n\nDigite o valor do RYmin: \n");
	scanf("%f",&RYmin);
	printf("\nDigite o valor RYmax: \n");
	scanf("%f",&RYmax);

	//width = modulo(RXmin) + modulo(RXmax);
	//height = modulo(RYmin) + modulo(RYmax);
	
	win = XCreateSimpleWindow(display, RootWindow(display, DefaultScreen(display)), x, y, width, height, 4, 	BlackPixel(display, DefaultScreen(display)), WhitePixel(display, DefaultScreen(display)));
	XMapWindow(display, win);
	gc = XCreateGC(display, win, valuemask, &values);
	XSync(display, False);

	XSetForeground(display, gc, WhitePixel(display, DefaultScreen(display)));
	XSetBackground(display, gc, BlackPixel(display, DefaultScreen(display)));

	XAllocNamedColor(display, XDefaultColormap(display, DefaultScreen(display)),"black", &cor, &cor);

	XSetForeground(display, gc, cor.pixel);


	//Desenhando os pontos
	a = iP1->x;
	b = iP1->y;
	XDrawPoint(display, win, gc, a, b);

	a = iP2->x;
	b = iP2->y;
	XDrawPoint(display, win, gc, a, b);

	a = iP1->x;
	b = iP1->y;
	XDrawPoint(display, win, gc, a, b);

	a = iP1->x;
	b = iP1->y;
	XDrawPoint(display, win, gc, a, b);

	a = iP1->x;
	b = iP1->y;
	XDrawPoint(display, win, gc, a, b);

	a = iP1->x;
	b = iP1->y;
	XDrawPoint(display, win, gc, a, b);

	a = iP1->x;
	b = iP1->y;
	XDrawPoint(display, win, gc, a, b);

	a = iP1->x;
	b = iP1->y;
	XDrawPoint(display, win, gc, a, b);

	//Desenhando as 12 retas
        reta(&win, &gc, display,iP1->x,iP2->x,iP1->y,iP2->y);

        reta(&win, &gc, display,iP2->x,iP4->x,iP2->y,iP4->y);

        reta(&win, &gc, display,iP4->x,iP3->x,iP4->y,iP3->y);

        reta(&win, &gc, display,iP3->x,iP1->x,iP3->y,iP1->y);

        reta(&win, &gc, display,iP1->x,iP5->x,iP1->y,iP5->y);

        reta(&win, &gc, display,iP2->x,iP6->x,iP2->y,iP6->y);

        reta(&win, &gc, display,iP3->x,iP7->x,iP3->y,iP7->y);

        reta(&win, &gc, display,iP4->x,iP8->x,iP4->y,iP8->y);

        reta(&win, &gc, display,iP5->x,iP6->x,iP5->y,iP6->y);

        reta(&win, &gc, display,iP6->x,iP8->x,iP6->y,iP8->y);

        reta(&win, &gc, display,iP8->x,iP7->x,iP8->y,iP7->y);

        reta(&win, &gc, display,iP7->x,iP5->x,iP7->y,iP5->y);


	XFlush(display);

	sleep(30);

	XFreeGC(display, gc);
	XCloseDisplay(display);

	return 0;
}