一 实验目的

  1. 编写图形各种变换的算法

二 实验内容

1:自行设计基本图案,完成1-5种简单变换

实验结果如下图所示:
图形初始化:

第一次点击左键,实现平移变换:

第二次点击左键,实现比例变换(同时伴有平移变换):

第三次点击左键,实现对称变换(以平行y轴方向的直线为对称轴):

第四次点击左键,实现对称变换(以平行x轴方向的直线为对称轴):

第五次点击左键,实现错切变换(沿x轴方向关于y错切):

第六次点击左键,实现错切变换(沿y轴方向关于x错切):

2:在实验题3-1的基础上实现多步复合变换,设计动画效果

代码来源:https://blog.csdn.net/weixin_42815846/article/details/113099023

实验结果如下图所示:
初始化界面:

按任意键后出现动画效果:

三 程序说明

最终的实验代码如下表所示:

1题

//

// 程序名称:实验3-1

// 功    能:实现预设图像的平移变换、比例变换等变换

// 编译环境:VS2019,EasyX_20220116

// 最后修改:2022-4-5

#include <graphics.h>

#include <conio.h>

#include <iostream>

#include <math.h>

using namespace std;

#define pi 3.1415926535

int main() {

POINT t1[] = { {200,200} , {200,20} , {220,80} };

POINT t2[] = { {200,200} , {200,20} , {180,80} };

int len = 3;

float Tx = 50, Ty = 50;//平移

float Sx = 0.5, Sy = 0.5;//比例

float angle = 45 * pi / 180;//旋转,没做出来QwQ

float C = 0.5, B = -0.5;//错切

//initialize graph

initgraph(640, 480);

//勾画初始图案

setfillcolor(RED);

fillpolygon(t1, 3);

polygon(t2, 3);

//record the times of changing

int times = 0;

ExMessage m;

//全是单步变换。

while (1) {

m = getmessage(EX_MOUSE | EX_KEY);

float cur1x[3], cur1y[3], cur2x[3], cur2y[3];

//平移

if (m.message == WM_LBUTTONDOWN && times == 0) {

for (int i = 0; i < len; i++) {

t1[i].x += Tx;

t1[i].y += Ty;

t2[i].x += Tx;

t2[i].y += Ty;

}

setfillcolor(RED);

fillpolygon(t1, 3);

polygon(t2, 3);

times++;

}

//比例

else if (m.message == WM_LBUTTONDOWN && times == 1) {

for (int i = 0; i < len; i++) {

t1[i].x += 50;

t2[i].x += 50;

}

//以一顶点为缩放点

for (int i = 1; i < len; i++) {

t1[i].x = Sx * (t1[i].x - t1[0].x) + t1[0].x;

t2[i].x = Sx * (t2[i].x - t2[0].x) + t2[0].x;

t1[i].y = Sy * (t1[i].y - t1[0].y) + t1[0].y;

t2[i].y = Sy * (t2[i].y - t2[0].y) + t2[0].y;

}

setfillcolor(RED);

fillpolygon(t1, 3);

polygon(t2, 3);

times++;

}

//对称 about x axis

else if (m.message == WM_LBUTTONDOWN && times == 2) {

float mid = t1[0].y;

for (int i = 0; i < len; i++) {

t1[i].y = 2 * mid - t1[i].y;

t2[i].y = 2 * mid - t2[i].y;

}

setfillcolor(RED);

fillpolygon(t1, 3);

polygon(t2, 3);

times++;

}

//对称 about y axis

else if (m.message == WM_LBUTTONDOWN && times == 3) {

float midx = t1[2].x;

for (int i = 0; i < len; i++) {

t1[i].x = 2 * midx - t1[i].x;

t2[i].x = 2 * midx - t2[i].x;

//float cur1x[3], cur1y[3], cur2x[3], cur2y[3];

cur1x[i] = t1[i].x;

cur1y[i] = t1[i].y;

cur2x[i] = t2[i].x;

cur2y[i] = t2[i].y;

}

setfillcolor(RED);

fillpolygon(t1, 3);

polygon(t2, 3);

times++;

}

//错切 沿x轴方向关于y错切(x = x + cy)

else if (m.message == WM_LBUTTONDOWN && times == 4) {

for (int i = 0; i < len; i++) {

t1[i].x += C * t1[i].y;

t2[i].x += C * t2[i].y;

}

setfillcolor(RED);

fillpolygon(t1, 3);

polygon(t2, 3);

times++;

}

//错切 沿y轴方向关于x错切(y = y + bx)

else if (m.message == WM_LBUTTONDOWN && times == 5) {

for (int i = 0; i < len; i++) {

/*

//float cur1x[3], cur1y[3], cur2x[3], cur2y[3];

cur1x[i] = t1[i].x;

cur1y[i] = t1[i].y;

cur2x[i] = t2[i].x;

cur2y[i] = t2[i].y;

*/

//t1[i].y += B * t1[i].x;

//t2[i].y += B * t2[i].x;

t1[i].y = cur1y[i] + B * cur1x[i];

t1[i].x = cur1x[i];

t2[i].y = cur2y[i] + B * cur2x[i];

t2[i].x = cur2x[i];

}

setfillcolor(RED);

fillpolygon(t1, 3);

polygon(t2, 3);

times++;

}

}

_getch();

closegraph();

return 0;

}

2题

//

// 程序名称:实验3-2

// 功    能:实现预设图像的复合变换

// 编译环境:VS2019,EasyX_20220116

// 最后修改:2022-4-5

#include <graphics.h>

#include <conio.h>

#include <iostream>

#include <math.h>

#include <malloc.h>

#include <stdio.h>

using namespace std;

#define PI 3.1415926535

int dimension = 3, num = 4;

double points[50][2] = { {150,150},{150,200},{200,200},{200,150} };

//初始化

void initialize() {

initgraph(800, 640);

setbkcolor(WHITE);

setcolor(WHITE);

fillrectangle(0, 0, 800, 640);

setcolor(BLACK);

line(0, 80, 800, 80);

setcolor(BLACK);

line(0, 80, 800, 80);

//说明框矩形

RECT r = { 0,0,800,80 };

drawtext(_T("\n\n依次展示旋转,放大,平移,关于直线对称,关于x错切"), &r, DT_CENTER | DT_VCENTER);

HRGN rgn = CreateRectRgn(1, 81, 799, 639);

setcliprgn(rgn);

setcolor(BLACK);

rectangle(0, 0, 800, 640);

setcolor(RED);

}

//矩阵乘法

void multiply(double a[5][5], int ar, int ac, double b[5][5], int br, int bc) {

if (ac != br) {

cout << "matrix invalid";

return;

}

double c[5][5];

for (int i = 0; i < ar; i++) {

for (int j = 0; j < bc; j++) {

c[i][j] = 0;

}

}

for (int i = 0; i < ar; i++) {

for (int j = 0; j < bc; j++) {

for (int k = 0; k < ac; k++) {

c[i][j] += a[i][k] * b[k][j];

}

}

}

for (int i = 0; i < ar; i++) {

for (int j = 0; j < bc; j++) {

b[i][j] = c[i][j];

}

}

}

//平移变换

void trans(double tx, double ty) {

double T[5][5] = { {1,0,tx},{0,1,ty},{0,0,1} };

double point[5][5];

for (int i = 0; i < num; i++) {

point[0][0] = points[i][0];

point[1][0] = points[i][1];

point[2][0] = 1;

multiply(T, dimension, dimension, point, dimension, 1);

points[i][0] = point[0][0];

points[i][1] = point[1][0];

}

}

//旋转变换

void rotate(double degree) {

double theta = degree / 180 * PI;

double R[5][5] = { {cos(theta),-sin(theta),0},{sin(theta),cos(theta),0},{0,0,1} };

double point[5][5];

for (int i = 0; i < num; i++) {

point[0][0] = points[i][0];

point[1][0] = points[i][1];

point[2][0] = 1;

multiply(R, dimension, dimension, point, dimension, 1);

points[i][0] = point[0][0];

points[i][1] = point[1][0];

}

}

//缩放变换

void scale(double sx, double sy) {

double S[5][5] = { {sx,0,0},{0,sy,0},{0,0,1} };

double point[5][5];

for (int i = 0; i < num; i++) {

point[0][0] = points[i][0];

point[1][0] = points[i][1];

point[2][0] = 1;

multiply(S, dimension, dimension, point, dimension, 1);

points[i][0] = point[0][0];

points[i][1] = point[1][0];

}

}

//对称变换

void symmetry(int flag) {

if (flag == 0) {

for (int i = 0; i < num; i++) {

points[i][1] = -points[i][1];

}

}

else if (flag == 1) {

for (int i = 0; i < num; i++) {

points[i][0] = -points[i][0];

}

}

else {

return;

}

}

void anysymmetry(int x1, int y1, int x2, int y2) {

double k = 0, b = 0;

if (x1 == x2) {

trans(-x1, 0);

symmetry(1);

trans(x1, 0);

}

else if (y1 == y2) {

trans(0, -y1);

symmetry(0);

trans(0, y1);

}

else {

k = double((y1 - y2) / (x1 - x2));

b = y1 - k * x1;

trans(0, -b);

rotate(-atan(k) * 180 * 1.0 / PI);

symmetry(0);

rotate(atan(k) * 180 * 1.0 / PI);

trans(0, b);

}

}

//输出图形

void paint() {

for (int i = 0; i < num; i++) {

if (i == num - 1) {

line(points[i][0], points[i][1], points[0][0], points[0][1]);

break;

}

line(points[i][0], points[i][1], points[i + 1][0], points[i + 1][1]);

}

}

//错切变换

void cut(int flag, int degree) {

double point[5][5];

if (flag == 0) {

double C[5][5] = { {1,0,0},{tan(double(degree) / 180 * PI),1,0},{0,0,1} };

for (int i = 0; i < num; i++) {

point[0][0] = points[i][0];

point[1][0] = points[i][1];

point[2][0] = 1;

multiply(C, dimension, dimension, point, dimension, 1);

points[i][0] = point[0][0];

points[i][1] = point[1][0];

}

}

else if (flag == 1) {

double C[5][5] = { {1,tan(double(degree) / 180 * PI),0},{0,1,0},{0,0,1} };

for (int i = 0; i < num; i++) {

point[0][0] = points[i][0];

point[1][0] = points[i][1];

point[2][0] = 1;

multiply(C, dimension, dimension, point, dimension, 1);

points[i][0] = point[0][0];

points[i][1] = point[1][0];

}

}

else if (flag == 2) {

double C[5][5] = { {1,tan(double(degree) / 180 * PI),0},{tan(double(degree) / 180 * PI),1,0},{0,0,1} };

for (int i = 0; i < num; i++) {

point[0][0] = points[i][0];

point[1][0] = points[i][1];

point[2][0] = 1;

multiply(C, dimension, dimension, point, dimension, 1);

points[i][0] = point[0][0];

points[i][1] = point[1][0];

}

}

else {

return;

}

}

//复合变换

void multitrans() {

paint();

int i = 50;

while (i > 0) {

i--;

Sleep(50);

clearcliprgn();

trans(-150, -150);

rotate(-20);

trans(150, 150);

paint();

}

i = 8;

while (i > 0) {

i--;

Sleep(250);

scale(1.1, 1.1);

clearcliprgn();

paint();

}

i = 40;

while (i > 0) {

i--;

Sleep(50);

trans(-1, -1);

clearcliprgn();

paint();

}

i = 4;

while (i > 0) {

i--;

Sleep(250);

anysymmetry(250, 100, 300, 560);

clearcliprgn();

setcolor(BLACK);

line(250, 100, 300, 560);

setcolor(RED);

paint();

}

i = 20;

while (i > 0) {

i--;

Sleep(150);

cut(0, 1);

clearcliprgn();

paint();

}

}

//主函数

int main() {

initialize();

_getch();

multitrans();

_getch();

closegraph();

return 0;

}

【计算机图形学】图形变换(平移变换、比例变换、旋转变换、对称变换、错切变换、复合变换)相关推荐

  1. 计算机图形学图形旋转_计算机图形学翻译

    计算机图形学图形旋转 计算机图形学| 翻译 (Computer Graphics | Translations) Transformation techniques mean to modify th ...

  2. 计算机图形学 | 图形思维的起点——朴素的软光栅

    计算机图形学 | 图形思维的起点--朴素的软光栅 计算机图形学 | 图形思维的起点--朴素的软光栅 4.1 初次尝试--点和直线 扫描转换的概念 点 直线 数值微分算法 中点的Bresenham算法 ...

  3. 计算机图形学图形旋转_计算机图形学中的平板显示

    计算机图形学图形旋转 平板显示器 (Flat Panel Display) It is generally known as FPD, the flat-panel display is such a ...

  4. 计算机图形学图形旋转_计算机图形学中的旋转

    计算机图形学图形旋转 计算机图形学| 回转 (Computer Graphics | Rotation) Rotation is a type of transformation that is ve ...

  5. 7、计算机图形学——图形管线渲染与纹理映射

    一.图形渲染管线 管线渲染其实就是将三维物体如何呈现到计算机屏幕上的过程,图形渲染管线的整体大致流程如下 顶点处理过程就是进行MVP变换,最终得到一系列的二维坐标点.而三角化就是将这一系列的二维坐标点 ...

  6. 计算机图形学入门(二)-线性代数部分知识2视图变换和投影变换

    本章主要进行了视图/相机变换的求解,和两种投影变换的求解(正交投影.透视投影),并且简单的完善了3D旋转变换的介绍. 主要的学习过程来自下面的视频,本文只会有主要的基础内容,默认一些知识大家是掌握的, ...

  7. 计算机图形学 图形变换

    基础 图形的几何变换是指对图形的几何信息经过平移.比例.旋转等变换后产生新的图形 向量基础知识 图形坐标系 图形变换的目的 图形变换的基本原理  仿射变换 齐次坐标 二维图形变换 平移 比例/缩放 旋 ...

  8. 计算机图形学算法总结

    图形学算法总结 文章目录 图形学算法总结 直线生成算法 数值微分法(DDA) 中点画线法 Bresenham算法 圆弧生成算法 中点Bresenham画圆法 多边形填充算法 逐点判断法 1)射线法 2 ...

  9. 【计算机图形学】小白谈计算机图形学(四)二维三维图形变换—1

    小白谈计算机图形学(四)二维三维图形变换-1 窗口与视图 二维图形的几何变换 平移变换 比例变换 旋转变换 二维图形变换的矩阵表示 三种变换 齐次坐标变换 原二维线性变换 齐次坐标法 复合变换 例题: ...

  10. 计算机图形学 第六章 图形变换

    计算机图形学 第六章 图形变换 这章一般只考一道题(10分左右) 数学基础 (都是线性代数的知识,这里略写) 齐次坐标: 将一个原本是 nnn 维的向量用一个 n+1n+1n+1 维向量来表示 如 ( ...

最新文章

  1. 2019 ICPC Asia Nanjing Regional C.Digital Path(拓扑排序递推DP)
  2. c语言实现天气预报步骤,一份天气预报的制作历程
  3. 哈希表(等概率下)平均查找长度(转)
  4. 进制转换 D进制的 A + B
  5. HTTP解决设置返回header的code码为400仍然是200的问题
  6. 薄壁轴承摩擦力矩_机器人四点接触薄壁轴承详细介绍
  7. ORACLE基础应用学习-- 各种故障的恢复方法总结
  8. [svc]jdk+tomcat部署.jforum论坛部署
  9. Redis 的 4 大法宝,2018 必学中间件
  10. leetcode题解200-岛屿数量
  11. jquery值ajaxForm
  12. fatal error LNK1281: 无法生成 SAFESEH 映像
  13. java定时任务 cron
  14. 【MindSpore易点通机器人-01】你也许见过很多知识问答机器人,但这个有点不一样
  15. Nginx学习使用记录
  16. r 对一列计数_根据另一列对项目进行计数
  17. AVAudioPlayer实现音乐播放+歌词与播放进度同步
  18. IE浏览器被2345网址导航劫持
  19. 获取html元素的高,获取HTML元素的高度jQuery
  20. 京东网页制作之TAB切换栏(内含jquary筛选器介绍)

热门文章

  1. 荧光生物标记物5-FAM-Alkyne,CAS:510758-19-7
  2. python参数化字符串,【python接口自动化】- 正则用例参数化
  3. JavaScript操作Excel
  4. net core 3.1 发送邮件
  5. 王道辅导书中代码LinkList L中的作用
  6. 宜盟费控-成长型企业首选的移动报销及费控解决方案
  7. win10计算机使用痕迹,win10系统彻底清除电脑使用痕迹的操作方法
  8. pc端钉钉认证二维码扫码登录
  9. 怎样将表格拆分为多个独立工作簿
  10. Virtual Router – 为易用而生的虚拟WiFi热点 (虚拟路由器)