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 ) ); }
/* 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);*/ } }