public cg_lr3() { InitializeComponent(); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); OldTransVals = new PointF3D(); TransVals = new PointF3D(); ScalVal = OldScalVal = 1; XRotValue = ZRotValue = YRotValue = OldXRotValue = OldYRotValue = OldZRotValue = 0; // Lower pentagon PointF3D LowerP1 = new PointF3D(1, 0, 0); PointF3D LowerP2 = new PointF3D(0, 0, 3); PointF3D LowerP3 = new PointF3D(2.5f, 0, 4.8f); PointF3D LowerP4 = new PointF3D(5, 0, 3); PointF3D LowerP5 = new PointF3D(4, 0, 0); // Upper pentagon PointF3D UpperP1 = new PointF3D(1.5f, 5, 1); PointF3D UpperP2 = new PointF3D(1.1f, 5, 2.6f); PointF3D UpperP3 = new PointF3D(2.5f, 5, 3.9f); PointF3D UpperP4 = new PointF3D(4.1f, 5, 2.6f); PointF3D UpperP5 = new PointF3D(3.5f, 5, 1f); InitObj = new Polygon3D[] //pyramid { // lower pentagon new Polygon3D(new PointF3D[] { LowerP1, LowerP2, LowerP3, LowerP4, LowerP5 }), // lines connecting the pentagons new Polygon3D(new PointF3D[] { LowerP1, UpperP1 }), new Polygon3D(new PointF3D[] { LowerP2, UpperP2 }), new Polygon3D(new PointF3D[] { LowerP3, UpperP3 }), new Polygon3D(new PointF3D[] { LowerP4, UpperP4 }), new Polygon3D(new PointF3D[] { LowerP5, UpperP5 }), //upper pentagon new Polygon3D(new PointF3D[] { UpperP1, UpperP2, UpperP3, UpperP4, UpperP5 }) }; obj = (Polygon3D[])InitObj.Clone(); InitObjCentre = new PointF3D(2, 2, 2); objCentre = InitObjCentre; InitCntrlPoints = new PointF3D[4, 4] { { new PointF3D(0, 0, 0), new PointF3D(1, 0, 0), new PointF3D(2, 0, 0), new PointF3D(3, 0, 0) }, { new PointF3D(0, 0, 1), new PointF3D(1, 0, 1), new PointF3D(2, 0, 1), new PointF3D(3, 0, 1) }, { new PointF3D(0, 0, 2), new PointF3D(1, 0, 2), new PointF3D(2, 0, 2), new PointF3D(3, 0, 2) }, { new PointF3D(0, 0, 3), new PointF3D(1, 0, 3), new PointF3D(2, 0, 3), new PointF3D(3, 0, 3) } }; bs = new BezierSurface(InitCntrlPoints, 0.2); InitSurfCentre = new PointF3D(1.5f, 0, 1.5f); SurfCentre = InitSurfCentre; RedactCPIndex = new Point(-1, -1); DefaultTransformVals(); PointF[] ProjectedDimAxes = Affinity3D.ProjectDimetric(CoordinateLines); PointF[] ProjectedXYAxes = Affinity3D.ProjectToXY(CoordinateLines); PointF[] ProjectedYZAxes = Affinity3D.ProjectToYZ(CoordinateLines); PointF[] ProjectedZXAxes = Affinity3D.ProjectToZX(CoordinateLines); NormalisedDimetricAxes = new Point[ProjectedDimAxes.Length]; NormalisedXYAxes = new Point[ProjectedXYAxes.Length]; NormalisedYZAxes = new Point[ProjectedYZAxes.Length]; NormalisedZXAxes = new Point[ProjectedZXAxes.Length]; for (int i = 0; i < CoordinateLines.Length; i++) { NormalisedDimetricAxes[i].X = Normalisation.NormaliseX(ProjectedDimAxes[i].X, DimetricMinBorder, DimetricMaxBorder, paneldimetric.Width); NormalisedDimetricAxes[i].Y = Normalisation.NormaliseY(ProjectedDimAxes[i].Y, DimetricMinBorder, DimetricMaxBorder, paneldimetric.Height); NormalisedXYAxes[i].X = Normalisation.NormaliseX(ProjectedXYAxes[i].X, SideProjMinBorder, SideProjMaxBorder, panelxy.Width); NormalisedXYAxes[i].Y = Normalisation.NormaliseY(ProjectedXYAxes[i].Y, SideProjMinBorder, SideProjMaxBorder, panelxy.Height); NormalisedYZAxes[i].X = Normalisation.NormaliseX(ProjectedYZAxes[i].X, SideProjMinBorder, SideProjMaxBorder, panelyz.Width); NormalisedYZAxes[i].Y = Normalisation.NormaliseY(ProjectedYZAxes[i].Y, SideProjMinBorder, SideProjMaxBorder, panelyz.Height); NormalisedZXAxes[i].X = Normalisation.NormaliseX(ProjectedZXAxes[i].X, SideProjMinBorder, SideProjMaxBorder, panelzx.Width); NormalisedZXAxes[i].Y = Normalisation.NormaliseY(ProjectedZXAxes[i].Y, SideProjMinBorder, SideProjMaxBorder, panelzx.Height); } }
/// <summary> /// Draws Bezier surface to the Graphics object. /// </summary> /// <param name="g">0 - dimetric, 1 - xy, 2 - yz, 3 - zx</param> private void DrawSurface(Graphics g, int drawTo) { int PointCount = bs.DrawPoints.GetLength(0); PointF3D[] Surfpoints = new PointF3D[PointCount * PointCount]; PointF[] prSurfPoints; Point[] nPrSurfPoints = new Point[Surfpoints.Length]; switch (drawTo) { case 0: prSurfPoints = bs.ProjectDimetric(); for (int i = 0; i < nPrSurfPoints.Length; i++) { nPrSurfPoints[i].X = Normalisation.NormaliseX(prSurfPoints[i].X, DimetricMinBorder, DimetricMaxBorder, paneldimetric.Width); nPrSurfPoints[i].Y = Normalisation.NormaliseY(prSurfPoints[i].Y, DimetricMinBorder, DimetricMaxBorder, paneldimetric.Height); } break; case 1: prSurfPoints = bs.ProjectXY(); for (int i = 0; i < nPrSurfPoints.Length; i++) { nPrSurfPoints[i].X = Normalisation.NormaliseX(prSurfPoints[i].X, SideProjMinBorder, SideProjMaxBorder, panelxy.Width); nPrSurfPoints[i].Y = Normalisation.NormaliseY(prSurfPoints[i].Y, SideProjMinBorder, SideProjMaxBorder, panelxy.Height); } break; case 2: prSurfPoints = bs.ProjectYZ(); for (int i = 0; i < nPrSurfPoints.Length; i++) { nPrSurfPoints[i].X = Normalisation.NormaliseX(prSurfPoints[i].X, SideProjMinBorder, SideProjMaxBorder, panelyz.Width); nPrSurfPoints[i].Y = Normalisation.NormaliseY(prSurfPoints[i].Y, SideProjMinBorder, SideProjMaxBorder, panelyz.Height); } break; case 3: prSurfPoints = bs.ProjectZX(); for (int i = 0; i < nPrSurfPoints.Length; i++) { nPrSurfPoints[i].X = Normalisation.NormaliseX(prSurfPoints[i].X, SideProjMinBorder, SideProjMaxBorder, panelzx.Width); nPrSurfPoints[i].Y = Normalisation.NormaliseY(prSurfPoints[i].Y, SideProjMinBorder, SideProjMaxBorder, panelzx.Height); } break; } Point[,] nPrSP2Dim = new Point[PointCount, PointCount]; for (int r = 0; r < PointCount; r++) { for (int c = 0; c < PointCount; c++) { nPrSP2Dim[r, c] = nPrSurfPoints[r * PointCount + c]; } } Pen pen = new Pen(Color.Red); for (int r = 0; r < PointCount - 1; r++) { for (int c = 0; c < PointCount - 1; c++) { g.DrawLine(pen, nPrSP2Dim[r, c], nPrSP2Dim[r, c + 1]); g.DrawLine(pen, nPrSP2Dim[r, c], nPrSP2Dim[r + 1, c]); } } for (int i = 0; i < PointCount - 1; i++) { g.DrawLine(pen, nPrSP2Dim[i, PointCount - 1], nPrSP2Dim[i + 1, PointCount - 1]); g.DrawLine(pen, nPrSP2Dim[PointCount - 1, i], nPrSP2Dim[PointCount - 1, i + 1]); } if (checkBox1.Checked) { PointF cp = new Point(); SolidBrush brush = new SolidBrush(Color.Black); int circleRad = 3; for (int r = 0; r < 4; r++) { for (int c = 0; c < 4; c++) { cp = Affinity3D.ProjectDimetric(new PointF3D[] { bs.ControlPoints[r, c] })[0]; cp.X = Normalisation.NormaliseX(cp.X, DimetricMinBorder, DimetricMaxBorder, paneldimetric.Width); cp.Y = Normalisation.NormaliseY(cp.Y, DimetricMinBorder, DimetricMaxBorder, paneldimetric.Height); g.FillEllipse(brush, cp.X - circleRad, cp.Y - circleRad, circleRad * 2, circleRad * 2); g.DrawString("P" + (r + 1) + (c + 1), Font, brush, cp); } } } }