summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--donut.c46
-rw-r--r--donut.h9
-rw-r--r--main.c4
-rw-r--r--myqsort.c34
-rw-r--r--myqsort.h8
-rw-r--r--utils.h17
6 files changed, 98 insertions, 20 deletions
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 <raylib.h>
+#include <stdio.h>
-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 <raylib.h>
#include <stdio.h>
#include <math.h>
+#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 <stdlib.h>
+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 <raylib.h>
+typedef struct _Point3d{
+ double x, y, z;
+}point3d;
+
+typedef struct _Point2d{
+ double x, y;
+}point2d;
+
+typedef struct _Display{
+ point3d p;
+ Color c;
+}display;
+
+#endif