AddTriangle() public method

Adds a triangle.
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();
 }
示例#2
0
        //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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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();
        }