Example #1
0
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;
		}
	}
}
Example #5
0
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;
}