static public IEnumerable <Vector3> GetTriangleIntersection(this Bounds item, Triangle3 triangle) { if (triangle.IsDegenerate() == false) { Plane plane = triangle.GetPlane(); if (plane.normal != Vector3.zero) { if (item.FullyContains(triangle)) { return(triangle.GetPoints()); } PlaneSpace plane_space = plane.GetPlaneSpace(); ConvexPolygon plane_polygon = new ConvexPolygon( plane_space.ProjectPoints(item.GetPlaneIntersection(plane)) ); ConvexPolygon triangle_polygon = new ConvexPolygon( plane_space.ProjectPoints(triangle.GetPoints()) ); return(plane_space.InflatePoints( plane_polygon.GetIntersection(triangle_polygon).GetVertexs() ).Narrow(p => item.Contains(p))); } } return(Empty.IEnumerable <Vector3>()); }
static public Triangle3 InflateTriangle(this PlaneSpace item, Triangle2 triangle) { return(new Triangle3( item.InflatePoint(triangle.v0), item.InflatePoint(triangle.v1), item.InflatePoint(triangle.v2) )); }
static public void CalculateUVs(this Mesh item) { Vector2[] uvs = new Vector2[item.vertexCount]; for (int i = 0; i < item.vertexCount; i++) { Vector3 normal = item.normals[i]; Vector3 position = item.vertices[i]; PlaneSpace place = new PlaneSpace(PlaneExtensions.CreateNormalAndDistance(normal, 0.0f)); uvs[i] = place.ProjectPoint(position); } item.uv = uvs; }
static public bool IsIntersecting(this PlaneSpace item, Plane plane, out Plane2 output) { Ray ray; if (item.plane.IsIntersecting(plane, out ray)) { output = Plane2Extensions.CreatePointsAndInsidePoint( item.ProjectPoint(ray.origin), item.ProjectPoint(ray.origin + ray.direction), item.ProjectPoint(ray.origin - plane.normal) ); return(true); } output = default(Plane2); return(false); }
static public void Seal(this MeshBuilder item, Plane plane, float edge_tolerance, float plane_tolerance) { FaceCloud faces = new FaceCloud(edge_tolerance); PlaneSpace plane_space = plane.GetPlaneSpace(); foreach (LineSegment3 edge in item.GetTriangles().Convert(t => t.GetEdges()).Flatten().Unique()) { if (plane.IsCoplanar(edge, plane_tolerance)) { faces.AddFace(plane_space.ProjectLineSegment(edge).GetFace()); } } item.AddTriangles( plane_space.InflateTriangles(faces.Tesselate()) .Convert(t => t.GetReversedWinding()) ); }
static public IEnumerable <Triangle3> InflateTriangles(this PlaneSpace item, IEnumerable <PolygonTriangle> triangles) { return(triangles.Convert(t => item.InflateTriangle(t))); }
static public Vector2 ProjectPoint(this PlaneSpace item, Vector3 point) { return(new Vector2(item.x.GetDot(point), item.y.GetDot(point))); }
static public Triangle3 InflateTriangle(this PlaneSpace item, PolygonTriangle triangle) { return(item.InflateTriangle(triangle.triangle)); }
static public LineSegment3 InflateLineSegment(this PlaneSpace item, LineSegment2 line_segment) { return(new LineSegment3(item.InflatePoint(line_segment.v0), item.InflatePoint(line_segment.v1))); }
static public IEnumerable <LineSegment3> InflateLineSegments(this PlaneSpace item, IEnumerable <LineSegment2> line_segments) { return(line_segments.Convert(l => item.InflateLineSegment(l))); }
static public Vector3 InflateVector(this PlaneSpace item, Vector2 vector) { return(item.InflatePoint(vector) - item.origin); }
static public IEnumerable <Vector3> InflateVectors(this PlaneSpace item, IEnumerable <Vector2> vectors) { return(vectors.Convert(v => item.InflateVector(v))); }
static public Vector3 InflatePoint(this PlaneSpace item, Vector2 point) { return(point.x * item.x + point.y * item.y + item.origin); }
static public IEnumerable <Vector3> InflatePoints(this PlaneSpace item, IEnumerable <Vector2> points) { return(points.Convert(p => item.InflatePoint(p))); }
static public Vector2 ProjectVector(this PlaneSpace item, Vector3 vector) { return(item.ProjectPoint(vector + item.origin)); }
static public IEnumerable <Vector2> ProjectVectors(this PlaneSpace item, IEnumerable <Vector3> vectors) { return(vectors.Convert(v => item.ProjectVector(v))); }
static public IEnumerable <Triangle2> ProjectTriangles(this PlaneSpace item, IEnumerable <Triangle3> triangles) { return(triangles.Convert(t => item.ProjectTriangle(t))); }
static public Triangle2 ProjectTriangle(this PlaneSpace item, Triangle3 triangle) { return(new Triangle2(item.ProjectPoint(triangle.v0), item.ProjectPoint(triangle.v1), item.ProjectPoint(triangle.v2))); }
static public LineSegment2 ProjectLineSegment(this PlaneSpace item, LineSegment3 line_segment) { return(new LineSegment2(item.ProjectPoint(line_segment.v0), item.ProjectPoint(line_segment.v1))); }