static int lines_intersect(int i,int j,int k,int l,t_ls lss[MAX_LS_AMOUNT]) /* checks if two lines intersect on 3D sphere */ { t_ls v1; t_ls v2; t_ls v3, neg_v3; //t_float angle; t_float dist_ij,dist_kl,dist_iv3,dist_jv3,dist_inv3,dist_jnv3; t_float dist_kv3,dist_lv3,dist_knv3,dist_lnv3; // TODO epsilon needs to be updated for 64-bit/double precision t_float epsilon = 1e-9; ls_cross_prod(lss[i],lss[j],&v1); ls_cross_prod(lss[k],lss[l],&v2); ls_cross_prod(v1,v2,&v3); neg_v3.x= 0.0 - v3.x; neg_v3.y= 0.0 - v3.y; neg_v3.z= 0.0 - v3.z; dist_ij = (vec_angle(lss[i],lss[j])); dist_kl = (vec_angle(lss[k],lss[l])); dist_iv3 = (vec_angle(lss[i],v3)); dist_jv3 = (vec_angle(v3,lss[j])); dist_inv3 = (vec_angle(lss[i],neg_v3)); dist_jnv3 = (vec_angle(neg_v3,lss[j])); dist_kv3 = (vec_angle(lss[k],v3)); dist_lv3 = (vec_angle(v3,lss[l])); dist_knv3 = (vec_angle(lss[k],neg_v3)); dist_lnv3 = (vec_angle(neg_v3,lss[l])); /* if one of loudspeakers is close to crossing point, don't do anything*/ if(fabsf(dist_iv3) <= epsilon || fabsf(dist_jv3) <= epsilon || fabsf(dist_kv3) <= epsilon || fabsf(dist_lv3) <= epsilon || fabsf(dist_inv3) <= epsilon || fabsf(dist_jnv3) <= epsilon || fabsf(dist_knv3) <= epsilon || fabsf(dist_lnv3) <= epsilon ) return(0); // if crossing point is on line between both loudspeakers return 1 if (((fabsf(dist_ij - (dist_iv3 + dist_jv3)) <= epsilon) && (fabsf(dist_kl - (dist_kv3 + dist_lv3)) <= epsilon)) || ((fabsf(dist_ij - (dist_inv3 + dist_jnv3)) <= epsilon) && (fabsf(dist_kl - (dist_knv3 + dist_lnv3)) <= epsilon))) { return (1); } else { return (0); } }
int lines_intersect(int i,int j,int k,int l,t_ls lss[MAX_LS_AMOUNT]) /* checks if two lines intersect on 3D sphere */ { t_ls v1; t_ls v2; t_ls v3, neg_v3; //float angle; float dist_ij,dist_kl,dist_iv3,dist_jv3,dist_inv3,dist_jnv3; float dist_kv3,dist_lv3,dist_knv3,dist_lnv3; ls_cross_prod(lss[i],lss[j],&v1); ls_cross_prod(lss[k],lss[l],&v2); ls_cross_prod(v1,v2,&v3); neg_v3.x= 0.0 - v3.x; neg_v3.y= 0.0 - v3.y; neg_v3.z= 0.0 - v3.z; dist_ij = (vec_angle(lss[i],lss[j])); dist_kl = (vec_angle(lss[k],lss[l])); dist_iv3 = (vec_angle(lss[i],v3)); dist_jv3 = (vec_angle(v3,lss[j])); dist_inv3 = (vec_angle(lss[i],neg_v3)); dist_jnv3 = (vec_angle(neg_v3,lss[j])); dist_kv3 = (vec_angle(lss[k],v3)); dist_lv3 = (vec_angle(v3,lss[l])); dist_knv3 = (vec_angle(lss[k],neg_v3)); dist_lnv3 = (vec_angle(neg_v3,lss[l])); /* if one of loudspeakers is close to crossing point, don't do anything*/ if(fabsf(dist_iv3) <= 0.01 || fabsf(dist_jv3) <= 0.01 || fabsf(dist_kv3) <= 0.01 || fabsf(dist_lv3) <= 0.01 || fabsf(dist_inv3) <= 0.01 || fabsf(dist_jnv3) <= 0.01 || fabsf(dist_knv3) <= 0.01 || fabsf(dist_lnv3) <= 0.01 ) return(0); // if crossing point is on line between both loudspeakers return 1 if (((fabsf(dist_ij - (dist_iv3 + dist_jv3)) <= 0.01 ) && (fabsf(dist_kl - (dist_kv3 + dist_lv3)) <= 0.01)) || ((fabsf(dist_ij - (dist_inv3 + dist_jnv3)) <= 0.01) && (fabsf(dist_kl - (dist_knv3 + dist_lnv3)) <= 0.01 ))) { return (1); } else { return (0); } }
t_float vol_p_side_lgth(int i, int j,int k, t_ls lss[MAX_LS_AMOUNT] ) { /* calculate volume of the parallelepiped defined by the loudspeaker direction vectors and divide it with total length of the triangle sides. This is used when removing too narrow triangles. */ t_float volper, lgth; t_ls xprod; ls_cross_prod(lss[i], lss[j], &xprod); volper = fabsf(vec_prod(xprod, lss[k])); lgth = (fabsf(vec_angle(lss[i],lss[j])) + fabsf(vec_angle(lss[i],lss[k])) + fabsf(vec_angle(lss[j],lss[k]))); if(lgth>0.00001) return volper / lgth; else return 0.0; }