Example #1
0
        // 投影
        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));
            }
        }
Example #2
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));
        }
Example #3
0
        //对点序列进行旋转,画出旋转后的边,并传出旋转后的点
        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);
        }
Example #4
0
        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;
        }