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... ♥

trukka

struct Point3D

    {

        public float X, Y, Z;

        public Point3D(float x, float y, float z)

        {

            X = x;

            Y = y;

            Z = z;

        }

    }

    struct wireframe

    {

        public Point3D[] vert;

        public int[,] edge;

    }

    public partial class Form1 : Form

    {

        wireframe wtru, wnon;

        Graphics g;

        int chon = 1;

        public Form1()

        {

            InitializeComponent();

            g = this.CreateGraphics();

        }

        void VeWOXY(wireframe w, Graphics g, int W, int H, Color c)

        {

            Point3D p1, p2;

            PointF Q1, Q2;

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

            {

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

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

                Q1 = ChieuSSOXY(p1);

                Q2 = ChieuSSOXY(p2);

                Myline(g, W, H, Q1, Q2, c);

            }

        }

        void VeWOYZ(wireframe w, Graphics g, int W, int H, Color c)

        {

            Point3D p1, p2;

            PointF Q1, Q2;

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

            {

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

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

                Q1 = ChieuSSOYZ(p1);

                Q2 = ChieuSSOYZ(p2);

                Myline(g, W, H, Q1, Q2, c);

            }

        }

        void VeWOZX(wireframe w, Graphics g, int W, int H, Color c)

        {

            Point3D p1, p2;

            PointF Q1, Q2;

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

            {

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

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

                Q1 = ChieuSSOZX(p1);

                Q2 = ChieuSSOZX(p2);

                Myline(g, W, H, Q1, Q2, c);

            }

        }

        void Myline(Graphics g, int W, int H, PointF p1, PointF p2, Color c)

        {

            p1.Y = H - p1.Y;

            p1.X += W;

            p2.Y = H - p2.Y;

            p2.X += W;

            g.DrawLine(new Pen(Color.Red), p1, p2);

        }

        PointF ChieuSSOXY(Point3D p)

        {

            PointF Q = new PointF();

            Q.X = p.X;

            Q.Y = p.Y;

            return Q;

        }

        PointF ChieuSSOYZ(Point3D p)

        {

            PointF Q = new PointF();

            Q.Y = p.Y;

            Q.X = p.Z;

            return Q;

        }

        PointF ChieuSSOZX(Point3D p)

        {

            PointF Q = new PointF();

            Q.X = p.X;

            Q.Y = p.Z;

            return Q;

        }

        Point3D XoayOx(Point3D p, float al)

        {

            Point3D q = new Point3D();

            q.X = p.X;

            q.Y = (float)(p.Y * Math.Cos(al) - p.Z * Math.Sin(al));

            q.Z = (float)(p.Y * Math.Sin(al) + p.Z * Math.Cos(al));

            return q;

        }

        void XoayWOx(ref wireframe w, float al)

        {

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

            {

                w.vert[i] = XoayOx(w.vert[i], al);

            }

        }

        Point3D XoayOy(Point3D p, float al)

        {

            Point3D q = new Point3D();

            q.Y = p.Y;

            q.X = (float)(p.Z * Math.Sin(al) + p.X * Math.Cos(al));

            q.Z = (float)(p.Z * Math.Cos(al) - p.X * Math.Sin(al));

            return q;

        }

        void XoayWOy(ref wireframe w, float al)

        {

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

            {

                w.vert[i] = XoayOy(w.vert[i], al);

            }

        }

        Point3D XoayOz(Point3D p, float al)

        {

            Point3D q = new Point3D();

            q.Z = p.Z;

            q.Y = (float)(p.X * Math.Sin(al) + p.Y * Math.Cos(al));

            q.X = (float)(p.X * Math.Cos(al) - p.Y * Math.Sin(al));

            return q;

        }

        void XoayWOz(ref wireframe w, float al)

        {

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

            {

                w.vert[i] = XoayOz(w.vert[i], al);

            }

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            wtru = HinhTru(150, 50, 20);

            wnon = HinhNon(100, 50, 20);

        }

        wireframe HinhTru (float r, float l, int n)

        {

            wireframe w;

            w.vert = new Point3D[2 * n];

            w.edge = new int[3 * n, 2];

            double u = 0, du = 2 * Math.PI / n;

            // m,at day tren

            for (int i = 0; i < n; i++)

            {

                w.vert[i].X = (float)(r * Math.Cos(u));

                w.vert[i].Y = (float)(r * Math.Sin(u));

                w.vert[i].Z = l / 2;

                u += du;

            }

            //double u = 0; mat day duoi

            for (int i = n; i < 2*n; i++)

            {

                w.vert[i].X = (float)(r * Math.Cos(u));

                w.vert[i].Y = (float)(r * Math.Sin(u));

                w.vert[i].Z = -l / 2;

                u += du;

            }

           // canh xung quanh

            for (int i = 0; i < n; i++)

            {

                w.edge[i, 0] = i;

                w.edge[i, 1] = i + n;

            }

            // canh day tren

            for (int i = 0; i < n-1; i++)

            {

                w.edge[i+n, 0] = i;

                w.edge[i+n, 1] = i + 1;

            }

            w.edge[2 * n - 1, 0] = n - 1;

            w.edge[2 * n - 1, 1] = 0;

            // canh day duoi

            for (int i = 0; i < n -1; i++)

            {

                w.edge[i + 2*n, 0] = i+n;

                w.edge[i + 2*n, 1] = i +n+ 1;

            }

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

            w.edge[3* n - 1, 1] = n;

            return w;

        }

        wireframe HinhNon(float z0, float r, int n)

        {

            wireframe w;

            w.vert = new Point3D[n+1];

            w.edge = new int[2 * n, 2];

            double u = 0, du = 2 * Math.PI / n;

            w.vert[0] = new Point3D(0, 0, z0);

            for (int i = 0; i < n; i++)

            {

                w.vert[i + 1] = new Point3D((float)(r * Math.Cos(u)), (float)(r * Math.Sin(u)),0);

                u+=du;

            }

             for (int i = 0; i < n; i++)

            {

                w.edge[i,0]=0;

                w.edge[i,1]=i+1;

            }

             for (int i = 0; i < n-1; i++)

            {

                w.edge[i+n,0]=i+1;

                w.edge[i+n,1]=i+2;

            }

             w.edge[2*n-1,0]=1;

                w.edge[2*n-1,1]=n;

        return w;

        }

        private void panel1_Paint(object sender, PaintEventArgs e)

        {

            if (chon==1)

                VeWOXY(wtru, e.Graphics, panel1.Width / 2, panel1.Height / 2, Color.Red);

            else

                VeWOXY(wnon, e.Graphics, panel1.Width / 2, panel1.Height / 2, Color.Red);

        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)

        {

            switch (e.KeyCode)

            {

                case Keys.X:

                    {                   

                        XoayWOx(ref wtru, (float)Math.PI/180);

                        XoayWOx(ref wnon, (float)Math.PI / 180);

                         break;

                    }             

                case Keys.Y:

                    {

                        XoayWOy(ref wtru, (float)Math.PI / 180);

                        XoayWOx(ref wnon, (float)Math.PI / 180);

                        break;

                    }

                case Keys.Z:

                    {

                        XoayWOz(ref wtru, (float)Math.PI / 180);

                        XoayWOx(ref wnon, (float)Math.PI / 180);

                        break;

                    }

            }

            panel1.Invalidate();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            chon = 1;

            panel1.Invalidate();

        }

        private void button2_Click(object sender, EventArgs e)

        {

            chon = 2;

            panel1.Invalidate();

        }

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

Tags: