Ir para conteúdo
Fórum Script Brasil
  • 0

Função para criar um cubo(3D)


Zeero

Pergunta

Essa é uma função que eu desenvolvi para desenhar cubos em C. Criei uma variável que chamei de índice de rotação, a partir dela a função desenha o cubo com certa inclinação, com um loop podemos fazer uma animação 3D de rotação.

O movimento é rotativo, isto é: o cubo gira em seu próprio eixo.

É um ótimo exemplo pra quem está começando a programar com gráficos em C.

Minha função:

/* Criação de Cubos por Raphael Pina Viana */
void drawCube(int x, int y, int aresta, int ir)
{
    int i;
    float dif = (aresta / 2); /* constante diferenca */

    if(ir > aresta / 2)
    {
        ir = ir % (aresta / 2);
    }

    /* Quadrado Principal */
    line(x, y + (2 * ir), x - ir, y + aresta - ir);
    line(x, y + (2 * ir), x + aresta, y + (2 * ir));
    line(x + aresta, y + (2 * ir), x + aresta - ir, y + aresta - ir);
    line(x + aresta - ir, y + aresta - ir, x - ir, y + aresta - ir);

    /* Arestas que ligam os dois quadrados */
    line(x, y + (2 * ir), x - dif + ir, y - dif + ir);
    line(x + aresta, y + (2 * ir), x + dif + ir, y - dif + ir);
    line(x - ir, y + aresta - ir, x - dif, y + dif - (2 * ir));
    line(x + aresta - ir, y + aresta - ir, x + dif, y + dif - (2 * ir));

    x = x - dif;
    y = y - dif;

    /* Quadrado Secundario */
    line(x + ir, y + ir, x, y + aresta - (2 * ir));
    line(x + ir, y + ir, x + aresta + ir, y + ir);
    line(x + aresta + ir, y + ir, x + aresta, y + aresta - (2 * ir));
    line(x + aresta, y + aresta - (2 * ir), x, y + aresta - (2 * ir));
}
Explicação das variáveis de chamada: X e Y são as coordenadas X e Y do ponto superior esquerdo do quadrado principal do cubo. Aresta é o comprimento de cada "traço" que compõe o cubo. ir é o índice de rotação. Um sistema que eu criei para alterar o desenho do cubo em seu próprio eixo, fazendo o efeito de rotação. Note que o índice de rotação deve valer de 0 até a metade do valor da aresta. Logo 0 e (aresta / 2) é o estado estático do cubo. Um exemplo que eu criei em que o cubo da 5 voltas e para, daí você pressiona qualquer tecla e a aplicação é finalizada:
/* Animação 3D, por Raphael Pina Viana */
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <graphics.h>

int main()
{
    /* VARIAVEIS */
    int far *gDriver, *gMode;
    int color = WHITE;
    int i;

    /* FUNCOES */
    void drawCube(int, int, int, int);

    /* Inicia componentes gráficos */
    detectgraph(gDriver, gMode);
    initgraph(gDriver, gMode, '');

    for(i = 0; i <= 40 * 5; i ++)
    {
        cleardevice();
        drawCube(450, 200, 80, i);
        delay(25000);
    }

    /* Fecha componentes gráficos e encerra o programa */
    getch();
    closegraph();
    return 1;
}

void drawCube(int x, int y, int aresta, int ir)
{
    int i;
    float dif = (aresta / 2); /* constante diferenca */

    if(ir > aresta / 2)
    {
        ir = ir % (aresta / 2);
    }

    /* Quadrado Principal */
    line(x, y + (2 * ir), x - ir, y + aresta - ir);
    line(x, y + (2 * ir), x + aresta, y + (2 * ir));
    line(x + aresta, y + (2 * ir), x + aresta - ir, y + aresta - ir);
    line(x + aresta - ir, y + aresta - ir, x - ir, y + aresta - ir);

    /* Arestas que ligam os dois quadrados */
    line(x, y + (2 * ir), x - dif + ir, y - dif + ir);
    line(x + aresta, y + (2 * ir), x + dif + ir, y - dif + ir);
    line(x - ir, y + aresta - ir, x - dif, y + dif - (2 * ir));
    line(x + aresta - ir, y + aresta - ir, x + dif, y + dif - (2 * ir));

    x = x - dif;
    y = y - dif;

    /* Quadrado Secundario */
    line(x + ir, y + ir, x, y + aresta - (2 * ir));
    line(x + ir, y + ir, x + aresta + ir, y + ir);
    line(x + aresta + ir, y + ir, x + aresta, y + aresta - (2 * ir));
    line(x + aresta, y + aresta - (2 * ir), x, y + aresta - (2 * ir));
}

Programa com a animação: http://rapidshare.com/files/96573512/3D_em_C.zip.html

Abraços !

Editado por Zeero
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...