Exemplo n.º 1
0
void CDraw::linei( SColor& color, short x1, short y1, short x2, short y2 )
{
	linef( color, ( float(x1)/float(Engine::g_width) ) * ( g_aspect * 2.0f ), ( float(y1)/float(Engine::g_height) ) * ( 2.0f ), ( float(x2)/float(Engine::g_width) ) * ( g_aspect * 2.0f ), ( float(y2)/float(Engine::g_height) ) * ( 2.0f ) );
}
Exemplo n.º 2
0
/* DESENHA O CARRO ANDANDO SOBRE A CURVA */
void CanvasPista::startAutorama(void) {
	int iFinal = pontosDeControle.size() - 3; // posicao do ultimo segmento de curva

	if (tempo > 1.0)	// Passa para o proximo segmento de curva
	{
		tempo = 0;
		posicaoAtual += 3;
		if (posicaoAtual >= iFinal)
		{
			posicaoAtual = 0;
		}
	}

	if ((iFinal - posicaoAtual) <= 3)	// Se nao formar mais dois segmentos, o ultimo segmento sera maior
	{
		subPontosDeControle2 = std::vector<Ponto>(&pontosDeControle[posicaoAtual], &pontosDeControle[pontosDeControle.size()]);
		first = true;
	}
	else		// Forma os segmentos de curvas cubicas
	{
		subPontosDeControle2 = std::vector<Ponto>(&pontosDeControle[posicaoAtual], &pontosDeControle[posicaoAtual + 3 + 1]);
		first = true;
	}

	// Calcula o bezier e a tangente
	Ponto pontoBezier = bezier(subPontosDeControle2, tempo);
	Ponto tangente = derivadaBezier(subPontosDeControle2, tempo);
	float angulo = (float)(atan((float)tangente.y / (float)tangente.x) * 180) / 3.14;

	// Define as posicoes iniciais do carro
	Ponto inferiorEsquerdo(pontoBezier.x - 10, pontoBezier.y - 4);
	Ponto inferiorDireito(pontoBezier.x + 10, pontoBezier.y - 4);
	Ponto superiorEsquerdo(pontoBezier.x - 10, pontoBezier.y + 4);
	Ponto superiorDireito(pontoBezier.x + 10, pontoBezier.y + 4);

	// Realiza as transformacoes 2D (ordem inversa)
	Matriz matriz;							// Cria matriz de transformacao
	matriz.translada(pontoBezier.x, pontoBezier.y);		// Translada para o ponto de bezier
	matriz.rotacao(angulo);			// Faz a rotacao
	matriz.translada(-pontoBezier.x, -pontoBezier.y);		// Translada para a origem

	// Novos pontos do carro
	Ponto novoInferiorEsquerdo = multiplica(matriz.matriz, inferiorEsquerdo);
	Ponto novoInferiorDireito = multiplica(matriz.matriz, inferiorDireito);
	Ponto novoSuperiorEsquerdo = multiplica(matriz.matriz, superiorEsquerdo);
	Ponto novoSuperiorDireito = multiplica(matriz.matriz, superiorDireito);


	// Desenha o carro apos as transformacoes
	color(1, 0, 0);
	circleFillf(pontoBezier.x, pontoBezier.y, 4, 20);
	linef(novoInferiorEsquerdo.x, novoInferiorEsquerdo.y, novoInferiorDireito.x, novoInferiorDireito.y);
	linef(novoInferiorEsquerdo.x, novoInferiorEsquerdo.y, novoSuperiorEsquerdo.x, novoSuperiorEsquerdo.y);
	linef(novoInferiorDireito.x, novoInferiorDireito.y, novoSuperiorDireito.x, novoSuperiorDireito.y);
	linef(novoSuperiorEsquerdo.x, novoSuperiorEsquerdo.y, novoSuperiorDireito.x, novoSuperiorDireito.y);

	// Ajusta a velocidade do carro:
	setSpeed();
	tempo += 0.001*speed;

	if (buttonViewControlGraphs == true) // Se viewControlGraphs == true, mostra vetor de direcao do carro
	{
		color(0, 0, 1);
		float moduloTangente = sqrt(pow(tangente.x, 2) + pow(tangente.y, 2));
		tangente.x = (tangente.x / moduloTangente);
		tangente.y = (tangente.y / moduloTangente);
		linef(pontoBezier.x, pontoBezier.y, pontoBezier.x + tangente.x * 40, pontoBezier.y + tangente.y * 40);

		/*Ponto inferiorEsquerdo(pontoBezier.x - 5, pontoBezier.y - 5);
		Ponto inferiorDireito(pontoBezier.x + 5, pontoBezier.y - 5);
		Ponto superiorEsquerdo(pontoBezier.x - 5, pontoBezier.y + 5);
		Ponto superiorDireito(pontoBezier.x + 5, pontoBezier.y + 5);

		if (angulo < 0)
		{
			angulo = angulo*(-1);
			std::cout << angulo << std::endl;
		}

		// Realiza as transformacoes 2D (ordem inversa)
		Matriz matriz;							// Cria matriz de transformacao
		matriz.translada(pontoBezier.x + tangente.x * 40, pontoBezier.y + tangente.y * 40);		// Translada para o ponto de bezier
		matriz.rotacao( 45);			// Faz a rotacao
		matriz.translada(-pontoBezier.x, -pontoBezier.y);		// Translada para a origem

		// Novos pontos do carro
		Ponto novoInferiorEsquerdo = multiplica(matriz.matriz, inferiorEsquerdo);
		Ponto novoInferiorDireito = multiplica(matriz.matriz, inferiorDireito);
		Ponto novoSuperiorEsquerdo = multiplica(matriz.matriz, superiorEsquerdo);
		Ponto novoSuperiorDireito = multiplica(matriz.matriz, superiorDireito);

		color(1, 0, 0);
		circleFillf(pontoBezier.x, pontoBezier.y, 4, 20);
		//linef(novoInferiorEsquerdo.x, novoInferiorEsquerdo.y, novoInferiorDireito.x, novoInferiorDireito.y);
		linef(novoInferiorEsquerdo.x, novoInferiorEsquerdo.y, novoSuperiorEsquerdo.x, novoSuperiorEsquerdo.y);
		//linef(novoInferiorDireito.x, novoInferiorDireito.y, novoSuperiorDireito.x, novoSuperiorDireito.y);
		linef(novoSuperiorEsquerdo.x, novoSuperiorEsquerdo.y, novoSuperiorDireito.x, novoSuperiorDireito.y);*/

	}
}