int h0(int bitpos) { if (getbit(bitpos)) return h01(bitpos+1); else return h00(bitpos+1); }
RNBoolean R3Contains(const R3Triangle& triangle, const R3Point& point) { // Check whether triangle bounding shape contains point if (!R3Contains(triangle.Box(), point)) return FALSE; // Check whether triangle plane contains point if (!R3Contains(triangle.Plane(), point)) return FALSE; // Compute whether point is on correct side of each edge const R3Point& p0 = triangle.Vertex(0)->Position(); const R3Point& p1 = triangle.Vertex(1)->Position(); const R3Point& p2 = triangle.Vertex(2)->Position(); R3Plane h01(p1, triangle.Normal(), p1 - p0); if (RNIsNegative(R3SignedDistance(h01, point))) return FALSE; R3Plane plane01(p1, triangle.Normal(), p1 - p0); if (RNIsNegative(R3SignedDistance(plane01, point))) return FALSE; R3Plane plane12(p2, triangle.Normal(), p2 - p1); if (RNIsNegative(R3SignedDistance(plane12, point))) return FALSE; R3Plane plane20(p0, triangle.Normal(), p0 - p2); if (RNIsNegative(R3SignedDistance(plane20, point))) return FALSE; // Triangle contains point return TRUE; }
Vec CardinalSpline::operator() (unsigned int n, float t) { assert(n < points.size()); assert(t >= 0 && t <= 1); return (points[n] * h00(t) + tangents[n] * h10(t) + points[n+1] * h01(t) + tangents[n+1] * h11(t)); }