Scale() 공개 메소드

Scales the positions (and normal vectors).
public Scale ( double scaleX, double scaleY, double scaleZ ) : void
scaleX double /// The X scale factor. ///
scaleY double /// The Y scale factor. ///
scaleZ double /// The Z scale factor. ///
리턴 void
        private Model3D CreateModel()
        {
           // if (Points ==null)

            var plotModel = new Model3DGroup();

            int rows = Points.GetUpperBound(0) + 1;
            int columns = Points.GetUpperBound(1) + 1;
            double minX = double.MaxValue;
            double maxX = double.MinValue;
            double minY = double.MaxValue;
            double maxY = double.MinValue;
            double minZ = double.MaxValue;
            double maxZ = double.MinValue;
            //double RealminX = double.MaxValue;
            //double RealmaxX = double.MinValue;
            //double RealminY = double.MaxValue;
            //double RealmaxY = double.MinValue;
            //double RealminZ = double.MaxValue;
            //double RealmaxZ = double.MinValue;

        
            #region Color things
            double minColorValue = double.MaxValue;
            double maxColorValue = double.MinValue;


            for (int i = 0; i < rows; i++)
                for (int j = 0; j < columns; j++)
                {
                    double x = Points[i, j].X;
                    double y = Points[i, j].Y;
                    double z = Points[i, j].Z;
                    maxX = Math.Max(maxX, x);
                    maxY = Math.Max(maxY, y);
                    maxZ = Math.Max(maxZ, z);
                    minX = Math.Min(minX, x);
                    minY = Math.Min(minY, y);
                    minZ = Math.Min(minZ, z);
                    if (ColorValues != null)
                    {
                        maxColorValue = Math.Max(maxColorValue, ColorValues[i, j]);
                        minColorValue = Math.Min(minColorValue, ColorValues[i, j]);
                    }
                }

            // make color value 0 at texture coordinate 0.5
            if (Math.Abs(minColorValue) < Math.Abs(maxColorValue))
                minColorValue = -maxColorValue;
            else
                maxColorValue = -minColorValue;

            #endregion

            // set the texture coordinates by z-value or ColorValue
            var texcoords = new Point[rows,columns];
            if (OriginalData == null || ColorCoding != ComplexPlainVisualizer.ColorCoding.Custom)
            {
                for (int i = 0; i < rows; i++)
                    for (int j = 0; j < columns; j++)
                    {

                        double u = (Points[i, j].Z - minZ) / (maxZ - minZ);
                        //double v = 
                        if (ColorValues != null)
                            u = (ColorValues[i, j] - minColorValue) / (maxColorValue - minColorValue);
                        texcoords[i, j] = new Point(u, u);
                    }
            }
            else
            {
                for (int i = 0; i < rows; i++)
                    for (int j = 0; j < columns; j++)
                    {
                        double u = MathUtil.Scale(minZ, maxZ, Math.Log10(OriginalData[i, j].Z), 0.5);
                        double v = OriginalData[i, j].W;
                        double uu = 0.5 + u * Math.Cos(v);
                        double vv = 0.5 + u * Math.Sin(v);
                        texcoords[i, j] = new Point(uu, vv);
                    }
            }

            if (AutoScale)
            {
                ScaleX =10 / Math.Abs(maxX - minX);
                ScaleY =10/ Math.Abs(maxY - minY);
                ScaleZ =5 / Math.Abs(maxZ - minZ);
            }

            var surfaceMeshBuilder = new MeshBuilder();
            surfaceMeshBuilder.AddRectangularMesh(Points, texcoords);
            surfaceMeshBuilder.Scale(ScaleX, ScaleY, ScaleZ);

            var surfaceModel = new GeometryModel3D(surfaceMeshBuilder.ToMesh(),
                                                   MaterialHelper.CreateMaterial(SurfaceBrush, null, null, 1, 0));
            surfaceModel.BackMaterial = surfaceModel.Material;

 
            //RealmaxX = maxX;
            //RealminX = minX;
            //RealmaxY = maxY;
            //RealminY = minY;
            //RealmaxZ = maxZ;
            //RealminZ = minZ;
            maxX *= ScaleX;
            minX *= ScaleX;
            maxY *= ScaleY;
            minY *= ScaleY;
            maxZ *= ScaleZ;
            minZ *= ScaleZ;

            IntervalX = (maxX - minX) / SubAxisCount;
            IntervalY = (maxY - minY) / SubAxisCount;
            IntervalZ = (maxZ - minZ) / SubAxisCount;
            
            #region eje x

            var axesMeshBuilder = new MeshBuilder();
            for (double x = minX; x <= maxX; x += IntervalX)
            {
                double j = (x - minX)/(maxX - minX)*(columns - 1);
                //var path = new List<Point3D> { new Point3D(x , minY , minZ) };
                var path = new List<Point3D> { new Point3D(x, minY , minZ) };
                for (int i = 0; i < rows; i++)
                {
                    Point3D p = BilinearInterpolation(Points, i, j);
                    p.X *= ScaleX;
                    p.Y *= ScaleY;
                    p.Z *= ScaleZ;
                    path.Add(p);
                }
                path.Add(new Point3D(x, maxY, minZ));

                axesMeshBuilder.AddTube(path, LineThickness, 9, false);
                GeometryModel3D label = TextCreator.CreateTextLabelModel3D(StringUtils.CodeString(x / ScaleX), Brushes.Black, true, FontSize,
                                                                           new Point3D(x, minY - FontSize * 2.5, minZ),
                                                                           new Vector3D(1, 0, 0), new Vector3D(0, 1, 0));
                plotModel.Children.Add(label);
            }

            {
                GeometryModel3D label = TextCreator.CreateTextLabelModel3D("X-axis", Brushes.Black, true, FontSize,
                                                                           new Point3D((minX + maxX)*0.5,
                                                                                       minY - FontSize * 6, minZ),
                                                                           new Vector3D(1, 0, 0), new Vector3D(0, 1, 0));
                plotModel.Children.Add(label);
            }

            #endregion


            #region eje y

            for (double y = minY; y <= maxY; y += IntervalY)
            {
                double i = (y - minY)/(maxY - minY)*(rows - 1);
                var path = new List<Point3D> {new Point3D(minX, y, minZ)};
                for (int j = 0; j < columns; j++)
                {
                    Point3D p = BilinearInterpolation(Points, i, j);
                    p.X *= ScaleX;
                    p.Y *= ScaleY;
                    p.Z *= ScaleZ;
                    path.Add(p);
                }
                path.Add(new Point3D(maxX, y, minZ));

                axesMeshBuilder.AddTube(path, LineThickness, 9, false);
                GeometryModel3D label = TextCreator.CreateTextLabelModel3D(StringUtils.CodeString(y / ScaleY), Brushes.Black, true, FontSize,
                                                                           new Point3D(minX - FontSize * 3, y, minZ),
                                                                           new Vector3D(1, 0, 0), new Vector3D(0, 1, 0));
                plotModel.Children.Add(label);
            }
            {
                GeometryModel3D label = TextCreator.CreateTextLabelModel3D("Y-axis", Brushes.Black, true, FontSize,
                                                                           new Point3D(minX - FontSize * 10,
                                                                                       (minY + maxY) * 0.5, minZ),
                                                                           new Vector3D(0, 1, 0), new Vector3D(-1, 0, 0));
                plotModel.Children.Add(label);
            }

            #endregion




            #region eje z


            double z0 = (int) (minZ/IntervalZ)*IntervalZ;
            for (double z = z0; z <= maxZ + double.Epsilon; z += IntervalZ)
            {
                GeometryModel3D label = TextCreator.CreateTextLabelModel3D(StringUtils.CodeString(z / ScaleZ), Brushes.Black, true, FontSize,
                                                                           new Point3D(minX - FontSize * 3, maxY, z),
                                                                           new Vector3D(1, 0, 0), new Vector3D(0, 0, 1));
                plotModel.Children.Add(label);
            }
            {
                GeometryModel3D label = TextCreator.CreateTextLabelModel3D("Z-axis", Brushes.Black, true, FontSize,
                                                                           new Point3D(minX - FontSize * 10, maxY,
                                                                                       (minZ + maxZ)*0.5),
                                                                           new Vector3D(0, 0, 1), new Vector3D(1, 0, 0));
                plotModel.Children.Add(label);
            }

            #endregion

            var bb = new Rect3D(minX, minY, minZ, maxX - minX, maxY - minY, 0*(maxZ - minZ));
            axesMeshBuilder.AddBoundingBox(bb, LineThickness);

            var axesModel = new GeometryModel3D(axesMeshBuilder.ToMesh(), Materials.Black);

            plotModel.Children.Add(surfaceModel);
            plotModel.Children.Add(axesModel);

            return plotModel;
        }
예제 #2
0
 /// <summary>
 /// The tessellate.
 /// </summary>
 /// <returns>The mesh.</returns>
 protected override MeshGeometry3D Tessellate()
 {
     var builder = new MeshBuilder(false, true);
     builder.AddSphere(new Point3D(0, 0, 0), 1.0, this.ThetaDiv, this.PhiDiv);
     builder.Scale(this.RadiusX, this.RadiusY, this.RadiusZ);
     return builder.ToMesh();
 }