Vector ClosestPointPoly ( Vector const & V, VertexList const & vertices ) { if(vertices.size() == 0) return V; if(vertices.size() == 1) return vertices[0]; if(vertices.size() == 2) return ClosestPointSeg( V, Segment3d(vertices[0],vertices[1]) ); // ---------- Vector closest = ClosestPointTri( V, Triangle3d(vertices[0],vertices[1],vertices[2]) ); int nTris = vertices.size() - 2; for(int i = 1; i < nTris; i++) { Triangle3d tri( vertices[0], vertices[i+1], vertices[i+2] ); Vector temp = ClosestPointTri(V,tri); closest = selectCloser(V,closest,temp); } return closest; }
TEST(Objects, GetBoundingBox) { Triangle3d triangle(Point(-1, -10, 2), Point(1, 0, -2), Point(0, 1, 0)); ASSERT_EQ(triangle.getBoundingBox().minCorner, Point(-1, -10, -2)); ASSERT_EQ(triangle.getBoundingBox().maxCorner, Point(1, 1, 2)); Triangle3d triangle2 = Triangle3d(Point(0, 0, 0), Point(1, 0, 0), Point(0, 1, 0)); ASSERT_EQ(triangle2.getBoundingBox().minCorner, Point(0, 0, 0)); ASSERT_EQ(triangle2.getBoundingBox().maxCorner, Point(1, 1, 0)); }
inline Triangle3d Triangle3d::projectedOnto(const Plane3d& plane) const { return Triangle3d( vertex(0).projectedOnto(plane), vertex(1).projectedOnto(plane), vertex(2).projectedOnto(plane), handedness() ); }
Renderable Triangle3d::operator*(Matrix m) { return Triangle3d(m*a,m*b,m*c); }
Renderable Triangle3d::rotated(V3d ax,float ang) { return Triangle3d(a.rotated(ax,ang),b.rotated(ax,ang),c.rotated(ax,ang)); }
Renderable Triangle3d::translated(V3d t) { return Triangle3d(a+t,b+t,c+t); }