From 10f9fd02f78e6818b0b157d14b348fd36682fedb Mon Sep 17 00:00:00 2001 From: leo Date: Fri, 16 Feb 2024 00:44:13 -0300 Subject: finalizado, tem que melhorar a performance --- donut.c | 46 +++++++++++++++++++++++++++++++++++----------- donut.h | 9 ++------- main.c | 4 ++-- myqsort.c | 34 ++++++++++++++++++++++++++++++++++ myqsort.h | 8 ++++++++ utils.h | 17 +++++++++++++++++ 6 files changed, 98 insertions(+), 20 deletions(-) create mode 100644 myqsort.c create mode 100644 myqsort.h create mode 100644 utils.h diff --git a/donut.c b/donut.c index 9355ed4..2460dda 100644 --- a/donut.c +++ b/donut.c @@ -1,13 +1,19 @@ #include "donut.h" #include +#include -point3d light1 = {10, 10, 10}; +double static_angle = 0; +double n_static_angle = 0; + +point3d light1 = {0, 0, 10}; point3d light2 = {-10, -10, -10}; point3d light3 = {-5, 0, -5}; //center nao deve ter passado pela funcao map antes void draw_circle(point2d center, double radius){ double angle = 0; - static double static_angle = 0; + static display buf[198135*4]; + + int buf_index = 0; while(angle <= 2*PI){ for(double i=0; i<2*PI; i+=0.01){ @@ -35,22 +41,40 @@ void draw_circle(point2d center, double radius){ //(N ^ light) double lv1 = N.x * light1.x + N.y * light1.y + N.z * light1.z; - double lv2 = N.x * light2.x + N.y * light2.y + N.z * light2.z; - double lv3 = N.x * light3.x + N.y * light3.y + N.z * light3.z; - lv2 = 0; - lv3 = 0; - double lv = MAX(MAX(lv1, lv2), lv3); + // double lv2 = N.x * light2.x + N.y * light2.y + N.z * light2.z; + // double lv3 = N.x * light3.x + N.y * light3.y + N.z * light3.z; + // lv2 = 0; + // lv3 = 0; + // double lv = MAX(MAX(lv1, lv2), lv3); + double lv = lv1; - aux = map(aux); +// aux = map(aux); if(lv > 0){ int alp = 255 * lv / 5; alp = (alp > 255 ? 255 : alp); - DrawPixel(aux.x, aux.y, (Color){0, 255, 0, alp}); +// DrawPixel(aux.x, aux.y, (Color){0, 255, 0, alp}); + buf[buf_index].p = tmp3; + buf[buf_index].c = (Color){alp, alp, alp, 255}; + }else{ + buf[buf_index].p = tmp3; + buf[buf_index].c = (Color){255, 255, 255, 0}; } + buf_index++; } - angle += 0.01; + angle += 0.005; + } + + static_angle += 0.15; + //n_static_angle += 0.01; + + my_qsort(buf, 0, 198135*4-1); + for(int i=0; i<198135*4; ++i){ + point2d p; + p.x = buf[i].p.x; + p.y = buf[i].p.y; + p = map(p); + DrawPixel(p.x, p.y, buf[i].c); } - static_angle += 0.05; } point3d rotate_z(point3d p, double a){ diff --git a/donut.h b/donut.h index e4e0519..68ab552 100644 --- a/donut.h +++ b/donut.h @@ -4,19 +4,14 @@ #include #include #include +#include "utils.h" +#include "myqsort.h" #define MAX(a,b) ((a)>(b)?(a):(b)) #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 640 -typedef struct _Point3d{ - double x, y, z; -}point3d; - -typedef struct _Point2d{ - double x, y; -}point2d; void debug_printp2(point2d p); diff --git a/main.c b/main.c index cadbf42..af0e2c0 100644 --- a/main.c +++ b/main.c @@ -21,11 +21,11 @@ int main(){ DrawText("DONUT", 0, 0, 16, WHITE); //draw line 0 0 0.5 0.5 - DrawLine(p1.x, p1.y, p2.x, p2.y, RED); + //DrawLine(p1.x, p1.y, p2.x, p2.y, RED); draw_circle((point2d){0.50, 0.0}, 0.25); EndDrawing(); } CloseWindow(); return 0; -} \ No newline at end of file +} diff --git a/myqsort.c b/myqsort.c new file mode 100644 index 0000000..ac18a68 --- /dev/null +++ b/myqsort.c @@ -0,0 +1,34 @@ +#include "myqsort.h" +#include +int my_partition(display *A, int p, int r){ + int ri = p + rand() % (r - p); + display tmp = A[ri]; + A[ri] = A[r]; + A[r] = tmp; + + display pivot = A[r]; + int pos_pivot = p; + + for(int i=p; i < r; ++i){ + if(A[i].p.z < pivot.p.z){ + display aux = A[i]; + A[i] = A[pos_pivot]; + A[pos_pivot] = aux; + pos_pivot++; + } + } + + display aux = A[pos_pivot]; + A[pos_pivot] = pivot; + A[r] = aux; + + return pos_pivot; +} + +void my_qsort(display *A, int p, int r){ + if(p < r){ + int q = my_partition(A, p, r); + my_qsort(A, p, q-1); + my_qsort(A, q+1, r); + } +} diff --git a/myqsort.h b/myqsort.h new file mode 100644 index 0000000..56549a0 --- /dev/null +++ b/myqsort.h @@ -0,0 +1,8 @@ +#ifndef _QSORT +#define _QSORT +#include "utils.h" + +int my_partition(display *A, int p, int r); +void my_qsort(display *A, int p, int r); + +#endif diff --git a/utils.h b/utils.h new file mode 100644 index 0000000..a014916 --- /dev/null +++ b/utils.h @@ -0,0 +1,17 @@ +#ifndef _UTILS +#define _UTILS +#include +typedef struct _Point3d{ + double x, y, z; +}point3d; + +typedef struct _Point2d{ + double x, y; +}point2d; + +typedef struct _Display{ + point3d p; + Color c; +}display; + +#endif -- cgit v1.2.3