// 投影 private Point usingProject(thPoint pjtPoi) { int xp, yp;//viewtPoi:视点坐标或者平行投影的方向 try { if (viewtPoi.Z == pjtPoi.Z) { pjtPoi.Z = pjtPoi.Z - 1; } //参考了课本58页的式子 if (projWay == 0) //透视投影 { xp = Convert.ToInt32(viewtPoi.X + (pjtPoi.X - viewtPoi.X) * viewtPoi.Z / (viewtPoi.Z - pjtPoi.Z + 0.0)); yp = Convert.ToInt32(viewtPoi.Y + (pjtPoi.Y - viewtPoi.Y) * viewtPoi.Z / (viewtPoi.Z - pjtPoi.Z + 0.0)); //double xd = viewtPoi.X + (pjtPoi.X - viewtPoi.X) * viewtPoi.Z / (viewtPoi.Z- pjtPoi.Z + 0.0);//double yd = viewtPoi.Y+ (pjtPoi.Y - viewtPoi.Y) * viewtPoi.Z/ (viewtPoi.Z- pjtPoi.Z + 0.0); return(new Point(xp, yp)); } else if (projWay == 1) //平行投影 { xp = Convert.ToInt32(pjtPoi.X - pjtPoi.Z * viewtPoi.X / (viewtPoi.Z + 0.0)); yp = Convert.ToInt32(pjtPoi.Y - pjtPoi.Z * viewtPoi.Y / (viewtPoi.Z + 0.0)); return(new Point(xp, yp)); } else { MessageBox.Show("投影方式有错"); return(new Point(0, 0)); } }catch (Exception ecp) { MessageBox.Show(ecp.ToString()); return(new Point(0, 0)); } }
//旋转;传入三维点,传出三维点 之后考虑float private thPoint rotateOnce(thPoint iput) // rotate y { int alpha = stepLen; //参考课本52页 关于y轴旋转的式子 int outPox = Convert.ToInt32(iput.X * Math.Cos(alpha / 180.0 * Math.PI) + iput.Z * Math.Sin(alpha / 180.0 * Math.PI)); int outPoz = Convert.ToInt32(-iput.X * Math.Sin(alpha / 180.0 * Math.PI) + iput.Z * Math.Cos(alpha / 180.0 * Math.PI)); //将Math.Cos(alpha / 180.0 * Math.PI)用全局变量记录,在传入步长变化时再算可以减少计算量 //旋转部分可以由点进行迭代,有一定误差,也可以递增alpha,后者计算量更大, return(new thPoint(outPox, iput.Y, outPoz)); }
//对点序列进行旋转,画出旋转后的边,并传出旋转后的点 private thPoint[] rotateDmrCub(thPoint[] dcLst) { thPoint[] rdcLst = new thPoint[8]; for (int i = 0; i < 8; i++) { rdcLst[i] = rotateOnce(dcLst[i]); } dimPlst = projOnebyOne(rdcLst);//降维后的点序列 return(rdcLst); }
private void projZForm_Load(object sender, EventArgs e) { g = CreateGraphics(); Matrix mat = new Matrix(1, 0, 0, -1, 0, 0);//沿X轴翻转 g.Transform = mat; g.TranslateTransform(300, -260); //初始化一些默认值 viewtPoi = new thPoint(200, 200, 200); deftPoi = new thPoint(20, 30, 40); deftCube = new Cube(new thPoint(20, 30, 40), 80, 50, 40); rtList = deftCube.PoiList; }