public AddTriangle ( System.Windows.Media.Media3D.Point3D p0, System.Windows.Media.Media3D.Point3D p1, System.Windows.Media.Media3D.Point3D p2 ) : void | ||
p0 | System.Windows.Media.Media3D.Point3D | /// The first point. /// |
p1 | System.Windows.Media.Media3D.Point3D | /// The second point. /// |
p2 | System.Windows.Media.Media3D.Point3D | /// The third point. /// |
return | void |
private static object buildTri() { var mb = new MeshBuilder(true, false); var p0 = new Point3D(0, 0, 0); var p1 = new Point3D(1, 0, 0); var p2 = new Point3D(1, 1, 0); mb.AddTriangle(p0, p1, p2); mb.Normals.ToList().ForEach(x => System.Diagnostics.Trace.WriteLine(x.ToString())); return mb.ToMesh(); }
//private ht.TranslateManipulator translateModificator; /// <summary> /// The tessellate. /// </summary> /// <returns>The mesh.</returns> protected override MeshGeometry3D Tessellate() { var builder = new ht.MeshBuilder(true, true); // Position and Rotation must not be concidered because they are handled by the visual 3d if (this.Sensor == null) { builder.AddPyramid(new Point3D(), 1, 1); return(builder.ToMesh()); } var _zeroPosition = new Point3D();// this.Transform.Value.GetTranslation() - this.Position; var _length = new Spherical3D(this.Sensor.MaxRange, 0, 0); var _dirSp = this.Orientation.Axis.ToSpherical(); _dirSp.Radius = 0; var _p0AzOffset = new Spherical3D(0, 0, this.Sensor.AzimuthRange / 2.0); var _p0ElOffset = new Spherical3D(0, this.Sensor.ElevationRange / 2.0, 0); var _pts = new List <Point3D>(); _pts.Add(_zeroPosition + this.Orientation.Axis + (_length + _p0ElOffset - _p0AzOffset + _dirSp).ToDirection()); _pts.Add(_zeroPosition + this.Orientation.Axis + (_length + _p0ElOffset + _p0AzOffset + _dirSp).ToDirection()); _pts.Add(_zeroPosition + this.Orientation.Axis + (_length - _p0ElOffset + _p0AzOffset + _dirSp).ToDirection()); _pts.Add(_zeroPosition + this.Orientation.Axis + (_length - _p0ElOffset - _p0AzOffset + _dirSp).ToDirection()); _pts.Sort((Point3D a, Point3D b) => { if (Math.Abs(a.X - b.X) < DBL_EqualOffset) { if (Math.Abs(a.Y - b.Y) < DBL_EqualOffset) { return(a.Z.CompareTo(b.Z)); } return(a.Y.CompareTo(b.Y)); } return(a.X.CompareTo(b.X)); }); // outside builder.AddTriangle(_pts[0], _zeroPosition, _pts[1]); builder.AddTriangle(_pts[3], _zeroPosition, _pts[2]); builder.AddTriangle(_pts[2], _zeroPosition, _pts[0]); builder.AddTriangle(_pts[1], _zeroPosition, _pts[3]); this.Material = this.outsideMat; this.BackMaterial = this.insideMat; return(builder.ToMesh()); }
private static ModelVisual3D Planar(IFeature basePath) { TongJi.Geometry.Polyline curve = new TongJi.Geometry.Polyline(basePath.GeoData); if (curve.AlgebraicArea < 0) { curve = curve.ReversePoints(); } var points = curve.Points.ToList(); if (points.Last() == points.First()) { points.RemoveAt(points.Count - 1); } var triangles = DelaunayOfPolygon(points); MeshBuilder mb = new MeshBuilder(); foreach (var tri in triangles) { var a = new Point3D(tri.A.x, tri.A.y, 0); var b = new Point3D(tri.B.x, tri.B.y, 0); var c = new Point3D(tri.C.x, tri.C.y, 0); mb.AddTriangle(a, b, c); } ModelVisual3D visual = new ModelVisual3D(); visual.Content = new GeometryModel3D(mb.ToMesh(), MaterialHelper.CreateMaterial(Colors.Blue)); return(visual); }
public MainWindow() { InitializeComponent(); var material = MaterialHelper.CreateMaterial(Colors.Aqua); var builder = new MeshBuilder(); builder.AddTriangle(new Point3D(0, 0, 0), new Point3D(0, 10, 100), new Point3D(100, 0, 0)); var mesh = builder.ToMesh(); var geo = new GeometryModel3D { Geometry = mesh, Material = material , Transform = null}; var model = new ModelVisual3D { Content = geo, Transform = null }; _visual.Children.Add(model); }
public PartMesh(string filename) { var meshBuilder = new MeshBuilder(false, false); var min = new Point3D(double.PositiveInfinity, double.PositiveInfinity, double.PositiveInfinity); var max = new Point3D(double.NegativeInfinity, double.NegativeInfinity, double.NegativeInfinity); using (var stream = modelAssembly.GetManifestResourceStream("Hexenstein.Models." + filename)) using (var reader = new BinaryReader(stream)) { var header = reader.ReadBytes(80); var num = reader.ReadUInt32(); for (int i = 0; i < num; i++) { var normal = ReadPoint(reader); var v1 = ReadPoint(reader); var v2 = ReadPoint(reader); var v3 = ReadPoint(reader); var extra = reader.ReadInt16(); meshBuilder.AddTriangle(v1, v2, v3); min = new Point3D( Math.Min(Math.Min(Math.Min(min.X, v1.X), v2.X), v3.X), Math.Min(Math.Min(Math.Min(min.Y, v1.Y), v2.Y), v3.Y), Math.Min(Math.Min(Math.Min(min.Z, v1.Z), v2.Z), v3.Z)); max = new Point3D( Math.Max(Math.Max(Math.Max(max.X, v1.X), v2.X), v3.X), Math.Max(Math.Max(Math.Max(max.Y, v1.Y), v2.Y), v3.Y), Math.Max(Math.Max(Math.Max(max.Z, v1.Z), v2.Z), v3.Z)); } } Centre = ((max - min) / 2 + min); Mesh = meshBuilder.ToMesh(true); }
private void Button_Click(object sender, RoutedEventArgs e) { var ofd = new OpenFileDialog(); ofd.FileOk += (_, __) => { var file = ofd.FileName; Result r; using (var fs = File.OpenRead(file)) r = ProtoBuf.Serializer.Deserialize<Result>(fs); _model.Children.Clear(); var nLines = r.Elements.SelectMany(x => x.Geometries).Select(g => r.Geometries[g.GeometryIndex]).Select(x => ((TriangulatedGeometryData)x).Lines.Length).Sum(); var nTriangles = r.Elements.SelectMany(x => x.Geometries).Select(g => r.Geometries[g.GeometryIndex]).Select(x => ((TriangulatedGeometryData)x).Triangles.Length).Sum(); Debug.WriteLine($"Model contains {nLines} Lines and {nTriangles} Triangles"); var material = MaterialHelper.CreateMaterial(Colors.Red, 1); foreach (var ele in r.Elements) { foreach (var geoRef in ele.Geometries) { var geo = r.Geometries[geoRef.GeometryIndex]; var triangulated = geo as TriangulatedGeometryData; if (triangulated != null) { var builder = new MeshBuilder(true, false); foreach (var t in triangulated.Triangles) { var a = r.PointsAndVectors[t.A].ToWpfPoint(); var b = r.PointsAndVectors[t.B].ToWpfPoint(); var c = r.PointsAndVectors[t.C].ToWpfPoint(); builder.AddTriangle(a, c, b); } var mesh = builder.ToMesh(true); var geoModel = new GeometryModel3D { Geometry = mesh, Material = material }; Transform3D matrix = null; if (geoRef.Transform != null) { matrix = new MatrixTransform3D(MatrixHelper.FromArray(geoRef.Transform.Matrix)); geoModel.Transform = matrix; } var modelVisual = new ModelVisual3D { Content = geoModel }; if (_lines.IsChecked == true) { foreach (var l in triangulated.Lines) { var a = r.PointsAndVectors[l.A].ToWpfPoint(); var b = r.PointsAndVectors[l.B].ToWpfPoint(); var lineGeo = new LinesVisual3D { Color = Colors.Green, Points = new[] { a, b } }; if (matrix != null) lineGeo.Transform = matrix; modelVisual.Children.Add(lineGeo); } } _model.Children.Add(modelVisual); } else { throw new Exception("unknown geo data: " + geo.GetType()); } } } _viewPort.ZoomExtents(500); }; ofd.ShowDialog(); }
public List<MeshIdandGeometry> VisualizeBimPlusDataAsGenericElements(List<GenericElement> baseElements, object sender) { if (InputPorts[0].Data == null) return null; var max = baseElements.Count; var m_i = 1; // Init some lists and containers var container = new ContainerUIElement3D(); var geometry = new List<MeshIdandGeometry>(); // Init the MeshBuilde var meshBuilder = new MeshBuilder(false, false); // Loop the items of each list foreach (var item in baseElements) { // Get the geometric data from the AttributeGroups var points = item.AttributeGroups["geometry"].Attributes["threejspoints"] as IList<Point3D>; var triangleindices = item.AttributeGroups["geometry"].Attributes["geometryindices"]; var indices = (from index in triangleindices as IList<uint> select Convert.ToInt32(index)).ToList(); for (var i = 0; i < indices.Count; i++) { if (indices[i] == 0) { meshBuilder.AddTriangle(points[indices[i + 1]], points[indices[i + 2]], points[indices[i + 3]]); i = i + 3; } else if (indices[i] == 1) { meshBuilder.AddQuad(points[indices[i + 1]], points[indices[i + 2]], points[indices[i + 3]], points[indices[i + 4]]); i = i + 4; } } // Get the color of each representation group var color = Convert.ToInt64(item.AttributeGroups["geometry"].Attributes["color"]); var tempcolor = Color.FromArgb((int)color); var col = new System.Windows.Media.Color { A = tempcolor.A, G = tempcolor.G, R = tempcolor.R, B = tempcolor.B }; var myGeometryModel = new GeometryModel3D { Material = new DiffuseMaterial(new SolidColorBrush(col)), BackMaterial = new DiffuseMaterial(new SolidColorBrush(col)), Geometry = meshBuilder.ToMesh(true), Transform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 0, 0), 90)) }; myGeometryModel.Freeze(); var meshAndId = new MeshIdandGeometry { Id = item.Id, Model3D = myGeometryModel, Material = myGeometryModel.Material }; geometry.Add(meshAndId); // Save the parsed information in the elements attribute group item.AttributeGroups["geometry"].Attributes["parsedGeometry"] = meshAndId; // Refresh the builder so that we do not duplicate the meshes meshBuilder = new MeshBuilder(false, false); m_i++; var progressPercentage = Convert.ToInt32(((double)m_i / max) * 100); var backgroundWorker = sender as BackgroundWorker; backgroundWorker?.ReportProgress(progressPercentage, item.Id); } container.Children.Clear(); return geometry; }
public MeshGeometry3D MeshObject(DtObject item, MeshBuilder meshBuilder) { var points = item.AttributeGroups["geometry"].GetProperty("threejspoints") as List<Point3D>; var indices = item.AttributeGroups["geometry"].GetProperty("geometryindices") as List<uint>; if (indices == null) return null; for (var i = 0; i < indices.Count; i++) { switch (indices[i]) { case 0: meshBuilder.AddTriangle(points[(int)indices[i + 1]], points[(int)indices[i + 2]], points[(int)indices[i + 3]]); i = i + 3; break; case 1: meshBuilder.AddQuad(points[(int)indices[i + 1]], points[(int)indices[i + 2]], points[(int)indices[i + 3]], points[(int)indices[i + 4]]); i = i + 4; break; } } return meshBuilder.ToMesh(true); }
/// <summary> /// Cuts the mesh with the specified plane. /// </summary> /// <param name="mesh"> /// The mesh. /// </param> /// <param name="p"> /// The plane origin. /// </param> /// <param name="n"> /// The plane normal. /// </param> /// <returns> /// The <see cref="MeshGeometry3D"/>. /// </returns> public static MeshGeometry3D Cut(MeshGeometry3D mesh, Point3D p, Vector3D n) { var ch = new ContourHelper(p, n); var mb = new MeshBuilder(false, false); //foreach (var pos in mesh.Positions) //{ //mb.Positions.Add(pos); //} int j = mb.Positions.Count; for (int i = 0; i < mesh.TriangleIndices.Count; i += 3) { int i0 = mesh.TriangleIndices[i]; int i1 = mesh.TriangleIndices[i + 1]; int i2 = mesh.TriangleIndices[i + 2]; var p0 = mesh.Positions[i0]; var p1 = mesh.Positions[i1]; var p2 = mesh.Positions[i2]; Point3D s0, s1; int r = ch.ContourFacet(p0, p1, p2, out s0, out s1); switch (r) { case -1: //mb.TriangleIndices.Add(i0); //mb.TriangleIndices.Add(i1); //mb.TriangleIndices.Add(i2); mb.AddTriangle(p0, p1, p2); break; case 0: //mb.Positions.Add(s1); //mb.Positions.Add(s0); //mb.TriangleIndices.Add(i0); //mb.TriangleIndices.Add(j++); //mb.TriangleIndices.Add(j++); mb.AddTriangle(p0, s1, s0); break; case 1: //mb.Positions.Add(s0); //mb.Positions.Add(s1); //mb.TriangleIndices.Add(i1); //mb.TriangleIndices.Add(j++); //mb.TriangleIndices.Add(j++); mb.AddTriangle(p1, s0, s1); break; case 2: //mb.Positions.Add(s0); //mb.Positions.Add(s1); //mb.TriangleIndices.Add(i2); //mb.TriangleIndices.Add(j++); //mb.TriangleIndices.Add(j++); mb.AddTriangle(p2, s0, s1); break; case 10: //mb.Positions.Add(s0); //mb.Positions.Add(s1); //mb.TriangleIndices.Add(i1); //mb.TriangleIndices.Add(i2); //mb.TriangleIndices.Add(j); //mb.TriangleIndices.Add(j++); //mb.TriangleIndices.Add(j++); //mb.TriangleIndices.Add(i1); mb.AddTriangle(p1, p2, s0); mb.AddTriangle(s0, s1, p1); break; case 11: //mb.Positions.Add(s1); //mb.Positions.Add(s0); //mb.TriangleIndices.Add(i2); //mb.TriangleIndices.Add(i0); //mb.TriangleIndices.Add(j); //mb.TriangleIndices.Add(j++); //mb.TriangleIndices.Add(j++); //mb.TriangleIndices.Add(i2); mb.AddTriangle(p2, p0, s1); mb.AddTriangle(s1, s0, p2); break; case 12: //mb.Positions.Add(s1); //mb.Positions.Add(s0); //mb.TriangleIndices.Add(i0); //mb.TriangleIndices.Add(i1); //mb.TriangleIndices.Add(j); //mb.TriangleIndices.Add(j++); //mb.TriangleIndices.Add(j++); //mb.TriangleIndices.Add(i0); mb.AddTriangle(p0, p1, s1); mb.AddTriangle(s1, s0, p0); break; } } return mb.ToMesh(); }