diff options
Diffstat (limited to 'donut.c')
-rw-r--r-- | donut.c | 85 |
1 files changed, 85 insertions, 0 deletions
@@ -0,0 +1,85 @@ +#include "donut.h" +#include <raylib.h> + +//center nao deve ter passado pela funcao map antes +void draw_circle(point2d center, double radius){ + double angle = 0; + static double static_angle = 0; + + while(angle <= 2*PI){ + for(double i=0; i<2*PI; i+=0.01){ + double r = radius; + + //point3d tmpc = {center.x, center.y, 0}; + //tmpc = rotate_x(tmpc, angle); + //center.x = tmpc.x; center.y = tmpc.y; + + point2d aux = {r*cos(i), r*sin(i)}; + aux.x += center.x; aux.y += center.y; + + point3d tmp3 = {aux.x, aux.y, 0}; + tmp3 = rotate_y(tmp3, angle); + tmp3 = rotate_z(tmp3, static_angle); + tmp3 = rotate_x(tmp3, static_angle); + aux.x = tmp3.x; aux.y = tmp3.y; + + //point3d tmp = {aux.x, aux.y, 0}; + //tmp = rotate_y(tmp, angle); + //aux.x = tmp.x; aux.y = tmp.y; + +// point3d tmp2 = {aux.x, aux.y, 0}; +// tmp2 = rotate_x(tmp2, static_angle); +// aux.x = tmp2.x; aux.y = tmp2.y; + + aux = map(aux); + DrawPixel(aux.x, aux.y, GREEN); + } + angle += 0.005; + } + static_angle += 0.05; +} + +point3d rotate_z(point3d p, double a){ + double Rz[3][3] = {{1, 0, 0}, {0, cos(a), -sin(a)}, {0, sin(a), cos(a)}}; + point3d rp; + rp.x = Rz[0][0]*p.x + Rz[0][1]*p.y + Rz[0][2]*p.z; + rp.y = Rz[1][0]*p.x + Rz[1][1]*p.y + Rz[1][2]*p.z; + rp.z = Rz[2][0]*p.x + Rz[2][1]*p.y + Rz[2][2]*p.z; + return rp; +} + +point3d rotate_y(point3d p, double a){ + double Ry[3][3] = {{cos(a), 0, sin(a)}, {0, 1, 0}, {-sin(a), 0, cos(a)}}; + point3d rp; + rp.x = Ry[0][0]*p.x + Ry[0][1]*p.y + Ry[0][2]*p.z; + rp.y = Ry[1][0]*p.x + Ry[1][1]*p.y + Ry[1][2]*p.z; + rp.z = Ry[2][0]*p.x + Ry[2][1]*p.y + Ry[2][2]*p.z; + return rp; +} + +point3d rotate_x(point3d p, double a){ + const double Rx[3][3] = {{cos(a), -sin(a), 0}, {sin(a), cos(a), 0}, {0, 0, 1}}; + point3d rp; + rp.x = Rx[0][0]*p.x + Rx[0][1]*p.y + Rx[0][2]*p.z; + rp.y = Rx[1][0]*p.x + Rx[1][1]*p.y + Rx[1][2]*p.z; + rp.z = Rx[2][0]*p.x + Rx[2][1]*p.y + Rx[2][2]*p.z; + return rp; +} + +point2d map(point2d p){ + point2d r; + r.x = SCREEN_WIDTH/2 * (p.x + 1); + r.y = -1*SCREEN_HEIGHT/2 * (p.y + 1) + SCREEN_HEIGHT; + return r; +} + +point2d demap(point2d r){ + point2d p; + p.x = r.x * 2 / SCREEN_WIDTH - 1; + p.y = -1*(r.y - SCREEN_HEIGHT) * 2 / SCREEN_HEIGHT - 1; + return p; +} + +void debug_printp2(point2d p){ + printf("x: %lf y: %lf\n", p.x, p.y); +} |