Chào các bạn! Vì nhiều lý do từ nay Truyen2U chính thức đổi tên là Truyen247.Pro. Mong các bạn tiếp tục ủng hộ truy cập tên miền mới này nhé! Mãi yêu... ♥

code project

namespace chuong7

{

    public partial class Hinhchop : Form

    {

        struct wireframe

        {

            public int numEdges, numVerts;

            public point3D[] vert;

            public int[,] edge;

        }

        struct point3D

        {

            public double x, y, z;

        }

        struct point2D

        {

            public double x, y;

        }

        const float goc = (float)(5 * Math.PI / 180);

        double phi = Math.PI * 30 / 180, teta = Math.PI * 30 / 180;

        //============data =====================

        Bitmap b;

        Graphics bg;

        Pen p;

        Color b1Back, b1Fore;

        // vi tri he toa do

        int Xo, Ho;

        wireframe w;

        void initwireframe(ref wireframe w)

        {

            w.numVerts = 4;

            w.numEdges = 6;

            w.edge = new int[w.numEdges, 2];

            w.vert = new point3D[w.numVerts];

            w.vert[0].x = 0; w.vert[0].y = 0; w.vert[0].z = 0;

            w.vert[1].x = 80; w.vert[1].y = 0; w.vert[1].z = 40;

            w.vert[2].x = 60; w.vert[2].y = 80; w.vert[2].z = 0;

            w.vert[3].x = 100; w.vert[3].y = 0; w.vert[3].z = -40;

            w.edge[0, 0] = 0; w.edge[0, 1] = 1;

            w.edge[1, 0] = 1; w.edge[1, 1] = 2;

            w.edge[2, 0] = 2; w.edge[2, 1] = 3;

            w.edge[3, 0] = 0; w.edge[3, 1] = 3;

            w.edge[4, 0] = 1; w.edge[4, 1] = 3;

            w.edge[5, 0] = 2; w.edge[5, 1] = 0;

        }

        void myLine(point2D p1, point2D p2, Graphics b1g)

        {

            p1.y = Ho - p1.y; p1.x += Xo;

            p2.y = Ho - p2.y; p2.x += Xo;

            b1g.DrawLine(p, (float)p1.x, (float)p1.y, (float)p2.x, (float)p2.y);

        }

        point2D chieuSSoxy(point3D p)

        {

            point2D q;

            q.x = p.x;

            q.y = p.y;

            return q;

        }

        void veWireframe(wireframe w, Graphics g)

        {

            point2D q1, q2;

            point3D p1, p2;

            for (int i = 0; i < w.numEdges; i++)

            {

                p1 = w.vert[w.edge[i, 0]];

                p2 = w.vert[w.edge[i, 1]];

                q1 = chieuSSoxy(p1); q2 = chieuSSoxy(p2);

                myLine(q1, q2, g);

            }

        }

        point3D xoayDiemOX(point3D p, float a)

        {

            point3D q;

            q.y = p.y * Math.Cos(a) - p.z * Math.Sin(a);

            q.z = p.y * Math.Sin(a) + p.z * Math.Cos(a);

            q.x = p.x;

            return q;

        }

        point3D xoayDiemOY(point3D p, float a)

        {

            point3D q;

            q.z = p.z * Math.Cos(a) - p.x * Math.Sin(a);

            q.x = p.z * Math.Sin(a) + p.x * Math.Cos(a);

            q.y = p.y;

            return q;

        }

        point3D xoayDiemOZ(point3D p, float a)

        {

            point3D q;

            q.x = p.x * Math.Cos(a) - p.y * Math.Sin(a);

            q.y = p.x * Math.Sin(a) + p.y * Math.Cos(a);

            q.z = p.z;

            return q;

        }

        void xoayWireframeOX(ref wireframe w, float a)

        {

            for (int i = 0; i < w.numVerts; i++)

                w.vert[i] = xoayDiemOX(w.vert[i], a);

        }

        void xoayWireframeOY(ref wireframe w, float a)

        {

            for (int i = 0; i < w.numVerts; i++)

                w.vert[i] = xoayDiemOY(w.vert[i], a);

        }

        void xoayWireframeOZ(ref wireframe w, float a)

        {

            for (int i = 0; i < w.numVerts; i++)

                w.vert[i] = xoayDiemOZ(w.vert[i], a);

        }

        public Hinhchop()

        {

            InitializeComponent();

            b = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height);

            bg = Graphics.FromImage(b);

            b1Back = Color.LightYellow;

            b1Fore = Color.Red;

            p = new Pen(b1Fore);

            Xo = b.Width / 2;

            Ho = b.Height / 2;

            initwireframe(ref w);

            vePC_tongQuat(w, 200,phi,teta);

        }

        //----- Chieu phoi canh tong quat: mat o vector V co toa do

        //------R ,phi,teta nhu giao trinh Hue trang 54

        void DoiHeToaDo(ref point3D p1,float R,double phi, double teta)

        {

            double x = p1.x, y= p1.y, z = p1.z;

           p1.x= Math.Round(-x*Math.Sin(teta)+y*Math.Cos(teta));

           p1.y = Math.Round(-x * Math.Cos(teta) * Math.Sin(phi) - y * Math.Sin(teta) * Math.Sin(phi) + z * Math.Cos(phi));

           p1.z = Math.Round(-x * Math.Cos(teta) * Math.Cos(phi) - y * Math.Sin(teta) * Math.Cos(phi) - z * Math.Sin(phi) + R);

        }

         void vePC_tongQuat(wireframe w, int E, double phi, double teta)

        {

          double x1,y1,x2,y2;

          double t;

          point3D p;

          for(int i=0; i<w.numEdges; i++)

          {

        p=w.vert[ w.edge[i,0] ];

        DoiHeToaDo(ref p,E, phi, teta);

        t=(double)E/p.z;

        x1=Math.Round(p.x*t);

        y1=Math.Round(p.y*t);

             point2D p1; p1.x = x1; p1.y = y1;

        p=w.vert[ w.edge[i,1] ];

        DoiHeToaDo(ref p,E, phi, teta);

        t=(double)E/p.z;

             x2 = Math.Round(p.x * t);

             y2 = Math.Round(p.y * t);

             point2D p2; p2.x = x2; p2.y = y2;

        myLine(p1,p2,bg);

          }

          return;

        }

        private void Hinhchop_Paint(object sender, PaintEventArgs e)

        {

            Graphics g = e.Graphics;

            g.DrawImageUnscaled(b, 0, 0);

        }

        private void Hinhchop_KeyDown(object sender, KeyEventArgs e)

        {

            switch (e.KeyCode)

            {

                case Keys.X:

                    //quay ox

                    xoayWireframeOX(ref w, goc);

                    bg.Clear(b1Back);

                    vePC_tongQuat(w, 200, phi, teta);

                    this.Invalidate();

                    break;

                case Keys.Y:

                    //quay oy

                    xoayWireframeOY(ref w, goc);

                    bg.Clear(b1Back);

                    vePC_tongQuat(w, 200, phi, teta);

                    this.Invalidate();

                    break;

                case Keys.Z:

                    //quay ox

                    xoayWireframeOZ(ref w, goc);

                    bg.Clear(b1Back);

                    vePC_tongQuat(w, 200, phi, teta);

                    this.Invalidate();

                    break;

            }

        }

        private void Hinhchop_Load(object sender, EventArgs e)

        {

        }

    }

}

Bạn đang đọc truyện trên: Truyen247.Pro

Tags: