Пример #1
0
        private MeshGeometry3D BuildCropModelGeo(ICropBox cropBox)
        {
            MeshGeometry3D geo = new MeshGeometry3D();

            var hashPoint = new Dictionary <Model.Point3D, int>();

            var z0tl = new Model.Point3D(cropBox.XL, cropBox.YL, cropBox.ZL);
            var z0tr = new Model.Point3D(cropBox.XR, cropBox.YL, cropBox.ZL);
            var z0bl = new Model.Point3D(cropBox.XL, cropBox.YR, cropBox.ZL);
            var z0br = new Model.Point3D(cropBox.XR, cropBox.YR, cropBox.ZL);

            var z1tl = new Model.Point3D(cropBox.XL, cropBox.YL, cropBox.ZR);
            var z1tr = new Model.Point3D(cropBox.XR, cropBox.YL, cropBox.ZR);
            var z1bl = new Model.Point3D(cropBox.XL, cropBox.YR, cropBox.ZR);
            var z1br = new Model.Point3D(cropBox.XR, cropBox.YR, cropBox.ZR);

            BuildPlane(geo, hashPoint, z0tl, z0tr, z0br, z0bl); //front
            BuildPlane(geo, hashPoint, z0tr, z1tr, z1br, z0br); //right
            BuildPlane(geo, hashPoint, z1tl, z0tl, z0bl, z1bl); //left
            BuildPlane(geo, hashPoint, z1tr, z1tl, z1bl, z1br); //back
            BuildPlane(geo, hashPoint, z1tl, z1tr, z0tr, z0tl); //top
            BuildPlane(geo, hashPoint, z0bl, z0br, z1br, z1bl); //bottom

            foreach (var source in hashPoint.OrderBy(pair => pair.Value))
            {
                SafeAddPoint(geo, new Point3D(source.Key.X, source.Key.Y, source.Key.Z));
            }

            return(geo);
        }
Пример #2
0
        private static int AddPoint(Dictionary <Model.Point3D, int> points, Model.Point3D point)
        {
            int ndx;

            if (points.TryGetValue(point, out ndx))
            {
                return(ndx);
            }

            points.Add(point, points.Count);
            return(points.Count - 1);
        }
Пример #3
0
        private void AddRandomPolyToMesh(MeshGeometry3D mesh, Model.Point3D center, double size)
        {
            int offset = mesh.Positions.Count;

            if (++_randomPolyCounter > 3)
            {
                _randomPolyCounter = 0;
            }

            Point3D p1, p2, p3;

            switch (_randomPolyCounter)
            {
            case 0:
                p1 = new Point3D(center.X, center.Y, center.Z);
                p2 = new Point3D(center.X + size, center.Y, center.Z);
                p3 = new Point3D(center.X, center.Y + size, center.Z);
                break;

            case 1:
                p1 = new Point3D(center.X, center.Y, center.Z);
                p2 = new Point3D(center.X, center.Y, center.Z + size);
                p3 = new Point3D(center.X + size, center.Y, center.Z);
                break;

            case 2:
                p1 = new Point3D(center.X, center.Y, center.Z);
                p2 = new Point3D(center.X, center.Y + size, center.Z);
                p3 = new Point3D(center.X, center.Y, center.Z + size);
                break;

            case 3:
                p1 = new Point3D(center.X + size, center.Y, center.Z);
                p2 = new Point3D(center.X, center.Y, center.Z + size);
                p3 = new Point3D(center.X, center.Y + size, center.Z);
                break;

            default:
                return;
            }

            SafeAddPoint(mesh, p1);
            SafeAddPoint(mesh, p2);
            SafeAddPoint(mesh, p3);

            mesh.TriangleIndices.Add(offset + 0);
            mesh.TriangleIndices.Add(offset + 1);
            mesh.TriangleIndices.Add(offset + 2);
        }
Пример #4
0
        private void BuildEndPlanes(MeshGeometry3D geo, Dictionary <Model.Point3D, int> hashPoint, List <Model.Point3D> points, bool counter)
        {
            if (points.Count < 3)
            {
                return;
            }

            var center = new Model.Point3D();

            var ndx = new List <int>();

            foreach (var point3D in points)
            {
                ndx.Add(AddPoint(hashPoint, point3D));

                center.X += point3D.X;
                center.Y += point3D.Y;
                center.Z += point3D.Z;
            }

            ndx.Add(AddPoint(hashPoint, points.First()));

            center.X /= points.Count;
            center.Y /= points.Count;
            center.Z /= points.Count;

            var centerNdx = AddPoint(hashPoint, center);

            for (var i = 0; i < points.Count; i++)
            {
                if (counter)
                {
                    geo.TriangleIndices.Add(ndx[i + 1]);
                    geo.TriangleIndices.Add(ndx[i]);
                    geo.TriangleIndices.Add(centerNdx);
                }
                else
                {
                    geo.TriangleIndices.Add(centerNdx);
                    geo.TriangleIndices.Add(ndx[i]);
                    geo.TriangleIndices.Add(ndx[i + 1]);
                }
            }
        }
Пример #5
0
        private void AddTriangle(MeshGeometry3D geo, Dictionary <Model.Point3D, int> hashPoint, Model.Point3D p1, Model.Point3D p2, Model.Point3D p3)
        {
            var ndx1 = AddPoint(hashPoint, p1);
            var ndx2 = AddPoint(hashPoint, p2);
            var ndx3 = AddPoint(hashPoint, p3);

            geo.TriangleIndices.Add(ndx1);
            geo.TriangleIndices.Add(ndx2);
            geo.TriangleIndices.Add(ndx3);
        }
Пример #6
0
 private void BuildPlane(MeshGeometry3D geo, Dictionary <Model.Point3D, int> hashPoint, Model.Point3D p1,
                         Model.Point3D p2, Model.Point3D p3, Model.Point3D p4)
 {
     AddTriangle(geo, hashPoint, p1, p2, p3);
     AddTriangle(geo, hashPoint, p3, p4, p1);
 }