コード例 #1
0
        // selection
        public override void Select(ViewportRect rect, TransformMatrix matrix, Viewport3D viewport3d)
        {
            int nDotNo = GetDataNo();

            if (nDotNo == 0)
            {
                return;
            }

            double xMin = rect.XMin();
            double xMax = rect.XMax();
            double yMin = rect.YMin();
            double yMax = rect.YMax();

            for (int i = 0; i < nDotNo; i++)
            {
                ScatterPlotItem plotItem = Get(i);
                Point           pt       = matrix.VertexToViewportPt(new Point3D(plotItem.x, plotItem.y, plotItem.z),
                                                                     viewport3d);

                if ((pt.X > xMin) && (pt.X < xMax) && (pt.Y > yMin) && (pt.Y < yMax))
                {
                    m_vertices[i].selected = true;
                }
                else
                {
                    m_vertices[i].selected = false;
                }
            }
        }
コード例 #2
0
        // convert the 3D scatter plot into a array of Mesh3D object
        public ArrayList GetMeshes()
        {
            int nDotNo = GetDataNo();

            if (nDotNo == 0)
            {
                return(null);
            }
            ArrayList meshs = new ArrayList();

            int nVertIndex = 0;

            for (int i = 0; i < nDotNo; i++)
            {
                ScatterPlotItem plotItem = Get(i);
                int             nType    = plotItem.shape % Chart3D.SHAPE_NO;
                float           w        = plotItem.w;
                float           h        = plotItem.h;
                Mesh3D          dot;
                m_vertices[i].nMinI = nVertIndex;
                switch (nType)
                {
                case (int)SHAPE.BAR:
                    dot = new Bar3D(0, 0, 0, w, w, h);
                    break;

                case (int)SHAPE.CONE:
                    dot = new Cone3D(w, w, h, 7);
                    break;

                case (int)SHAPE.CYLINDER:
                    dot = new Cylinder3D(w, w, h, 7);
                    break;

                case (int)SHAPE.ELLIPSE:
                    dot = new Ellipse3D(w, w, h, 7);
                    break;

                case (int)SHAPE.PYRAMID:
                    dot = new Pyramid3D(w, w, h);
                    break;

                default:
                    dot = new Bar3D(0, 0, 0, w, w, h);
                    break;
                }
                nVertIndex         += dot.GetVertexNo();
                m_vertices[i].nMaxI = nVertIndex - 1;

                TransformMatrix.Transform(dot, new Point3D(plotItem.x, plotItem.y, plotItem.z), 0, 0);
                dot.SetColor(plotItem.color);
                meshs.Add(dot);
            }
            AddAxesMeshes(meshs);

            return(meshs);
        }
コード例 #3
0
        // function for set a scatter plot, every dot is just a simple pyramid.
        public void BuildGrid(SHAPE shape = SHAPE.CYLINDER)
        {
            int nElem_x = Int32.Parse(dataNo_x.Text);
            int nElem_y = Int32.Parse(dataNo_y.Text);
            int nElem_z = Int32.Parse(dataNo_z.Text);

            if ((nElem_x <= 0) || (nElem_y <= 0) || (nElem_z <= 0))
            {
                MessageBox.Show("Add at least 1 point to each axis");
                return;
            }
            if ((nElem_x > 10000) || (nElem_y > 10000) || (nElem_z > 10000))
            {
                MessageBox.Show("Too many elements");
                return;
            }

            long bas_x = Int64.Parse(basis_x.Text);
            long bas_y = Int64.Parse(basis_y.Text);
            long bas_z = Int64.Parse(basis_z.Text);

            // 1. set the scatter plot size
            m_3dChart = new ScatterChart3D();
            m_3dChart.SetDataNo(nElem_x * nElem_y * nElem_z);

            // 2. set the properties of each dot
            Random randomObject = new Random();
            int    nDataRange   = 200;

            for (int i = 0; i < nElem_x; i++)
            {
                for (int j = 0; j < nElem_y; j++)
                {
                    for (int k = 0; k < nElem_z; k++)
                    {
                        ScatterPlotItem plotItem = new ScatterPlotItem();

                        plotItem.w = 2;
                        plotItem.h = 2;

                        plotItem.x = (float)i * bas_x * m_nscale_factor;
                        plotItem.y = (float)j * bas_y * m_nscale_factor;
                        plotItem.z = (float)k * bas_z * m_nscale_factor;

                        plotItem.shape = (int)shape;

                        Byte nR = (Byte)randomObject.Next(256);
                        Byte nG = (Byte)randomObject.Next(256);
                        Byte nB = (Byte)randomObject.Next(256);

                        plotItem.color = Color.FromRgb(nR, nG, nB);

                        // convert [,,] -> []
                        //x + WIDTH * (y + DEPTH * z)
                        ((ScatterChart3D)m_3dChart).SetVertex(i + nElem_x * (j + nElem_y * k), plotItem);
                    }
                }
            }

            // 3. set axes
            m_3dChart.GetDataRange();
            m_3dChart.SetAxes();

            // 4. Get Mesh3D array from scatter plot
            ArrayList meshs = ((ScatterChart3D)m_3dChart).GetMeshes();

            // 5. display vertex no and triangle no.
            UpdateModelSizeInfo(meshs);

            // 6. show 3D scatter plot in Viewport3d
            GridExplorer.Model3D model3d = new GridExplorer.Model3D();
            m_nChartModelIndex = model3d.UpdateModel(meshs, null, m_nChartModelIndex, this.mainViewport);

            // 7. set projection matrix
            float viewRange = (float)nDataRange;

            m_transformMatrix.CalculateProjectionMatrix(0, viewRange, 0, viewRange, 0, viewRange, 0.5);
            TransformChart();
        }