private void AddContours(Visual3D model1, int o, int m, int n) { var bounds = Visual3DHelper.FindBounds(model1, Transform3D.Identity); for (int i = 1; i < n; i++) { this.ContourPlane = new Plane3D(new Point3D(0, 0, bounds.Location.Z + bounds.Size.Z * i / n), new Vector3D(0, 0, 1)); Visual3DHelper.Traverse<GeometryModel3D>(model1, this.AddContours); } for (int i = 1; i < m; i++) { this.ContourPlane = new Plane3D(new Point3D(0, bounds.Location.Y + bounds.Size.Y * i / m, 0), new Vector3D(0, 1, 0)); Visual3DHelper.Traverse<GeometryModel3D>(model1, this.AddContours); } for (int i = 1; i < o; i++) { this.ContourPlane = new Plane3D(new Point3D(bounds.Location.X + bounds.Size.X * i / o, 0, 0), new Vector3D(1, 0, 0)); Visual3DHelper.Traverse<GeometryModel3D>(model1, this.AddContours); } }
/// <summary> /// Intersects the specified source mesh geometry with the specified plane. /// </summary> /// <param name="source">The source.</param> /// <param name="inverseTransform">The inverse transform of the source.</param> /// <param name="plane">The plane.</param> /// <param name="complement">Cut with the complement set if set to <c>true</c>.</param> /// <returns>The intersected geometry.</returns> private MeshGeometry3D Intersect(MeshGeometry3D source, GeneralTransform3D inverseTransform, Plane3D plane, bool complement) { var p = inverseTransform.Transform(plane.Position); var p2 = inverseTransform.Transform(plane.Position + plane.Normal); var n = p2 - p; if (complement) { n *= -1; } return MeshGeometryHelper.Cut(source, p, n); }
/// <summary> /// Intersects the specified source mesh geometry with the specified plane. /// </summary> /// <param name="source">The source.</param> /// <param name="inverseTransform">The inverse transform of the source.</param> /// <param name="plane">The plane.</param> /// <param name="complement">Cut with the complement set if set to <c>true</c>.</param> /// <returns>The intersected geometry.</returns> private MeshGeometry3D Intersect(MeshGeometry3D source, GeneralTransform3D inverseTransform, Plane3D plane, bool complement) { var p = inverseTransform.Transform(plane.Position); var p2 = inverseTransform.Transform(plane.Position + plane.Normal); var n = p2 - p; if (complement) { n *= -1; } return(MeshGeometryHelper.Cut(source, p, n)); }
/// <summary> /// Chamfers the specified corner (experimental code). /// </summary> /// <param name="p"> /// The corner point. /// </param> /// <param name="d"> /// The chamfer distance. /// </param> /// <param name="eps"> /// The corner search limit distance. /// </param> /// <param name="chamferPoints"> /// If this parameter is provided, the collection will be filled with the generated chamfer points. /// </param> public void ChamferCorner(Point3D p, double d, double eps = 1e-6, IList<Point3D> chamferPoints = null) { this.NoSharedVertices(); this.normals = null; this.textureCoordinates = null; var cornerNormal = this.FindCornerNormal(p, eps); var newCornerPoint = p - (cornerNormal * d); int index0 = this.positions.Count; this.positions.Add(newCornerPoint); var plane = new Plane3D(newCornerPoint, cornerNormal); int ntri = this.triangleIndices.Count; for (int i = 0; i < ntri; i += 3) { int i0 = i; int i1 = i + 1; int i2 = i + 2; var p0 = this.positions[this.triangleIndices[i0]]; var p1 = this.positions[this.triangleIndices[i1]]; var p2 = this.positions[this.triangleIndices[i2]]; double d0 = (p - p0).LengthSquared; double d1 = (p - p1).LengthSquared; double d2 = (p - p2).LengthSquared; double mind = Math.Min(d0, Math.Min(d1, d2)); if (mind > eps) { continue; } if (d1 < eps) { i0 = i + 1; i1 = i + 2; i2 = i; } if (d2 < eps) { i0 = i + 2; i1 = i; i2 = i + 1; } p0 = this.positions[this.triangleIndices[i0]]; p1 = this.positions[this.triangleIndices[i1]]; p2 = this.positions[this.triangleIndices[i2]]; // origin is the corner vertex (at index i0) // find the intersections between the chamfer plane and the two edges connected to the corner var p01 = plane.LineIntersection(p0, p1); var p02 = plane.LineIntersection(p0, p2); if (p01 == null) { continue; } if (p02 == null) { continue; } if (chamferPoints != null) { // add the chamfered points if (!chamferPoints.Contains(p01.Value)) { chamferPoints.Add(p01.Value); } if (!chamferPoints.Contains(p02.Value)) { chamferPoints.Add(p02.Value); } } int i01 = i0; // change the original triangle to use the first chamfer point this.positions[this.triangleIndices[i01]] = p01.Value; int i02 = this.positions.Count; this.positions.Add(p02.Value); // add a new triangle for the other chamfer point this.triangleIndices.Add(i01); this.triangleIndices.Add(i2); this.triangleIndices.Add(i02); // add a triangle connecting the chamfer points and the new corner point this.triangleIndices.Add(index0); this.triangleIndices.Add(i01); this.triangleIndices.Add(i02); } this.NoSharedVertices(); }
public ClippingPlane(Plane3D plane) { this.Location = new Point(plane.Position); this.Direction = new Direction(plane.Normal); }