bool in_rect(const rect& a, const point& b) { point p[4]; p[0] = a.corner; p[1] = a.corner + a.side1; p[2] = a.corner + a.side2; p[3] = p[2] + a.side2; return in_triangle(b, p) or in_triangle(b, p + 1); }
//---------------------------------------------------------------------- void WalkmeshFileSerializer::importWalkmeshFile( Ogre::DataStreamPtr &stream ,WalkmeshFile *pDest ) { uint32 triangle_count( 0 ); readUInt32( stream, triangle_count ); TriangleList triangles; readVector( stream, triangles, triangle_count ); AccessList access; readVector( stream, access, triangle_count ); WalkmeshTriangleList &triangle_list( pDest->getTriangles() ); triangle_list.clear(); triangle_list.reserve( triangle_count ); for( uint32 i(0); i < triangle_count; ++i ) { Triangle &in_triangle( triangles[i] ); Access &in_access( access[i] ); WalkmeshTriangle tmp_triangle; tmp_triangle.a = in_triangle.a; tmp_triangle.b = in_triangle.b; tmp_triangle.c = in_triangle.c; tmp_triangle.access_side[0] = in_access.a; tmp_triangle.access_side[1] = in_access.b; tmp_triangle.access_side[2] = in_access.c; triangle_list.push_back( tmp_triangle ); } }
int locate_point(const int triangles[][3], int triangles_count, const point &k) { int i; for (i = 0; i < triangles_count; i++) { point p = polygon_points[triangles[i][0]]; point q = polygon_points[triangles[i][1]]; point r = polygon_points[triangles[i][2]]; if (in_triangle(p, q, r, k)) break; } return i; }
void s_alea_tr_rect(int point_nb,float x[], float y[], float xmi, float xma, float ymi, float yma, int triangle_nb, float ax[], float ay[], float bx[], float by[], float cx[], float cy[], float p) { int i,j; for(i=1;i<=point_nb;i=i+1) { x[i]=xmi+aleaS((xma-xmi)/p)*p; y[i]=ymi+aleaS((yma-ymi)/p)*p; for (j=1;j<=triangle_nb;j=j+1) if (in_triangle(x[i],y[i],ax[j],ay[j],bx[j],by[j],cx[j],cy[j])) { j=triangle_nb+1; i=i-1; } } }
float intersect_triangle(iRay ray, Triangle tri, Point point) { Normal norm; /* triangle normal */ float t, fz, fm; int i; triangle_normal(tri, &norm); fz = 0; fm = 0; for (i = 0; i < 3; i++) { fz += norm[i] * (tri.vert[0][i]-ray.orig[i]); fm += norm[i] * ray.dir[i]; } if(fm == 0.0) return -1; t = fz / fm; /* don't consider negative parameter any more */ if(t < 0.0) return t; for(i = 0; i < 3; i++) point[i] = ray.orig[i] + ray.dir[i] * t; #ifdef _DEBUG printf("intersection point: (%f, %f, %f)\n", point[0], point[1], point[2]); #endif if(in_triangle(point, tri)) return t; return -1; }