Sep
LLee el manual… a los bonitos manuales…
Una idea genial de Dark_seid guardada en C/C++
Mis amigos, hoy para solidarizar con el socito que salió en informe especial… voy a hacerla cortita… asi que vamos directo al grano.
Sigo con los manuales, esta vez toca un par de manualcillos de C++… uno es el de la famosa Universidad de Navarra de la serie “Aprenda… como si estuviera en primero” y el otro que anda por ahí no mas en calidad y que a mi gusto es mucho más completo y práctico si es que no cachó bien la tersnica de la programación en el semestre anterior… Si los quiere, ya sabe…
HAGA CLICK AQUÍ
Para bajar los archivos, por si no cacha, haga click con el botón derecho (o comando+click pal amigo del socito que usa mac) y elija la opción “guardar destino como” o “Save link as”, así se evita abrir los PDF en el navegador y la hace más corta.
Eso sería!!!
Jun
Escriba una rutina: Jugando a ser PIXAR… dibuje una pirámide.
Una idea genial de Dark_seid guardada en C/C++

Otra vez no tengo muchas ganas de escribir, asi que de nuevo la vamos a hacer cortita… esto se está transformando en un carrito de completos más que en un sucucho… pero el agotamiento puede más que las ganas de comunicar…. en que iba entonces???… ap cierto… como ayer vi a varios compañeros bien perdidos con el tema de la pirámide, me voy a rajar con mi opción para calcular el movimiento de los puntos de la base, y para el programa principal.
¿Porqué sólo calculo el movimiento de los puntos y no de las líneas? porque si no se han dado cuenta aún lo que interesa es seguir el movimiento de los 4 puntos (en el caso de una pirámide con base cuadrada) que forman la base, el punto donde llegan las líneas que suben (la puntita… mmm siiii), no se mueve. Si logran hacer que los 4 puntos se muevan, las líneas se van a mover.
En el caso de la pirámide que yo dibujé, los 4 puntos forman una base como un rombo (creo que así se llama… ufff mi cerebro geométrico a estas alturas borró las formas complicadas, sólo sabe las formas básicas: botella de cerveza, lata de cerveza, jarro para tomar cerveza). En el dibujito de al lado está el esquema, insisto, piensen en la ubicación de los puntos, las líneas no existen.
La primera complicación es darle movimiento y que la base no se abra (como algunos que andan dando vueltas por ahí, me refiero a algunas pirámides que he visto). Después de mucho pensar (mmm, ya… ok), me dí cuenta de que cuando los 4 puntos se mueven (para simular la rotación) dibujan una elipse, tal y como se ve en el dibujito de al lado (la flecha roja indica el sentido de la rotación). Con ese dato, la mitad del problema está resuelto, porque lo que necesito saber para que la bendita pirámide rote es la posición (Xn,Yn) de los 4 puntos, y como variar esa posición homogéneamente.
Para solucionar eso último recurrí a la ecuación paramétrica de la elipse, que calcula la posición (x,y) de cualquier punto en la curva de la elipse, en base a un ángulo y a los radios mayores y menores de la elipse. A partir de aquí sólo trabajé en el plano y me olvidé del punto de arriba (el de la puntita… jejeje), así apareció otro dato necesario que es el centro de la elipse. No voy a explicar de donde viene todo eso de la fórmula paramétrica pero si les voy a decir que si optan por este camino, les recomiendo que si no lo han hecho aún dibujen su pirámide en un papel con cuadritos porque así pueden saber cuales son los radios de la elipse y cual es el centro (debería ser la X de la puntita con la Y de los puntos más amplios, en mi caso la Y de (X2,Y2)). En el mono de abajo está el esquema de la elipse, con los 4 puntos más el centro y las fómulas para calcular X e Y, con el ajuste necesario para que todo resulte bien.

Esas 4 fórmulas las deben utilizar para calcular todos los puntos que forman la pirámide (excepto el de la puntita… obvio). Con eso ya están dados. Lo que resta sólo es aplicar la función line y listo. Les dejo el código para uno de los movimientos pa que vean como se hace con el método de las fórmulas paramétricas:
void der()
{
double A,B,C,D; /* deben ser definidos como double */
double x1,x2,x3,x4; /* para tener mas precisión */
double y1,y2,y3,y4;
...
B=270,C=360,D=90;
for (A=180;A<541;a++)
{
x1=(350+100*cos(A*3.1416/180)); /*calculo de coordenadas tomando como */
y1=(370-30*sin(A*3.1416/180)); /*referencia el punto (X1,Y1) y su angulo A*/
x2=(350+100*cos(B*3.1416/180));
y2=(370-30*sin(B*3.1416/180));
x3=(350+100*cos(C*3.1416/180));
y3=(370-30*sin(C*3.1416/180));
x4=(350+100*cos(D*3.1416/180));
y4=(370-30*sin(D*3.1416/180));
/*dibujo de lineas*/ cleardevice(); line(x1,y1,x2,y2); line(x2,y2,x3,y3); line(x3,y3,x4,y4); line(x4,y4,x1,y1); line(X,Y,x2,y2); line(X,Y,x4,y4); line(X,Y,x1,y1); line(X,Y,x3,y3); B=B++; /*se incrementan los ángulos y se vuelve a calcular hasta */ C=C++; /* que el angulo A vale 541 */ D=D++; /* lo que equivale a una vuelta completa */ delay(50); } ... }
Ya, al final igual me salió largo. Haga click en las imágenes para agrandar. No se si lo notaron pero esa es una función… jejeje. Eso sería… Espero les sirva. Saludos.
Agenda de la 700
Lo más pedido...
Blogroll
Depósito de ideas geniales
Categorías
