diff options
author | amy <[email protected]> | 2023-05-03 07:04:58 +0000 |
---|---|---|
committer | amy <[email protected]> | 2023-05-03 07:04:58 +0000 |
commit | 113f976de527c7c818af2e2d97ae304159fe3881 (patch) | |
tree | 61579103d67ccef52efc784fa5c61df6a1402eae | |
parent | 5474ce816be91ecbd7472e55cdc4357b8158f5bf (diff) |
:)
-rw-r--r-- | src/point.c | 109 | ||||
-rw-r--r-- | src/point.c~ | 113 | ||||
-rw-r--r-- | src/util.h | 6 | ||||
-rw-r--r-- | src/util.h~ | 29 |
4 files changed, 137 insertions, 120 deletions
diff --git a/src/point.c b/src/point.c index 672d8b7..2c3c248 100644 --- a/src/point.c +++ b/src/point.c @@ -284,11 +284,7 @@ void perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,double ct int p_b4 = 0; double ttt2 = 1.0; //printf("%f\n",NUU); - - // - //todo: start search after pointer leaves the first line, - // then stop when it hits the second line - // + int found1 = 1; int found2 = 1; for(int jj = 0; jj<=dclen-1; jj++){ @@ -424,12 +420,12 @@ void perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,double ct for(int zzi2 = 0; zzi2!=trline->at[zzi].len;zzi2++){ //printf("(%f %f):\n",trline.at[zzi].at[zzi2*2],trline.at[zzi].at[zzi2*2+1]); if(max_t<trline->at[zzi].at[zzi2*2]){ - max_t = trline->at[zzi].at[zzi2*2]; - max2_t = trline->at[zzi].at[zzi2*2+1]; + max_t = trline->at[zzi].at[zzi2*2]; + max2_t = trline->at[zzi].at[zzi2*2+1]; } if(min_t>=trline->at[zzi].at[zzi2*2]){ - min_t = trline->at[zzi].at[zzi2*2]; - min2_t = trline->at[zzi].at[zzi2*2+1]; + min_t = trline->at[zzi].at[zzi2*2]; + min2_t = trline->at[zzi].at[zzi2*2+1]; } //min_t = (min_t>trline.at[zzi].at[zzi2]?trline.at[zzi].at[zzi2]:min_t); } @@ -447,57 +443,45 @@ void perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,double ct double ux1, uy1, ux2, uy2; int ma_to_mi = 0; if (di > di2) { - ux1 = max_t; - uy1 = max2_t; - ux2 = lmin_t; - uy2 = lmin2_t; - ma_to_mi=1; + ux1 = max_t; + uy1 = max2_t; + ux2 = lmin_t; + uy2 = lmin2_t; + ma_to_mi=1; } else { - ux1 = min_t; - uy1 = min2_t; - ux2 = lmax_t; - uy2 = lmax2_t; + ux1 = min_t; + uy1 = min2_t; + ux2 = lmax_t; + uy2 = lmax2_t; } //printf("%f %f >> %f %f (f,%f) | %f %f\n",di,di2,ux1,uy1,min_t,ux2,uy2); color2 = 1.0f; - //printf("%f\n",color2); - - - if(ma_to_mi){ - //printf("%f -> %f | %f for %f\n",max_t,lmin_t,diff(max_t,lmin_t)/asd->len,asd->len); - } else { - //printf("%f -> %f | %f for %f\n",min_t,lmax_t,diff(min_t,lmax_t)/asd->len,asd->len); - } - - //y - y1 = m(x - x1) - //double a1x = (uy2 - uy1); - //double b1y = (ux2 - ux1); - //double a1c = (ux2*a1x + uy2*b1y); - //printf("%fx+%fy=%f\n",a1x,b1y,a1c); double x1 = ma_to_mi?max_t:min_t; double x2 = ma_to_mi?lmin_t:lmax_t; - double y1 = uy1; - double y2 = uy2; - double m1 = (y2-y1)/(x2-x1); + double ite = ((float)get_w()/4); + + double ite1 = fabs(max_t/ite); + double ite2 = fabs(lmax_t/ite); + + double y1 = uy1; + double y2 = uy2; + + for(;(ma_to_mi?x1>=x2:x1<=x2);(ma_to_mi?(x1-=ite1):(x1+=ite2))){ + + double m1 = (y2-y1)/(x2-x1); + double b1 = y1 - m1 * x1; - double bb[] = {x1,x2}; - double bb2[] = {y1, y2}; - point_arr* asd = basier2d(bb,bb2,2,0.1,0.1,0.1); int coll = 0; - //printf("-\n"); - //printf("%f -> %f\n",x1,x2); for(int yyu = 0; yyu!=fc_len-1; yyu++){ - - + double x3 = pixels[yyu*2]; double x4 = pixels[(yyu+1)*2]; double y3 = pixels[yyu*2+1]; double y4 = pixels[(yyu+1)*2+1]; double m2 = (y4-y3)/(x4-x3); - - double b1 = y1 - m1 * x1; + double b2 = y3 - m2 * x3; double nsx = (b2-b1)/(m1-m2); @@ -508,7 +492,6 @@ void perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,double ct ||(diff(nsx,x2)<FL_DIS&&diff(nsy,y2)<FL_DIS) ||(diff(nsx,x1)<FL_DIS&&diff(nsy,y1)<FL_DIS)) continue; - //printf("aaa\n"); /* pixels = realloc(pixels,sizeof *pixels *((c_len+1)*4)); colors = realloc(colors,sizeof *colors *((c_len+1)*5)); @@ -519,28 +502,38 @@ void perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,double ct colors[c_len*3+2] = 1.0f;//-yyu/(fc_len-1); c_len++;*/ coll=1; + break; //printf("aaa\n"); //printf("%f,%f,%f,%f,%f,%f %f,%f,%f,%f,%f,%f, %f %f\n",x1,y1,x2,y2,m1,b1, x3,y3,x4,y4,m2,b2,nsx,nsy); //printf("(%f,%f) -> (%f,%f) :: x:%f,y:%f\n",ux1,uy1,ux2,uy2,nsx,nsy); } - + if(coll){ + continue; + } + double bb[] = {x1,x2}; + double bb2[] = {y1, y2}; + point_arr* asd = basier2d(bb,bb2,2,0.1,0.1,0.1); + for(int lli = 0; !coll&&lli!=asd->len; lli++){ - pixels = realloc(pixels,sizeof *pixels *((c_len+1)*4)); - colors = realloc(colors,sizeof *colors *((c_len+1)*5)); - double dd = 10; - //if(diff(asd->c[lli].at.x,ex)<(float)dd/get_w()&&diff(asd->c[lli].at.y,ey)<(float)dd/get_w()) - // break; - pixels[c_len*2] = asd->c[lli].at.x; - pixels[c_len*2+1] = asd->c[lli].at.y; - colors[c_len*3] = color2; - colors[c_len*3+1] = color;//vvi==3?0.1f:vvi==4?0.5f:1.0f; - colors[c_len*3+2] = 0.0f; - c_len++; + pixels = realloc(pixels,sizeof *pixels *((c_len+1)*4)); + colors = realloc(colors,sizeof *colors *((c_len+1)*5)); + double dd = 10; + //if(diff(asd->c[lli].at.x,ex)<(float)dd/get_w()&&diff(asd->c[lli].at.y,ey)<(float)dd/get_w()) + // break; + pixels[c_len*2] = asd->c[lli].at.x; + pixels[c_len*2+1] = asd->c[lli].at.y; + colors[c_len*3] = color2; + colors[c_len*3+1] = color;//vvi==3?0.1f:vvi==4?0.5f:1.0f; + colors[c_len*3+2] = 0.0f; + c_len++; } free(asd->c); free(asd->vert); free(asd); + break; + } + /* pixels = realloc(pixels,sizeof *pixels *((c_len+1)*4)); colors = realloc(colors,sizeof *colors *((c_len+1)*5)); //ab_to_vp(nn1,nn2,get_w(),get_h(),abba->c[hhi].at.x,abba->c[hhi].at.y) @@ -561,7 +554,7 @@ void perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,double ct colors[c_len*3] = color2; colors[c_len*3+1] = color;//vvi==3?0.1f:vvi==4?0.5f:1.0f; colors[c_len*3+2] = 0.0f; - c_len++; + c_len++;*/ } lmax_t = max_t; lmin_t = min_t; diff --git a/src/point.c~ b/src/point.c~ index 680c74d..8ae9b55 100644 --- a/src/point.c~ +++ b/src/point.c~ @@ -284,11 +284,7 @@ void perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,double ct int p_b4 = 0; double ttt2 = 1.0; //printf("%f\n",NUU); - - // - //todo: start search after pointer leaves the first line, - // then stop when it hits the second line - // + int found1 = 1; int found2 = 1; for(int jj = 0; jj<=dclen-1; jj++){ @@ -412,7 +408,9 @@ void perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,double ct double ffclen = c_len; //printf("---\n"); //printf("%i\n",trline->len); - double lmax_t = -2.0; + double ite = ((float)get_w()/4); + + double lmax_t = -2.0; double lmin_t = 2.0; double lmax2_t = -2.0; double lmin2_t = 2.0; @@ -424,12 +422,12 @@ void perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,double ct for(int zzi2 = 0; zzi2!=trline->at[zzi].len;zzi2++){ //printf("(%f %f):\n",trline.at[zzi].at[zzi2*2],trline.at[zzi].at[zzi2*2+1]); if(max_t<trline->at[zzi].at[zzi2*2]){ - max_t = trline->at[zzi].at[zzi2*2]; - max2_t = trline->at[zzi].at[zzi2*2+1]; + max_t = trline->at[zzi].at[zzi2*2]; + max2_t = trline->at[zzi].at[zzi2*2+1]; } if(min_t>=trline->at[zzi].at[zzi2*2]){ - min_t = trline->at[zzi].at[zzi2*2]; - min2_t = trline->at[zzi].at[zzi2*2+1]; + min_t = trline->at[zzi].at[zzi2*2]; + min2_t = trline->at[zzi].at[zzi2*2+1]; } //min_t = (min_t>trline.at[zzi].at[zzi2]?trline.at[zzi].at[zzi2]:min_t); } @@ -447,56 +445,44 @@ void perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,double ct double ux1, uy1, ux2, uy2; int ma_to_mi = 0; if (di > di2) { - ux1 = max_t; - uy1 = max2_t; - ux2 = lmin_t; - uy2 = lmin2_t; - ma_to_mi=1; + ux1 = max_t; + uy1 = max2_t; + ux2 = lmin_t; + uy2 = lmin2_t; + ma_to_mi=1; } else { - ux1 = min_t; - uy1 = min2_t; - ux2 = lmax_t; - uy2 = lmax2_t; + ux1 = min_t; + uy1 = min2_t; + ux2 = lmax_t; + uy2 = lmax2_t; } //printf("%f %f >> %f %f (f,%f) | %f %f\n",di,di2,ux1,uy1,min_t,ux2,uy2); color2 = 1.0f; - //printf("%f\n",color2); - - if(ma_to_mi){ - //printf("%f -> %f | %f for %f\n",max_t,lmin_t,diff(max_t,lmin_t)/asd->len,asd->len); - } else { - //printf("%f -> %f | %f for %f\n",min_t,lmax_t,diff(min_t,lmax_t)/asd->len,asd->len); - } - - //y - y1 = m(x - x1) - //double a1x = (uy2 - uy1); - //double b1y = (ux2 - ux1); - //double a1c = (ux2*a1x + uy2*b1y); - //printf("%fx+%fy=%f\n",a1x,b1y,a1c); - double x1 = ma_to_mi?max_t:min_t; + double x1 = ma_to_mi?max_t:min_t; double x2 = ma_to_mi?lmin_t:lmax_t; - double y1 = uy1; - double y2 = uy2; - double m1 = (y2-y1)/(x2-x1); - double bb[] = {x1,x2}; - double bb2[] = {y1, y2}; - point_arr* asd = basier2d(bb,bb2,2,0.1,0.1,0.1); + double ite1 = fabs(max_t/ite); + double ite2 = fabs(lmax_t/ite); + + double y1 = uy1; + double y2 = uy2; + + for(;(ma_to_mi?x1>=x2:x1<=x2);(ma_to_mi?(x1-=ite1):(x1+=ite2))){ + + double m1 = (y2-y1)/(x2-x1); + double b1 = y1 - m1 * x1; + int coll = 0; - //printf("-\n"); - //printf("%f -> %f\n",x1,x2); for(int yyu = 0; yyu!=fc_len-1; yyu++){ - - + double x3 = pixels[yyu*2]; double x4 = pixels[(yyu+1)*2]; double y3 = pixels[yyu*2+1]; double y4 = pixels[(yyu+1)*2+1]; double m2 = (y4-y3)/(x4-x3); - - double b1 = y1 - m1 * x1; + double b2 = y3 - m2 * x3; double nsx = (b2-b1)/(m1-m2); @@ -507,7 +493,6 @@ void perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,double ct ||(diff(nsx,x2)<FL_DIS&&diff(nsy,y2)<FL_DIS) ||(diff(nsx,x1)<FL_DIS&&diff(nsy,y1)<FL_DIS)) continue; - //printf("aaa\n"); /* pixels = realloc(pixels,sizeof *pixels *((c_len+1)*4)); colors = realloc(colors,sizeof *colors *((c_len+1)*5)); @@ -518,28 +503,38 @@ void perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,double ct colors[c_len*3+2] = 1.0f;//-yyu/(fc_len-1); c_len++;*/ coll=1; + break; //printf("aaa\n"); //printf("%f,%f,%f,%f,%f,%f %f,%f,%f,%f,%f,%f, %f %f\n",x1,y1,x2,y2,m1,b1, x3,y3,x4,y4,m2,b2,nsx,nsy); //printf("(%f,%f) -> (%f,%f) :: x:%f,y:%f\n",ux1,uy1,ux2,uy2,nsx,nsy); } - + if(coll){ + continue; + } + double bb[] = {x1,x2}; + double bb2[] = {y1, y2}; + point_arr* asd = basier2d(bb,bb2,2,0.1,0.1,0.1); + for(int lli = 0; !coll&&lli!=asd->len; lli++){ - pixels = realloc(pixels,sizeof *pixels *((c_len+1)*4)); - colors = realloc(colors,sizeof *colors *((c_len+1)*5)); - double dd = 10; - //if(diff(asd->c[lli].at.x,ex)<(float)dd/get_w()&&diff(asd->c[lli].at.y,ey)<(float)dd/get_w()) - // break; - pixels[c_len*2] = asd->c[lli].at.x; - pixels[c_len*2+1] = asd->c[lli].at.y; - colors[c_len*3] = color2; - colors[c_len*3+1] = color;//vvi==3?0.1f:vvi==4?0.5f:1.0f; - colors[c_len*3+2] = 0.0f; - c_len++; + pixels = realloc(pixels,sizeof *pixels *((c_len+1)*4)); + colors = realloc(colors,sizeof *colors *((c_len+1)*5)); + double dd = 10; + //if(diff(asd->c[lli].at.x,ex)<(float)dd/get_w()&&diff(asd->c[lli].at.y,ey)<(float)dd/get_w()) + // break; + pixels[c_len*2] = asd->c[lli].at.x; + pixels[c_len*2+1] = asd->c[lli].at.y; + colors[c_len*3] = color2; + colors[c_len*3+1] = color;//vvi==3?0.1f:vvi==4?0.5f:1.0f; + colors[c_len*3+2] = 0.0f; + c_len++; } free(asd->c); free(asd->vert); free(asd); + break; + } + /* pixels = realloc(pixels,sizeof *pixels *((c_len+1)*4)); colors = realloc(colors,sizeof *colors *((c_len+1)*5)); //ab_to_vp(nn1,nn2,get_w(),get_h(),abba->c[hhi].at.x,abba->c[hhi].at.y) @@ -560,7 +555,7 @@ void perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,double ct colors[c_len*3] = color2; colors[c_len*3+1] = color;//vvi==3?0.1f:vvi==4?0.5f:1.0f; colors[c_len*3+2] = 0.0f; - c_len++; + c_len++;*/ } lmax_t = max_t; lmin_t = min_t; @@ -4,9 +4,9 @@ #ifndef __util__ #define __util__ #include "string.h" -#define greater(a,b) (a>b?a:b) -#define lesser(a,b) (a>b?b:a) -#define diff(a,b) (a>b?a-b:b-a) +#define greater(a,b) ((a)>(b)?(a):(b)) +#define lesser(a,b) ((a)>(b)?(b):(a)) +#define diff(a,b) ((a)>(b)?(a)-(b):(b)-(a)) #define malloc(X) malloc(X); mmalloc(); void mmalloc(); #define free(X) free(X); ffree(); diff --git a/src/util.h~ b/src/util.h~ new file mode 100644 index 0000000..cc78d48 --- /dev/null +++ b/src/util.h~ @@ -0,0 +1,29 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#ifndef __util__ +#define __util__ +#include "string.h" +#define greater(a,b) (a>b?a:b) +#define lesser(a,b) (a>b?b:a) +#define diff(a,b) (a>b?a-b:b-a) +#define malloc(X) malloc(X); mmalloc(); +void mmalloc(); +#define free(X) free(X); ffree(); +void ffree(); +void err_m(char*,void (*)(int),char*,int); +void warn_m(char*,char*,int ,...); +void info_m(char*,char*,int ,...); +void log_m(char*ca,char*f,int l,...); +void flag_handle(int argc,char* argv[]); +void sig_handle(void); +unsigned int_len(const unsigned n); +char* force_ca_length(char*inp,int len); +void pexit(int s); + +#define err(s,f,...) err_m(s,f,__FILE__,__LINE__,##__VA_ARGS__); +#define warn(s) warn_m(s,__FILE__,__LINE__); +#define info(s) info_m(s,__FILE__,__LINE__); +#define logm(s) log_m(s,__FILE__,__LINE__); + +#endif |