using System;

 using System.Collections.Generic;

 using System.ComponentModel;

 using System.Data;

 using System.Drawing;

 using System.Linq;

 using System.Text;

 using System.Windows.Forms;

 using System.Drawing.Drawing2D;

 namespace ConbinedTransformation

 {

     public partial class Form1 : Form

     {

         int flag = ;

         ///立方体初始顶点坐标

         float[,] Cube1 = { { -, -0.5f, - }, { , -0.5f, - }, { , -0.5f,  }, { -, -0.5f,  },

                    { -,  0.5f, - }, { ,  0.5f, - }, { ,  0.5f,  }, { -,  0.5f,  } };

         float[,] Cube2 = { { -, -0.5f, - }, { , -0.5f, - }, { , -0.5f,  }, { -, -0.5f,  },

                    { -,  0.5f, - }, { ,  0.5f, - }, { ,  0.5f,  }, { -,  0.5f,  } };

         Vector4[] tCube1 = new Vector4[];   //变换后的Cube1顶点坐标

         Vector4[] tCube2 = new Vector4[];

         float translationx, rotationy;//瞬时运动参数,平移、转角

         float xstep, rstep;        //单位时间移动、转动步长

         float cx, cy, cz;          //照相机位置

         float dx, dy, dz;         //照相机方向

         float upx, upy, upz;      //照相机上方

         float ux, uy, uz, vx, vy, vz, nx, ny, nz;    //照相机坐标系

         float zp;               //视平面位置

         float wxl, wxr, wyb, wyt;  //窗口参数

         float vxl, vxr, vyb, vyt;    //视区参数

         Graphics g;

         public Form1()

         {

             InitializeComponent();

             g = CreateGraphics();

             g.SmoothingMode = SmoothingMode.AntiAlias;

             //图形运动参数,平移、转动、平移步长,转动步长为10度

             translationx = ;

             rotationy = ;

             xstep = 0.2f;

             rstep = ;

             cx = ; cy = ; cz = ;      //照相机位置

             dx = -cx; dy = -cy; dz = -cz; //照相机方向

             upx = ; upy = ; upz = ;    //照相机上方参考向量

             zp = cz;                      //投影面位置

             wxl = -; wxr = ; wyb = -; wyt = ;   //窗口参数

             vxl = ; vxr = ; vyb = ; vyt = ; //视区参数

             float d;  //单位化视线向量

             d = (float)Math.Sqrt(dx * dx   dy * dy   dz * dz);

             ///照相机坐标系第3轴,N = (dx,dy,dz)

             nx = dx / d;

             ny = dy / d;

             nz = dz / d;

             ///照相机坐标系第1轴,U = N * UP

             ux = (ny * upz - nz * upy);

             uy = (nz * upx - nx * upz);

             uz = (nx * upy - ny * upx);

             ///照相机坐标系第2轴,V = U * N

             vx = (uy * nz - uz * ny);

             vy = (uz * nx - ux * nz);

             vz = (ux * ny - uy * nx);

         }

         private void DrawString()

         {

             String str;

             str = "点击鼠标: (暂停/继续)";

             g.DrawString(str, new Font("宋体", , FontStyle.Regular), Brushes.Black, , );

         }

         private void Form1_Load(object sender, EventArgs e)

         {

         }

         private void timer1_Tick(object sender, EventArgs e)

         {

             doConbinedTransformation();

             DrawString();

         }

         private void doConbinedTransformation()

         {

             int i;

             Matrix4x4 M = new Matrix4x4();

             for (i = ; i < ; i )

             {

                 tCube1[i] = new Vector4(Cube1[i, ], Cube1[i, ], Cube1[i, ], );

                 tCube2[i] = new Vector4(Cube2[i, ], Cube2[i, ], Cube2[i, ], );

             }

             translationx  = xstep;

             if ((translationx >= ) || (translationx <= -)) xstep = -xstep;

             rotationy  = rstep;

             if (rotationy > ) rotationy -= ;

             //Cube1的变换

             //平移x

             M.identity();

             M.e14 = translationx;

             M.e24 = 0.5f;

             for (i = ; i < ; i )

                 tCube1[i] = M * tCube1[i];

             //照相机变换

             M.identity();

             M.e14 = cx;

             M.e24 = cy;

             M.e34 = cz;

             for (i = ; i < ; i )

                 tCube1[i] = M * tCube1[i];

             M.identity();

             M.e11 = ux; M.e12 = uy; M.e13 = uz;

             M.e21 = vx; M.e22 = vy; M.e23 = vz;

             M.e31 = nx; M.e32 = ny; M.e33 = nz;

             for (i = ; i < ; i )

                 tCube1[i] = M * tCube1[i];

             //投影变换

             for (i = ; i < ; i )

             {

                 M.identity();

                 M.e11 = -zp / tCube1[i].z;

                 M.e22 = -zp / tCube1[i].z;

                 M.e33 = zp;

                 tCube1[i] = M * tCube1[i];

             }

             //视窗变换

             M.identity();

             M.e11 = (vxr - vxl) / (wxr - wxl);

             M.e22 = (vyt - vyb) / (wyt - wyb);

             M.e14 = vxl - (vxr - vxl) / (wxr - wxl) * wxl;

             M.e24 = vyb - (vyt - vyb) / (wyt - wyb) * wyb;

             for (i = ; i < ; i )

                 tCube1[i] = M * tCube1[i];

             //Cube2的变换/////////////////

             //////////////////////////////

             //y轴转动

             M.identity();

             M.e11 = (float)Math.Cos(rotationy * 3.14159 / 180.0);

             M.e33 = (float)Math.Cos(rotationy * 3.14159 / 180.0);

             M.e13 = (float)Math.Sin(rotationy * 3.14159 / 180.0);

             M.e31 = -(float)Math.Sin(rotationy * 3.14159 / 180.0);

             for (i = ; i < ; i )

                 tCube2[i] = M * tCube2[i];

             //平移x

             M.identity();

             M.e14 = translationx;

             M.e24 = -0.5f;

             for (i = ; i < ; i )

                 tCube2[i] = M * tCube2[i];

             //照相机变换

             M.identity();

             M.e14 = cx;

             M.e24 = cy;

             M.e34 = cz;

             for (i = ; i < ; i )

                 tCube2[i] = M * tCube2[i];

             M.identity();

             M.e11 = ux; M.e12 = uy; M.e13 = uz;

             M.e21 = vx; M.e22 = vy; M.e23 = vz;

             M.e31 = nx; M.e32 = ny; M.e33 = nz;

             for (i = ; i < ; i )

                 tCube2[i] = M * tCube2[i];

             //投影变换

             for (i = ; i < ; i )

             {

                 M.identity();

                 M.e11 = -zp / tCube2[i].z;

                 M.e22 = -zp / tCube2[i].z;

                 M.e33 = zp;

                 tCube2[i] = M * tCube2[i];

             }

             //视窗变换

             M.identity();

             M.e11 = (vxr - vxl) / (wxr - wxl);

             M.e22 = (vyt - vyb) / (wyt - wyb);

             M.e14 = vxl - (vxr - vxl) / (wxr - wxl) * wxl;

             M.e24 = vyb - (vyt - vyb) / (wyt - wyb) * wyb;

             for (i = ; i < ; i )

                 tCube2[i] = M * tCube2[i];

             //绘图

             g.Clear(Color.White);

             g.DrawLine(Pens.Red, tCube1[].x, tCube1[].y, tCube1[].x, tCube1[].y);

             g.DrawLine(Pens.Red, tCube1[].x, tCube1[].y, tCube1[].x, tCube1[].y);

             g.DrawLine(Pens.Red, tCube1[].x, tCube1[].y, tCube1[].x, tCube1[].y);

             g.DrawLine(Pens.Red, tCube1[].x, tCube1[].y, tCube1[].x, tCube1[].y);

             g.DrawLine(Pens.Red, tCube1[].x, tCube1[].y, tCube1[].x, tCube1[].y);

             g.DrawLine(Pens.Red, tCube1[].x, tCube1[].y, tCube1[].x, tCube1[].y);

             g.DrawLine(Pens.Red, tCube1[].x, tCube1[].y, tCube1[].x, tCube1[].y);

             g.DrawLine(Pens.Red, tCube1[].x, tCube1[].y, tCube1[].x, tCube1[].y);

             g.DrawLine(Pens.Red, tCube1[].x, tCube1[].y, tCube1[].x, tCube1[].y);

             g.DrawLine(Pens.Red, tCube1[].x, tCube1[].y, tCube1[].x, tCube1[].y);

             g.DrawLine(Pens.Red, tCube1[].x, tCube1[].y, tCube1[].x, tCube1[].y);

             g.DrawLine(Pens.Red, tCube1[].x, tCube1[].y, tCube1[].x, tCube1[].y);

             g.DrawLine(Pens.Blue, tCube2[].x, tCube2[].y, tCube2[].x, tCube2[].y);

             g.DrawLine(Pens.Blue, tCube2[].x, tCube2[].y, tCube2[].x, tCube2[].y);

             g.DrawLine(Pens.Blue, tCube2[].x, tCube2[].y, tCube2[].x, tCube2[].y);

             g.DrawLine(Pens.Blue, tCube2[].x, tCube2[].y, tCube2[].x, tCube2[].y);

             g.DrawLine(Pens.Blue, tCube2[].x, tCube2[].y, tCube2[].x, tCube2[].y);

             g.DrawLine(Pens.Blue, tCube2[].x, tCube2[].y, tCube2[].x, tCube2[].y);

             g.DrawLine(Pens.Blue, tCube2[].x, tCube2[].y, tCube2[].x, tCube2[].y);

             g.DrawLine(Pens.Blue, tCube2[].x, tCube2[].y, tCube2[].x, tCube2[].y);

             g.DrawLine(Pens.Blue, tCube2[].x, tCube2[].y, tCube2[].x, tCube2[].y);

             g.DrawLine(Pens.Blue, tCube2[].x, tCube2[].y, tCube2[].x, tCube2[].y);

             g.DrawLine(Pens.Blue, tCube2[].x, tCube2[].y, tCube2[].x, tCube2[].y);

             g.DrawLine(Pens.Blue, tCube2[].x, tCube2[].y, tCube2[].x, tCube2[].y);

         }

         private void Form1_MouseClick(object sender, MouseEventArgs e)

         {

             switch (flag)

             {

                 case :

                     this.timer1.Enabled = false;

                     flag = ;

                     break;

                 case :

                     this.timer1.Enabled = true;

                     flag = ;

                     break;

             }

         }

         private void Form1_Paint(object sender, PaintEventArgs e)

         {

         }

     }

     /////////////////////////  数学类 Vecto3

     public class Vector4

     {

         public static float pi = 3.14159265f;

         public static float tol = 0.000000000000001f;  // float type tolerance 

         public float x;

         public float y;

         public float z;

         public float w;

         public Vector4()

         {

             x = ; y = ; z = ; w = ;

         }

         public Vector4(float xi, float yi, float zi, float wi)

         {

             x = xi;

             y = yi;

             z = zi;

             w = wi;

         }

         public float Magnitude()

         {

             return (float)Math.Sqrt(x * x   y * y   z * z);

         }

         public void Normalize()

         {

             if (w != )

             {

                 x /= w;

                 y /= w;

                 z /= w;

                 w = ;

             }

         }

     }

     ////////////////// 矩阵类

     public class Matrix4x4

     {

         // elements eij: i -> row, j -> column

         public float e11, e12, e13, e14, e21, e22, e23, e24, e31, e32, e33, e34, e41, e42, e43, e44;

         public Matrix4x4()

         {

             e11 = ; e12 = ; e13 = ; e14 = ;

             e21 = ; e22 = ; e23 = ; e24 = ;

             e31 = ; e32 = ; e33 = ; e34 = ;

             e41 = ; e42 = ; e43 = ; e44 = ;

         }

         public Matrix4x4(float r1c1, float r1c2, float r1c3, float r1c4,

                     float r2c1, float r2c2, float r2c3, float r2c4,

                     float r3c1, float r3c2, float r3c3, float r3c4,

                     float r4c1, float r4c2, float r4c3, float r4c4)

         {

             e11 = r1c1; e12 = r1c2; e13 = r1c3; e14 = r1c4;

             e21 = r2c1; e22 = r2c2; e23 = r2c3; e24 = r2c4;

             e31 = r3c1; e32 = r3c2; e33 = r3c3; e34 = r3c4;

             e41 = r4c1; e42 = r4c2; e43 = r4c3; e44 = r4c4;

         }

         public void identity()

         {

             e11 = ; e12 = ; e13 = ; e14 = ;

             e21 = ; e22 = ; e23 = ; e24 = ;

             e31 = ; e32 = ; e33 = ; e34 = ;

             e41 = ; e42 = ; e43 = ; e44 = ;

         }

         public Matrix4x4 Transpose()

         {

             return new Matrix4x4(e11, e21, e31, e41, e12, e22, e32, e42, e13, e23, e33, e43, e41, e42, e43, e44);

         }

         public static Matrix4x4 operator *(Matrix4x4 m1, Matrix4x4 m2)

         {

             return new Matrix4x4(m1.e11 * m2.e11   m1.e12 * m2.e21   m1.e13 * m2.e31   m1.e14 * m2.e41,

                                  m1.e11 * m2.e12   m1.e12 * m2.e22   m1.e13 * m2.e32   m1.e14 * m2.e42,

                                  m1.e11 * m2.e13   m1.e12 * m2.e23   m1.e13 * m2.e33   m1.e14 * m2.e43,

                                  m1.e11 * m2.e14   m1.e12 * m2.e24   m1.e13 * m2.e34   m1.e14 * m2.e44,

                                  m1.e21 * m2.e11   m1.e22 * m2.e21   m1.e23 * m2.e31   m1.e24 * m2.e41,

                                  m1.e21 * m2.e12   m1.e22 * m2.e22   m1.e23 * m2.e32   m1.e24 * m2.e42,

                                  m1.e21 * m2.e13   m1.e22 * m2.e23   m1.e23 * m2.e33   m1.e24 * m2.e43,

                                  m1.e21 * m2.e14   m1.e22 * m2.e24   m1.e23 * m2.e34   m1.e24 * m2.e44,

                                  m1.e31 * m2.e11   m1.e32 * m2.e21   m1.e33 * m2.e31   m1.e34 * m2.e41,

                                  m1.e31 * m2.e12   m1.e32 * m2.e22   m1.e33 * m2.e32   m1.e34 * m2.e42,

                                  m1.e31 * m2.e13   m1.e32 * m2.e23   m1.e33 * m2.e33   m1.e34 * m2.e43,

                                  m1.e31 * m2.e14   m1.e32 * m2.e24   m1.e33 * m2.e34   m1.e34 * m2.e44,

                                  m1.e41 * m2.e11   m1.e42 * m2.e21   m1.e43 * m2.e31   m1.e44 * m2.e41,

                                  m1.e41 * m2.e12   m1.e42 * m2.e22   m1.e43 * m2.e32   m1.e44 * m2.e42,

                                  m1.e41 * m2.e13   m1.e42 * m2.e23   m1.e43 * m2.e33   m1.e44 * m2.e43,

                                  m1.e41 * m2.e14   m1.e42 * m2.e24   m1.e43 * m2.e34   m1.e44 * m2.e44

                                  );

         }

         public static Vector4 operator *(Matrix4x4 m, Vector4 u)

         {

             return new Vector4(m.e11 * u.x   m.e12 * u.y   m.e13 * u.z   m.e14 * u.w,

                                m.e21 * u.x   m.e22 * u.y   m.e23 * u.z   m.e24 * u.w,

                                m.e31 * u.x   m.e32 * u.y   m.e33 * u.z   m.e34 * u.w,

                                m.e41 * u.x   m.e42 * u.y   m.e43 * u.z   m.e44 * u.w);

         }

     }

 }

C# 实现立体图形变换(vs2008)的更多相关文章

  1. 计算机图形学 - 图形变换(opengl版)

    作业题目: 图形变换:实现一个图形绕任意直线旋转的程序. 要求:把一个三维图形绕任意一条直线旋转,需要有初始图形,和旋转后的图形,最好也可以实时控制旋转. 最少要做出绕z轴旋转. 原理:http:// ...

  2. powerpoint2015如何调整PPT立体图形

    在powerpoint2016中,可以添加图片来丰富演说,但通常人们只会懂得插入平面图片.动态图片,立体图片就无法插入了吗?不是的,在powerpoint2016为我们准备了大量的预设,可以调整图片, ...

  3. SVG坐标系统及图形变换

    前面的话 前面介绍过SVG视野后,本文将开始介绍SVG坐标系统及图形变换 坐标定位 对于所有元素,SVG使用的坐标系统或者说网格系统,和Canvas用的差不多(所有计算机绘图都差不多).这种坐标系统是 ...

  4. canvas星空和图形变换

    图形变换. 一.画一片星空 先画一片canvas.width宽canvas.height高的黑色星空,再画200个随机位置,随机大小,随机旋转角度的星星. window.onload=function ...

  5. 《Real Time Rendering》第四章 图形变换

    图形变换是一个将例如点.向量或者颜色等实体进行某种转换的操作.对于计算机图形学的先驱者,掌握图形变换是极为重要的.有了他们,你就可以对象.光源以及摄像机进行定位,变形以及动画添加.你也可以确认所有的计 ...

  6. HTML5-Canvas 图形变换+状态保存

    1. 图形变换 canvas是基于状态绘制图形的.故此一般情况下,canvas的绘制的图形路径和状态时分离的. function drawShape(ctx){ // 绘制路径 shapePath(c ...

  7. 2D平面中关于矩阵(Matrix)跟图形变换的讲解

    在二维平面上,常用的有以下三种基本的图形变化: 1)Translation 2)Scale 3)Rotation 在canvas的开发中,我们也经常会用到这样的一些图形变换,尤其是我们在写自定义Vie ...

  8. WebGL简易教程(五):图形变换(模型、视图、投影变换)

    [toc] 1. 概述 通过之前的教程,对WebGL中可编程渲染管线的流程有了一定的认识.但是只有前面的知识还不足以绘制真正的三维场景,可以发现之前我们绘制的点.三角形的坐标都是[-1,1]之间,Z值 ...

  9. Java实验项目三——平面图形和立体图形抽象类

    Program:按照下面要求完成类的设计 (1)设计一个平面图形抽象类和一个立体图形抽象类,提供该类对象公共的方法和属性. (2)修改项目三中第2题中所设计的球类.圆柱类,圆锥类.矩形类.三角形类.圆 ...

随机推荐

  1. Linux 更改root与home分区大小的方法总结

    1. 安装了CentOS7.5的虚拟机 但是发现里面的操作系统 home 分区占到了400g 根分区只有50g 认为不太好,所以要改一下. 2.方法. 好像是xfs的文件格式, 没法使用resize2 ...

  2. 14.5 富文本编辑【JavaScript高级程序设计第三版】

    富文本编辑,又称为WYSIWYG(What You See Is What You Get,所见即所得).在网页中编辑富文本内容,是人们对Web 应用程序最大的期待之一.虽然也没有规范,但在IE 最早 ...

  3. Lights inside a 3d Grid UVA - 11605(概率)

    题意: 给出一个n * m * h的空间 每次任意选择两个点  使得在以这两个点连线为对角线的空间的点的值 取反  (初始为0) 求经过k次操作后最后有多少点的值为1 解析: 遇到坐标分维去看  把三 ...

  4. Oracle Client安装报错:引用数据不可用于验证此操作系统分发的先决条件

    原因是Oracle Client 11g版本不支持最新的Win10系统. 打开Oracle Client 11g安装包目录:\client\stage\cvu 编辑该目录下的两个xml文件:oracl ...

  5. 【BZOJ4822】[CQOI2017]老C的任务(扫描线)

    [BZOJ4822][CQOI2017]老C的任务(扫描线) 题面 BZOJ 洛谷 题解 没有修改操作,都不需要分治了... 直接排序之后扫描线算贡献就好了... 不知道为啥洛谷上过不了... #in ...

  6. 【BZOJ2000】[HNOI2000]取石头游戏(贪心,博弈论)

    [BZOJ2000][HNOI2000]取石头游戏(贪心,博弈论) 题面 BZOJ 洛谷 题解 这题好神仙啊,窝不会QaQ. 假装一下只有三个元素\(a_{i-1},a_i,a_{i+1}\),并且满 ...

  7. BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树

    题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...

  8. [luogu3801]红色的幻想乡

    题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一开始没有任何一个地区被红雾遮盖.蕾米莉亚每次站在 ...

  9. luogu1345 奶牛的电信 (最小割)

    虽然割点不好搞,但是可以变成割边呀 拆点,拆出来的边权给1,原图中的边权给inf,然后跑dinic就行了 #include<bits/stdc++.h> #define pa pair&l ...

  10. Arch Linux中禁用UTC解决双系统时间问题

    原因 Windows双系统时间不统一在于时间表示有两个标准:localtime 和 UTC(Coordinated Universal Time) .UTC 是与时区无关的全球时间标准.尽管概念上有差 ...