C语言-三维图形变换

合集下载

C语言的三维数组的应用

C语言的三维数组的应用

C语言的三维数组的应用摘要:利用程序语言【C语言】编写一个俄罗斯方块游戏,加深对程序入口、出口的理解和编制,掌握数组的运用,以及对知识的拓展。

关键字:C语言, 俄罗斯方块, 三维数组Abstract: [C programming language - language prepared by a Russian box game, understand the procedures for import, export of understanding and preparation, master the use of the array, and the expansion of knowledge.Keyword: C language, the Russian box,three-dimensional array前言:本设计是为了制作一个“俄罗斯方块”游戏。

俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。

这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,它看似简单但却变化无穷,令人上瘾。

相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。

制作此软件是为了使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。

在毕业论文选题上,我利用c语言制作俄罗斯方块游戏,在c语言中通过利用三维数组来存放最初的形状,利用四个方向键,来控制方块的移动和变形,利用ENTER,ESC,SPACE,HOME,来控制占停,退出,快速下落,和开始。

方块的形状,颜色都是随机的。

在游戏的旁边有积分,和下一个的形状,还设计了过关,加分等等。

系统进入游戏后,会出现俄罗斯方块的字样,和积分NUMBER,NEXTBOX。

按ESC退出游戏,结束出现 GAMEOVER,和成员名,通过函数实现各个功能。

目录一.概述1.1俄罗斯方块的题目的描述1.2俄罗斯方块的设计思想1.2.1详细规则、胜负判定方法1.2.2游戏操作方法1.3 开发工具1.4 软件运行环境1.5 项目任务书二、总体设计2.1 开发与设计的总体思想2.2 系统模块结构图2.3 模块设计2.3.1 主要模块2.3.2 图形修饰模块2.3.3 系统流程图2.3.4 按键及功能对照表2.3.5 主要函数名称以及功能表2.4 模块设计小结三、实验结果分析及程序代码四、结果分析:五、总结六、参考文献:一、概述:1.1俄罗斯方块的题目的描述1. 运行游戏时.界面随机的产生不同形状的方块,游戏者通过自己的操作使方块进行合理的堆积.如果每层达到饱和状态的时候会自动消除.然后游戏有规则的进行加分.分数达到一定的阶段.游戏的级别也会越来越高.然后方块下降的速度也会随之慢慢加快.以迎合游戏者的挑战,达到最加有趣的游戏!1.2俄罗斯方块的设计思想游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,所以我们在游戏中添加了漂亮的场景和动听的音乐,设置了过关升级的功能,激发大家的娱乐激情。

c++中matrix3d的用法

c++中matrix3d的用法

题目:探索C++中的Matrix3D用法与应用序言C++是一种广泛应用于软件开发领域的编程语言,其强大的性能和灵活性使得它成为了许多领域的首选语言之一。

而在C++中,Matrix3D 作为一个重要的数据结构,在许多领域中都有着广泛的应用。

本文将深入探讨C++中Matrix3D的相关知识,从基础的概念到高级应用,帮助读者全面理解其用法与应用。

一、Matrix3D的基本概念在C++中,Matrix3D是一个三维的矩阵结构,它由行和列组成,用于表示三维空间中的变换和旋转。

Matrix3D中的元素可以表示空间中的平移、旋转、缩放等变换,是实现三维图形学和计算机视觉算法的重要基础。

了解Matrix3D的基本概念对于掌握C++中的三维编程至关重要。

二、Matrix3D的创建和初始化在C++中,我们可以使用数组或动态内存分配的方式来创建和初始化Matrix3D。

通过合适的初始化,我们可以为Matrix3D赋予特定的数学含义和几何意义,从而实现不同的空间变换和仿射变换。

在实际应用中,不同的初始化方法往往对应着不同的数学模型和算法,因此选择适合的初始化方法对于实现特定的功能非常重要。

三、Matrix3D的操作和运算Matrix3D作为一个矩阵结构,支持多种基本的矩阵运算,如加法、减法、乘法等。

这些运算不仅可以用来表示空间变换,还可以应用于解决实际问题,比如三维图形的变换和投影、物体的运动和碰撞检测等。

在实际编程中,熟练掌握Matrix3D的操作和运算对于提高代码的效率和性能至关重要。

四、Matrix3D在计算机图形学中的应用在计算机图形学中,Matrix3D有着广泛的应用。

它可以用来表示三维空间中的几何变换、物体的旋转和平移、相机的视角和投影等。

通过Matrix3D的变换,我们可以实现三维场景的渲染和显示,从而为用户呈现逼真的三维图形效果。

在实际开发中,熟练掌握Matrix3D在计算机图形学中的应用对于实现高质量的三维图形效果至关重要。

用C++实现图像旋转变换

用C++实现图像旋转变换

这里主要讨论以图象的中心为圆心旋转。

旋转之后若要保持目标区域大小不变,则整幅图像变大;若要保持整幅图像的大小不变,则旋转出去的部分需要裁剪掉。

旋转前的图旋转后的图旋转后保持原图大小,转出的部分被裁掉以顺时针旋转为例来堆到旋转变换公式。

如下图所示。

旋转前:x0=rcosb;y0=rsinb旋转a角度后:x1=rcos(b-a)=rcosbcosa+rsinbsina=x0cosa+y0sinay 1=rsin(b-a)=rsinbcosa-rcosbsina=-xsina+ycosa矩阵形式为逆变换为上面的公式是以图像的左下角为原点旋转的。

现我们要以图像的中心为原点旋转。

因此需要先将坐标平移到图像中心,如下所示设图象的宽为w,高为h,容易得到:逆变换为现在可以分三步来完成旋转变换:1. 将坐标系x'o'y'平移到xoy ;2. 在xoy坐标系下作旋转变换;3.变换后将坐标系平移回原来位置。

用矩阵表示就是其中R表示旋转变换矩阵。

当旋转不改变图像大小时,T 与T' 互为逆矩阵;当旋转后图像变大时,T 与T'不是逆矩阵关系,因为图像变大了,第一次平移和第二次平移坐标系的距离不一样。

因此当图像变大时,公式应该如下:由于算法实现过程中我们需要的是逆变换的公式,因此我们只写出逆变换的表达式,如下:其中wn ,hn 表示新图像的宽和高,wo, ho 表示原图像的宽和高。

这样,对于新图中的每一点,我们就可以根据上面逆变换公式求出对应原图中的点,得到它的灰度。

如果超出原图范围,则设置为背景色。

要注意的是,由于有浮点运算,计算出来点的坐标可能不是整数,采用取整处理,即找最接近的点,这样会带来一些误差(图象可能会出现锯齿)。

更精确的方法是采用插值,这里暂不讨论。

C++代码如下:/** rotate.cpp* 图像旋转变换(顺时针)* Created on: 2011-10-10* Author: LiChanghai*/// 以图像中心为坐标原点,旋转后不改变图像大小// 函数返回值为指针,指向新申请的内存区域// 因为新图像大小改变了,需要返回新图像的尺寸// 因此形参的高度和宽度都采用指针变量#include<string.h>#include<stdlib.h>#include<cmath>#define pi 3.1415926535unsigned char* rotate(unsigned char*pImage, int*width, int*height, int biBitCount, float angle){//定义以图像中心为原点的坐标系下原图像和新图像的四个角点坐标float src_x1, src_y1, src_x2, src_y2, src_x3, src_y3, src_x4, src_y4;float dst_x1, dst_y1, dst_x2, dst_y2, dst_x3, dst_y3, dst_x4, dst_y4;//定义新图像的高度和宽度int wnew, hnew;//定义计算过程中需要的相关变量float sina, cosa, temp1, temp2, alpha;//角度转化为弧度alpha=pi*angle/180;cosa = float(cos(double(alpha)));sina = float(sin(double(alpha)));//原图像的四个角点的坐标src_x1 = float(-0.5*(*width)); src_y1 = float(0.5*(*height));src_x2 = float(0.5*(*width)); src_y2 = src_y1;src_x3 = src_x1; src_y3 = float(-0.5*(*height));src_x4 = src_x2; src_y4 = src_y3;//计算新图像的四个角点坐标dst_x1 = cosa*src_x1+sina*src_y1;dst_y1 = -sina*src_x1+cosa*src_y1;dst_x2 = cosa*src_x2+sina*src_y2;dst_y2 = -sina*src_x2+cosa*src_y2;dst_x3 = cosa*src_x3+sina*src_y3;dst_y3 = -sina*src_x3+cosa*src_y3;dst_x4 = cosa*src_x4+sina*src_y4;dst_y4 = -sina*src_x4+cosa*src_y4;//计算新图像的高度和宽度float t1 = fabs(dst_x4-dst_x1), t2 = fabs(dst_x3-dst_x2);wnew = int(t1>t2 ? t1:t2);t1 = fabs(dst_y4-dst_y1), t2 = fabs(dst_y3-dst_y2);hnew = int(t1>t2 ? t1:t2);// 计算旋转变换中的两个中间变量,便于以后计算temp1=float( -0.5*wnew*cosa+0.5*hnew*sina+0.5*(*width));temp2=float(-0.5*wnew*sina-0.5*hnew*cosa+0.5*(*height));//计算原图像和新图像每行像素所占的字节数(必须是4的倍数)int lineByte = ((*width) * biBitCount/8+3)/4*4;int lineByte2=(wnew * biBitCount/8+3)/4*4;//申请新的位图数据存储空间unsigned char*pImage2;pImage2=new unsigned char[lineByte2*hnew];//将新图像设置为背景色memset(pImage2, 0, lineByte2*hnew);//遍历新图像的每一个像素进行判断int x, y, x0, y0; // x0, y0为原图像中对应坐标for(y=0; y<hnew; y++)for(x=0; x<wnew; x++){x0= int(x*cosa-y*sina+temp1);y0= int(x*sina+y*cosa+temp2);//如果在原图像范围内则复制像素值if( (x0>=0) && (x0<(*width)) && (y0>=0) && (y0<(*height))){*(pImage2+lineByte2*y+x) = *(pImage+lineByte*y0+x0);}}//修改原图像的高度和宽度*width = wnew;*height = hnew;delete [ ] pImage; //释放原内存空间return pImage2;}该程序在Eclipse上调试通过,结果正确。

6.2三维图形投影变换技术1

6.2三维图形投影变换技术1

P(x,y,z)
(x y z 1)*
0 1 0
=(x’y’z’1)
0 0 1 0 0 0 0 1
平行投影方向为Y轴 投影面为 平行投影方向为 轴,投影面为o-xz面, 面
则空间中任意一点P(x,y,z)投影到 投影到o-xz面上获 则空间中任意一点 投影到 面上获 得点P’(x’,y’,z’)的关系是 得点 的关系是
•x’=x •y’=y •z’=0 用矩阵表示: 用矩阵表示:
1 0 0 0 0
(x y z 1)*
三维坐标
0 1 0
=(x’y’z’1)
投影后的 二维坐标
0 0 0 0 0 0 0 1
变换矩阵
•投影方向:x轴,投影面 面 投影方向: 轴 投影面yz面 投影方向 •投影方向:y轴,投影面 面 投影方向: 轴 投影面xz面 投影方向 •投影矩阵为多少? 投影矩阵为多少? 投影矩阵为多少
投影视点E-观察者的眼睛 投影面xy面 透视投影(投影视点 观察者的眼睛 投影面 面) 投影视点 观察者的眼睛,投影面
投影方法:从视点E经过形体的各个点,向投影平 投影方法 视点 经过形体的各个点, 经过形体的各个点
画射线,这些射线和投影面o-xy的交点形成投影像 的交点形成投影像 面画射线,这些射线和投影面 的交点 (也就是具有真实立体感的二维图形)。
前面讲的内容解决了如何在计算机中定义一个立体形体, 前面讲的内容解决了如何在计算机中定义一个立体形体 ,下面 我们来解决第二个问题: 我们来解决第二个问题:
•如何将三维形体作为二维图像 如何将三维形体作为二维图像 如何将三维形体作为二 •在图像显示器等输出装置上 在图像显示器等输出装置上 在图像显示器 •表示出来? 表示出来? 表示出来

三维投影变换的MATLAB实现

三维投影变换的MATLAB实现

三维投影变换的MATLAB实现唐飞;杨伟;查长礼【摘要】三维图形变换需要对形体顶点的齐次坐标矩阵进行复合计算,计算繁琐且变换过程晦涩抽象,使用传统的程序设计语言实现图形变换的可视化非常困难.因为在三维图形变换中引入MATLAB工具,利用其强大的矩阵运算能力和丰富的图形处理能力,能够快速准确地计算矩阵和输出图形,清晰直观地展现图形变换的方法和过程.【期刊名称】《安徽理工大学学报(自然科学版)》【年(卷),期】2016(036)002【总页数】4页(P36-39)【关键词】三维图形变换;矩阵;MATLAB;投影;计算机图形学【作者】唐飞;杨伟;查长礼【作者单位】安庆师范学院物理与电气工程学院,安徽安庆246133;安庆师范学院物理与电气工程学院,安徽安庆246133;安庆师范学院物理与电气工程学院,安徽安庆246133【正文语种】中文【中图分类】TH126.2几何图形是CAD系统中的基本元素,无论以何种方式建立的模型,最终都需要转换为几何图形进行显示和输出。

几何图形由顶点坐标、顶点间的拓扑关系和组成图形的线面模型共同决定[1]。

图形变换是计算机图形处理的基础,是计算机图形学的重要组成部分,图形的处理、显示和形体构造等都需要使用到图形变换。

图形变换的实质是对图形顶点的坐标进行变换,这种变换不改变图形各元素的属性和它们之间的拓扑关系,仅改变各点的坐标。

三维图形变换包括比例变换、对称变换、错切变换、平移变换、旋转变换、投影变换和透视变换等基本变换,更复杂的变换可以通过基本变换组合而成。

每一个变换都可以表示为矩阵计算的形式,通过矩阵的相乘构造更复杂的变换[2]。

在图形变换中需要进行大量的矩阵运算,计算繁琐且变换过程晦涩抽象,使用C语言等传统的计算机语言实现可视化程序设计十分困难。

因此在图形变换中使用MATLAB软件,利用其强大的矩阵运算能力和丰富的图形处理能力,快速准确地进行矩阵计算和图形输出,直观地展现图形变换的方法和过程。

三维坐标系变换

三维坐标系变换

三维坐标系变换三维坐标系变换可以理解为将一个三维点从一个坐标系转换到另一个坐标系中。

在实际应用中,我们常常需要对物体或者场景进行三维建模和渲染,而三维坐标系变换是不可或缺的一个基础环节。

本文将介绍三维坐标系变换的相关概念和常见应用,以及一些实用的解决方案。

一、常见的三维坐标系变换方式在三维坐标系变换中,常见的方式包括平移、旋转、缩放和仿射变换。

它们分别对应了三维空间中的平移、旋转、比例变化和直线间的关系变化。

在实际应用中,我们可以通过矩阵乘法的方式进行数学计算,也可以利用计算机图形学库中封装好的函数来实现。

1. 平移:将对象在三维坐标系中沿着某个方向移动一定的距离。

平移变换可以用一个形如平移向量的矩阵表示,在三维空间中的坐标变换表达式为:[x' y' z' 1] = [x y z 1] * [1 0 0 tx; 0 1 0 ty; 0 0 1 tz; 0 0 0 1]其中,tx、ty、tz 分别表示在 x、y、z 方向的平移距离。

2. 旋转:将对象绕三维空间中的某个坐标轴或者任意轴进行旋转变换。

如果绕 x 轴旋转,那么旋转变换矩阵为:[x' y' z' 1] = [x y z 1] * [1 0 0 0; 0 cos(theta) -sin(theta) 0; 0 sin(theta) cos(theta) 0; 0 0 0 1]同样的,绕 y 轴、z 轴旋转的矩阵也可以类似地表示。

对于绕任一轴的旋转,可以使用 Rodrigues 公式等数学方法来求解。

3. 缩放:将对象在三个方向上分别进行缩放变换,可以分别用三个缩放因子表示,对应矩阵表示为:[x' y' z' 1] = [x y z 1] * [sx 0 0 0; 0 sy 0 0; 0 0 sz 0; 0 0 0 1]其中,sx、sy、sz 分别表示在 x、y、z 方向放缩的比例因子。

《计算机图形学》实验报告

《计算机图形学》实验报告

实验报告模板《计算机图形学》实验报告一、实验目的及要求1.实习三维图形的坐标系之间的变换;2.三维图形几何变换;3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现;4.实现二维图形的基本变换(平移、旋转、缩放、错切、对称、复合等);5.实现三维图形的基本变换(平移、旋转、缩放、复合等);二、理论基础在齐次坐标理论下,二维图形几何变换矩阵可用下式表示:⎪⎪⎪⎭⎫⎝⎛===ifchebgdaTnkxx kk2,1,0,)(ϕ平移变换:[x* y* 1] =[x y 1] *0000001ts⎛⎫⎪⎪⎪⎝⎭=[t*x s*y 1]比例变换:[x* y* 1]=[x y 1] *1000101m n⎛⎫⎪⎪⎪⎝⎭=[m+x n+y 1]旋转变换:在平面上的二维图形饶原点逆时针旋转Ө角,变换矩阵为[x* y* 1]=[x y 1] *cos sin0sin cos0001θθθθ⎛⎫⎪- ⎪⎪⎝⎭= [x*cosө-y*sinө]复合变换:以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时候,我们就要用到复合变换矩阵。

三维变换类似于二维,在画图时,把三维坐标转换为二维即可。

三、算法设计与分析二维变换:#define dx 50#define dy 100void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+dx;a[1]=m[i][1]+dy;b[0]=m[i+1][0]+dx;b[1]=m[i+1][1]+dy;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define h 0.1745#include<math.h>void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*cos(h)-m[i][1]*sin(h);a[1]=m[i][1]*cos(h)+m[i][0]*sin(h);b[0]=m[i+1][0]*cos(h)-m[i+1][1]*sin(h);b[1]=m[i+1][1]*cos(h)+m[i+1][0]*sin(h);DDALine(a,b, RGB(0, 200, 255), pDC);}}#define k 2;#define f 2.5void CCGWithVCView::OnTransMove() //缩放{// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Scale Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*k;a[1]=m[i][1]*f;b[0]=m[i+1][0]*k;b[1]=m[i+1][1]*f;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define n 2#define d 0void CCGWithVCView::OnTransOther(){// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Other Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+n*m[i][1];a[1]=m[i][1]+d*m[i][0];b[0]=m[i+1][0]+n*m[i+1][1];b[1]=m[i+1][1]+d*m[i+1][0];DDALine(a,b, RGB(0, 200, 255), pDC);}}三维变换:#include<math.h>#define dx 100#define dy 100#define dz 0void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]+dy-p3d[i][0]+dx/sqrt(2);p2d[i][1]=p3d[i][2]+dz+p3d[i][0]+dx/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}#define k 0.1745void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]*cos(k)-p3d[i][2]*sin(k)-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]*cos(k)+p3d[i][1]*sin(k)+p3d[i][0]/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}四、程序调试及结果的分析二维:三维:五、实验心得及建议在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。

C语言图像旋转 放大 移动程序代码

C语言图像旋转 放大 移动程序代码
filename="D:\\d.jpg";//图像的地址
pImg = cvLoadImage(filename, 1);//载入图像
pImg_xz = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U,3); //创建图像
cvNamedWindow( "原图", 1 );//创建窗口
+q*((1.0-p)*data[(m+height_xz+1)*step+channels*(n+width_xz)]+p*data[(m+height_xz+1)*step+channels*(n+1+width_xz)]));
G=(int)((1.0-q)*((1.0-p)*data[(m+height_xz)*step+channels*(n+width_xz)+1]+p*data[(m+height_xz)*step+channels*(n+1+width_xz)+1])
G=(int)((1.0-q)*((1.0-p)*data[(m+height_xz)*step+channels*(n+width_xz)+1]+p*data[(m+height_xz)*step+channels*(n+1+width_xz)+1])
+q*((1.0-p)*data[(m+height_xz+1)*step+channels*(n+width_xz)+1]+p*data[(m+height_xz+1)*step+channels*(n+1+width_xz)+1]));
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
float bf,af,ca,cb,cg,sg,xp,yp,zp;
int i;
bf=bta*rad;
af=afa*rad;
cb=cos(bf);
ca=cos(af);
for(i=0;i<mp;i++)
{
if(x[i]==0)
xp=ox-sf*z[i]*cb;
else
xp=ox+sf*(x[i]-z[i]*cb);
void rotationy(float xc,float yc,float zc,float beta,float tranm[][4]);
void rotationz(float xc,float yc,float zc,float gama,float tranm[][4]);
void projectx(float i,float m,float n,float tranm[][4]);
axono2d(1.,320.,240.,-45.,35.2667,u,v,w,ipen,kind,NUMBER);
mirrxoy(0.,0.,-60.,tm);
draw(1.,320.,240.,tm);
mirrxoz(0.,-60.,0.,tm);
draw(1.,320.,240.,tm);
mirryoz(-60.,0.,0.,tm);
{
for(mj=0;mj<4;mj++)
{
mc[mi][mj]=0;
for(mk=0;mk<4;mk++)
mc[mi][mj]=mc[mi][mj]+ma[mi][mk]*mb[mk][mj];
}
}
}
void transform(float x0,float y0,float z0,float *x,float *y,float *z,float tranm[][4])
setwritemode(1);
initm(tm);
for(j=1;j<=15;j++)
{
setcolor(j);
translation(0.,0.,-10.*j,tm);
draw(1.,300.,350.,tm);
}
for(j=1;j<=15;j++)
{
setcolor(j);
translation(-10.*j,0.,0.,tm);
void mirrxoz(float l,float m,float n,float tranm[][4]);
void mirryoz(float l,float m,float n,float tranm[][4]);
void shearing(float a,float b,float c,float d,float e,float f,float tranm[][4]);
tranm[3][0]=l;
tranm[3][1]=m;
tranm[3][2]=n;
}
void scaling(float sx,float sy,float sz,fltm(tranm);
tranm[0][0]=sx;
tranm[1][1]=sy;
tranm[2][2]=sz;
}
void rotationx(float xc,float yc,float zc,float alfa,float tranm[][4])
{
initm(tranm);
tranm[1][1]=cos(rad*alfa);
tranm[1][2]=sin(rad*alfa);
tranm[2][1]=-tranm[1][2];
v[NUMBER]={20.,60.,60.,0.,0.,20.,20.,20.,20.,20.,0.,0.,20.,20.,60.,60.,60.,60.,60.,60.,0.,0.,0.,0.},
w[NUMBER]={30.,30.,0.,0.,90.,90.,30.,30.,90.,90.,90.,90.,90.,30.,30.,0.,0.,30.,30.,0.,0.,0.,0.,90.};
else
{
if(lk==0)
setlinestyle(USERBIT_LINE,0xFFFF,3);
else
setlinestyle(USERBIT_LINE,0xFFFF,3);
lineto((int)x,(int)y);
}
}
void initm(float unitm[][4])
{
int n;
for(n=0;n<4;n++)
{
unitm[n][0]=0;
unitm[n][1]=0;
unitm[n][2]=0;
unitm[n][3]=0;
unitm[n][n]=1;
}
}
void mult4x4(float ma[][4],float mb[][4],float mc[][4])
{
int mi,mj,mk;
for(mi=0;mi<4;mi++)
void projecty(float i,float m,float n,float tranm[][4]);
void projectz(float i,float m,float n,float tranm[][4]);
void mirrxoy(float l,float m,float n,float tranm[][4]);
int ipen[NUMBER]={3,2,2,2,2,2,2,2,2,2,3,2,2,3,2,2,2,3,2,3,2,2,3,2};
int kind[NUMBER]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1};
void draw(float sf,float xc,float yc,float tranm[][4]);
getch();
axono2d(sf,xc,yc,-45.,35.2667,u1,v1,w1,ipen,kind,m);
}
void axono2d(float sf,float ox,float oy,float bta,float afa,float x[],float y[],float z[],int kp[],int kl[],int mp)
h=tranm[0][3]*x0+tranm[1][3]*y0+tranm[2][3]*z0+tranm[3][3];
(*x)=xu/h;
(*y)=yv/h;
(*z)=zw/h;
}
void translation(float l,float m,float n,float tranm[][4])
{
initm(tranm);
draw(1.,320.,240.,tm);
getch();
closegraph();
}
void draw(float sf,float xc,float yc,float tranm[][4])
{
int i,m=NUMBER;
float *px,*py,*pz,xu,yv,zw;
float u1[NUMBER],v1[NUMBER],w1[NUMBER];
{
float xu,yv,zw,h;
xu=tranm[0][0]*x0+tranm[1][0]*y0+tranm[2][0]*z0+tranm[3][0];
yv=tranm[0][1]*x0+tranm[1][1]*y0+tranm[2][1]*z0+tranm[3][1];
zw=tranm[0][2]*x0+tranm[1][2]*y0+tranm[2][2]*z0+tranm[3][2];
main()
{
int j,m=NUMBER;
int gd=DETECT,gm;
float tm[4][4]={0.};
initgraph(&gd,&gm,"d:\\tc");
settextstyle(3,0,2);
outtextxy(170,4,"3D GRAPFICS TRANSFORMATION");
draw(1.,320.,240.,tm);
}
for(j=1;j<=15;j++)
{
setcolor(j);
rotationy(0.,0.,10.,24.*j,tm);
draw(1.,320.,240.,tm);
}
for(j=1;j<=15;j++)
{
setcolor(j);
rotationz(0.,0.,10.,24.*j,tm);
void initm(float unitm[][4]);
void mult4x4(float ma[][4],float mb[][4],float mc[][4]);
void transform(float x0,float y0,float z0,float *x,float *y,float *z,float tranm[][4]);
void axono2d(float sf,float ox,float oy,float bta,float afa,float x[],float y[],float z[],int kp[],int kl[],int mp);
void plot(float x,float y,int ip,int lk);
相关文档
最新文档