// 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; } } }
// 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); }
// 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(); }