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

这篇具有很好参考价值的文章主要介绍了【计算机图形学】图形变换(平移变换、比例变换、旋转变换、对称变换、错切变换、复合变换)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 实验目的

  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;

}文章来源地址https://www.toymoban.com/news/detail-445693.html

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;

}

到了这里,关于【计算机图形学】图形变换(平移变换、比例变换、旋转变换、对称变换、错切变换、复合变换)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机图形学 | 实验六:旋转立方体

    华中科技大学《计算机图形学》课程 MOOC地址:计算机图形学(HUST) 在正式搭建环境之前,我们先来介绍一下读完下面的部分你会了解些什么。 绘制出旋转立方体需要的新知识 认识一些 OpenGL的新功能 接下来,我们来介绍一下绘制旋转立方体。绘制效果如下: Z-缓存(Z-Buff

    2024年02月06日
    浏览(39)
  • 计算机图形学:二维图形的几何变换(算法原理及代码实现)

    对于一个二维图形作平移、旋转、放缩变换,可以转换为在二维坐标系中图形的所有点分别可以对应到在x,y轴方向分别平移tx,ty(平移)、绕一点旋转固定的角(旋转)、在x,y轴方向分别放缩sx,sy倍。 对于变换的原理,只需要将原图形的点通过极坐标或者相加、相乘,再

    2024年02月11日
    浏览(29)
  • 计算机图形学基础:2D/3D坐标变换(Transformation)

    本文讲解了2D变换和3D变换式如何用矩阵表示的 如何将线性和非线性变换进行一个统一表示形式 三维物体在二维空间上的映射 表示向量添加了一维,分别表示单位距离和平移不变形的方向 旋转默认都是以(0, 0)为中心

    2023年04月08日
    浏览(28)
  • 计算机视觉 图像形成 几何图形和变换 3D到2D投影

            现在我们知道如何表示2D和3D几何图元以及如何在空间上转换它们,我们需要指定如何将 3D图元投影到图像平面上。 我们可以使用线性3D到2D投影矩阵来做到这一点。最简单的模型是正交法,它不需要除法就可以得到最终的(不均匀的)结果。更常用的模型是透视,

    2023年04月08日
    浏览(33)
  • 计算机图形图像技术(OpenCV核心功能、图像变换与图像平滑处理)

    1、显示图像 ①功能:在指定窗口中显示图像。 ②参数: name 为窗口的名字; image 为待显示的图像。 ③说明:可显示彩色或灰度的字节图像和浮点数图像,彩色图像数据按BGR顺序存储。 2、读入图像 ①功能:从指定文件读入图像。 ②参数: filename 为图像文件名,支持BMP、

    2024年02月03日
    浏览(37)
  • 计算机图形学,OpenGL编写的一个可实现旋转缩放移动的房间,内有数十种交互

    #include stdlib.h #includestdio.h #includewindows.h #include GL/glut.h #include math.h #include gl/GLU.h //颜色宏定义 #define white 1.0f, 1.0f, 1.0f #define black 0.0f, 0.0f, 0.0f #define red 1.0f, 0.0f, 0.0f #define blue 0.0f, 0.0f, 1.0f #define skyBlue 135.0/255.0, 206.0/255.0, 1.0f #define plum 1.0f, 187.0/255.0, 1.0f //浅紫色 #define pink 1.0f, 1

    2024年04月17日
    浏览(55)
  • 深度学习·理论篇(2023版)·第002篇深度学习和计算机视觉中的基础数学知识01:线性变换的定义+基于角度的线性变换案例(坐标变换)+点积和投影+矩阵乘法的几何意义+图形化精讲

    💕 恭喜本博客浏览量达到两百万,CSDN内容合伙人,CSDN人工智能领域实力新星~ 🧡 本文章为2021版本迭代更新版本,在结合有效知识的基础上对文章进行合理的增加,使得整个文章时刻顺应时代需要 🧡 本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理

    2023年04月08日
    浏览(43)
  • 【OpenCV】图像变换(缩放、平移、旋转、仿射)

    图像变换是指通过对图像进行缩放、平移、旋转、仿射、透视等变换来改变图像的形状和大小。在本篇博客中,我们将详细介绍OpenCV中的图像变换函数,并提供示例代码以帮助读者更好地理解这些函数的使用方法。 缩放变换是指通过改变图像的大小来改变图像的形状。在Op

    2024年02月07日
    浏览(39)
  • 二维坐标基本变换(平移、旋转、缩放、镜像、阵列)

    诸如图像、模型等的基本变换,实际上都是点坐标的变换,通过矩阵,可以非常方便的达到这个目的。在下文仅介绍二维坐标变换原理。 首先,定义点类如下: 注意,为了形式统一,变换矩阵应统一为3*3阶,同理,对于三维坐标变换矩阵应是4*4阶。关于矩阵的表示,实际上

    2024年02月04日
    浏览(64)
  • MATLAB图像处理之几何变换——平移与旋转

    可以发现,原图在原坐标基础上向X、Y方向分别平移了50和100个单位。但相应平移的部分也被遮挡了,显然这不符合一些场景的应用需求。 为此,MATLAB还提供了参数设置。在imtranslate函数中设置’OutputView’参数为’full’,即可防止遮挡平移的图像,如下图所示。 MATLAB在进行图

    2024年02月16日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包