【计算机图形学】图形变换(以任意直线为对称轴的对称变换)

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

模块3-2 图形变换

一 实验目的

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

二 实验内容

1:任意直线的对称变换。要求将变换矩阵写在实验报告中,并与代码匹配。求对任意直线Ax+By+C=0的对称变换矩阵。

实验结果如下图所示:

【计算机图形学】图形变换(以任意直线为对称轴的对称变换)
1:预设图形初始化

【计算机图形学】图形变换(以任意直线为对称轴的对称变换)
2:鼠标左键点击直线起点

【计算机图形学】图形变换(以任意直线为对称轴的对称变换)
3:鼠标右键点击直线终点

【计算机图形学】图形变换(以任意直线为对称轴的对称变换)
4:继续添加对称情况

求对任意直线Ax+By+C=0的对称变换矩阵:

对于任意直线Ax + By + C = 0,对称变换矩阵为M = (1-2A^2/(A^2+B^2), -2AB/(A^2+B^2), -2AC/(A^2+B^2); -2AB/(A^2+B^2), 1-2B^2/(A^2+B^2), -2BC/(A^2+B^2); 0, 0, 1),其中A和B不同时为0。

1-2A^2/(A^2+B^2)

-2AB/(A^2+B^2)

-2AC/(A^2+B^2)

-2AB/(A^2+B^2)

1-2B^2/(A^2+B^2)

-2BC/(A^2+B^2)

0

0

1

三 程序说明

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

1

//

// 程序名称:任意直线对称变换

// 功    能:实现图形以任意直线为基准的对称变换

// 编译环境:VS2019,EasyX_20220116

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

#include <graphics.h>

#include <conio.h>

#include <iostream>

#include <math.h>

using namespace std;

double points[4][2] = { {150,150},{150,300},{300,300},{300,150} };

const double newpoints[4][2] = { {150,150},{150,300},{300,300},{300,150} };

int num = 4, dimension = 3;

#define PI 3.1415927

//旋转变换

void rotate(double degree);

//平移变换

void trans(double tx, double ty);

//矩阵乘法

void mutiply(double a[5][5], int ar, int ac, double b[5][5], int br, int bc);

//画图函数

void paint();

//任意对称变换

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

//坐标轴对称变换

void symmetry(int flag);

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 = 1.0 * (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);

    }

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

void symmetry(int flag) {

    int i;

    if (flag == 0) {

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

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

         }

    }

    else if (flag == 1) {

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

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

         }

    }

    else {

         return;

    }

}

void paint() {

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

         if (i == num - 1) {

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

             break;

         }

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

    }

}

void rotate(double degree) {

    double sita = 1.0 * degree / 180 * PI;

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

    double point[5][5];

    int i;

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

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

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

         point[2][0] = 1;

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

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

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

    }

}

void trans(double tx, double ty) {

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

    double point[5][5];

    int i;

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

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

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

         point[2][0] = 1;

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

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

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

    }

}

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

    int i, j, k;

    double c[5][5];

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

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

             c[i][j] = 0;

         }

    }

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

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

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

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

             }

         }

    }

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

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

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

         }

    }

}

int main() {

    initgraph(1000, 800);

    ExMessage m;

    //绘画初始矩形

    setcolor(WHITE);

    rectangle(points[0][0], points[0][1], points[2][0], points[2][1]);

    int x0, y0, x1, y1;

    while (1) {

         m = getmessage(EX_MOUSE | EX_KEY);

         switch (m.message) {

             case WM_LBUTTONDOWN:

                  x0 = m.x;

                  y0 = m.y;

                  //画直线起点

                  setlinecolor(WHITE);

                  setfillcolor(GREEN);

                  fillrectangle(m.x - 3, m.y - 3, m.x + 3, m.y + 3);

                  break;

             case WM_RBUTTONDOWN:

                  x1 = m.x;

                  y1 = m.y;

                  //画直线终点

                  setlinecolor(WHITE);

                  setfillcolor(GREEN);

                  fillrectangle(m.x - 3, m.y - 3, m.x + 3, m.y + 3);

                  //处理直线

                  line(x0, y0, x1, y1);

                  anysymmetry(x0, y0, x1, y1);

                  paint();

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

                      points[0][0] = newpoints[0][0];

                      points[0][1] = newpoints[0][1];

                      points[1][0] = newpoints[1][0];

                      points[1][1] = newpoints[1][1];

                      points[2][0] = newpoints[2][0];

                      points[2][1] = newpoints[2][1];

                      points[3][0] = newpoints[3][0];

                      points[3][1] = newpoints[3][1];

                  }

                  break;

             case WM_KEYDOWN:

                  if (m.vkcode == VK_ESCAPE) {

                      return 0;

                  }

        }

    }

    _getch();

    closegraph();

    return 0;

}

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

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

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

相关文章

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

    一 实验目的 编写图形各种变换的算法 二 实验内容 1 :自行设计基本图案,完成1-5种简单变换 实验结果如下图所示: 图形初始化: 第一次点击左键,实现平移变换:     第二次点击左键,实现比例变换(同时伴有平移变换):   第三次点击左键,实现对称变换(以平行

    2024年02月05日
    浏览(32)
  • 计算机图形学 | 变换与观察

    华中科技大学《计算机图形学》课程 MOOC地址:计算机图形学(HUST) 回顾几何阶段 整体流程: 这其中存在3种变换: 坐标系的变换 模型本身的运动 观察者的运动 几何变换 以上各种变换都可以通过以下变换的复合来计算: 平移 比例 旋转 对称 错切 图形的几何变换是指对图

    2023年04月27日
    浏览(35)
  • 【计算机图形学01】坐标变换

             将坐标变换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分步进行的,也就是类似于流水线那样子。在流水线中,物体的顶点在最终转化为屏幕坐标之前还会被变换到多个坐标系统(Coordinate System)。将物体的坐标变换到几个 过渡 坐标系(Intermediate Coor

    2024年02月10日
    浏览(31)
  • 计算机图形学(三) -- 3D 变换

    同样引入齐次坐标: 3D 点 = ( x , y , z , 1 ) T (x, y, z, 1)^T ( x , y , z , 1 ) T 3D 向量 = ( x , y , z , 0 ) T (x, y, z, 0)^T ( x , y , z , 0 ) T 通常, ( x , y , z , w ) (x, y, z, w) ( x , y , z , w ) (w != 0) 表示一个坐标为 ( x / w , y / w , z / w ) (x/w, y/w, z/w) ( x / w , y / w , z / w ) 的 3D 点 用一个 4x4 的矩阵来表示

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

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

    2024年02月11日
    浏览(29)
  • 计算机图形学头歌实训平台答案——CG1-v2.0-直线绘制

    1.本关任务 (1)根据直线DDA算法补全line函数,其中直线斜率0k1; (2)当直线方程恰好经过P(x,y)和T(x,y+1)的中点M时,统一选取直线上方的T点为显示的像素点。 2.输入 (1)直线两端点坐标:(13, 20)和(180,140); (2)直线颜色为白色。 3.输出 程序运行结果为一条直线,具体结果如下图所示:

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

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

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

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

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

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

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

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

    2023年04月08日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包