static bool circumCircle(const float* p1, const float* p2, const float* p3, float* c, float& r) { static const float EPS = 1e-6f; // Calculate the circle relative to p1, to avoid some precision issues. const float v1[3] = {0,0,0}; float v2[3], v3[3]; rcVsub(v2, p2,p1); rcVsub(v3, p3,p1); const float cp = vcross2(v1, v2, v3); if (fabsf(cp) > EPS) { const float v1Sq = vdot2(v1,v1); const float v2Sq = vdot2(v2,v2); const float v3Sq = vdot2(v3,v3); c[0] = (v1Sq*(v2[2]-v3[2]) + v2Sq*(v3[2]-v1[2]) + v3Sq*(v1[2]-v2[2])) / (2*cp); c[1] = 0; c[2] = (v1Sq*(v3[0]-v2[0]) + v2Sq*(v1[0]-v3[0]) + v3Sq*(v2[0]-v1[0])) / (2*cp); r = vdist2(c, v1); rcVadd(c, c, p1); return true; } rcVcopy(c, p1); r = 0; return false; }
bool rcIsOverlapBounds2D( const dtCoordinates& vertexPoint, const dtCoordinates& bmin, const dtCoordinates& bmax ) { const dtCoordinates extend( 0.4f, 0.0f, 0.4f ); dtCoordinates amin, amax; rcVsub( amin, vertexPoint, extend ); rcVadd( amax, vertexPoint, extend ); bool overlap = true; overlap = (amin.X() > bmax.X() || amax.X() < bmin.X()) ? false : overlap; overlap = (amin.Z() > bmax.Z() || amax.Z() < bmin.Z()) ? false : overlap; return overlap; }