【计算机图形学】三维图形投影和消隐(正等轴测投影图 & 消隐图构造)

模块4-2 三维图形投影和消隐

一 实验目的

  1. 编写三维图形各种变换的投影或消隐算法

二 实验内容

1:自行选择三维物体(不能选长方体),建立坐标系,给定点的三维坐标值,建立边表结构,完成正等轴测投影图。

实验结果如下图所示:

2:自行选择三维物体(不能选长方体),建立坐标系,给定点的三维坐标值,画出三维物体的消隐图。


实验结果如下图所示:

 

三 程序说明

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

2

//

// 程序名称:消隐图

// 功    能:实现预设三维物体的消隐图。

// 编译环境:VS2019,EasyX_20220116

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

#include <graphics.h>     

#include <conio.h>

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

using namespace std;

//顶点表

float point[20][4] = {

    {0,0,150,1},//0

    {250,0,150,1},//1

    {250,0,50,1},//2

    {300,0,50,1},//3

    {300,0,0,1},//4

    {300,200,0,1},//5

    {0,200,0,1},//6

    {0,200,100,1},//7

    {0,150,100,1},//8

    {0,150,150,1},//9

    {50,150,150,1},//10

    {50,50,150,1},//11

    {250,50,150,1},//12

    {250,50,50,1},//13

    {150,50,50,1},//14

    {150,200,50,1},//15

    {100,200,100,1},//16

    {100,150,100,1},//17

    {300,200,50,1},//18

    {0,0,0,1}//19

};

//环表

int ring[72] = {

    //parallel XOY

    0,1,12,11,10,9,0,//visible

    8,17,16,7,8,//visible

    2,3,18,15,14,13,2,//visible

    4,19,6,5,4,//invisible

    //parallel XOZ

    1,2,3,4,19,0,1,//invisible

    12,13,14,11,12,//visible

    10,17,8,9,10,//visible

    5,6,7,16,15,18,5,//visible

    //parallel YOZ

    1,2,13,12,1,//visible

    0,9,8,7,6,19,0,//invisible

    3,4,5,18,3,//visible

    //slope

    11,10,17,16,15,14,11 //visible

};

//面表

int surface[12][2] = {

    //parallel XOY

    {0,6},{7,11},{12,18},{19,23},

    //parallel XOZ

    {24,30},{31,35},{36,40},{41,47},

    //parallel YOZ

    {48,52},{53,59},{60,64},

    //slope

    {65,71}

};

//矩阵乘法,a*b=c,a[m][n],b[n][q],c[m][q]

void MatrixMultiplication(float a[20][4], float b[4][4], float c[20][4]) {

    int i = 0, j = 0, k = 0;

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

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

             c[i][j] = 0;

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

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

             }

         }

    }

}

//主函数

int main() {

    //float point[20][4]

    //int ring[72]

    //int surface[12][2]

    int i, j, start, end;

    //正等轴测向量

    float zdz[4][4] = { {0.707,0,-0.408,0},{-0.707,0,-0.408,0},{0,0,0.8165,0},{0,0,0,1} };

    //备份顶点集

    float point1[20][4];

    double x1, x2, x3, z1, z2, z3;

    //E

    double valueE[12];

    //矩阵乘法=>正等轴测

    MatrixMultiplication(point, zdz, point1);

    initgraph(1000, 700);

    //移动x坐标和y坐标

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

         point1[i][0] = 500 - point1[i][0] * 1.2;//220

         point1[i][2] = 350 - point1[i][2] * 1.2;//140

    }

    //求E的值

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

         j = surface[i][0];

         x1 = point1[ring[j]][0];

         x2 = point1[ring[j + 1]][0];

         x3 = point1[ring[j + 2]][0];

         z1 = point1[ring[j]][2];

         z2 = point1[ring[j + 1]][2];

         z3 = point1[ring[j + 2]][2];

         valueE[i] = (z2 - z1) * (x3 - x2) - (x2 - x1) * (z3 - z2);

    }

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

         if (valueE[i] >= 0) {

             start = surface[i][0];

             end = surface[i][1];

             for (j = start; j < end; j++) {

                  line(point1[ring[j]][0], point1[ring[j]][2], point1[ring[j + 1]][0], point1[ring[j + 1]][2]);

             }

         }

    }

    _getch();

    closegraph();

    return 0;

}

1

//

// 程序名称:正等轴测投影图

// 功    能:实现预设三维物体的正等轴测投影图。

// 编译环境:VS2019,EasyX_20220116

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

#include <graphics.h>

#include <conio.h>

#include <iostream>

#include <math.h>

using namespace std;

//和分割线之间的距离

const int gap = 50;

//预设三维体的点坐标

int X[33] = { 0,0,0,0,0,0,0,0,100,100,0,100,100,100,100,100,100,100,100,0,0,0,0,100,100,100,100,0,0,0,0,100,100 };

int Y[33] = { 0,0,250,250,200,150,0,0,0,0,0,0,150,200,250,250,0,0,150,150,0,150,200,200,150,200,250,250,200,250,250,250,250 };

int Z[33] = { 100,0,0,50,50,100,100,0,0,100,100,100,100,50,50,0,0,100,100,100,100,100,50,50,100,50,50,50,50,50,0,0,50 };

//顶点总数

const int num = 33;

//正等轴测图绘制

void fun() {

    POINT* p = new POINT[num];

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

         p[i].x = 0.7071 * X[i] - 0.7071 * Y[i] + 500;

         p[i].y = 0.4082 * X[i] + 0.4082 * Y[i] - 0.8165 * Z[i] + 350;

    }

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

         setcolor(YELLOW);

         line(p[i].x, p[i].y, p[i + 1].x, p[i + 1].y);

    }

    free(p);

}

int main() {

    initgraph(1000, 700);

    //调用函数

    fun();

    _getch();

    closegraph();

    return 0;

}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是计算机图形学中关于三维变换与投影的常见问题及其答案: 1. 什么是三维变换? 三维变换是指对三维空间中的对象进行平移、旋转、缩放等操作,以改变其在三维空间中的位置、方向和大小。 2. 三维变换有哪些类型? 三维变换包括平移变换、旋转变换、缩放变换、剪切变换等。 3. 三维变换如何表示? 三维变换可以使用矩阵来表示。通常使用4x4的变换矩阵,其中前三行表示变换后的x、y、z坐标轴,第四行表示平移向量。 4. 什么是视变换? 视变换是指将三维物体从不同的角度和位置观察时的变换。常用的视变换包括平移、旋转、缩放和投影等。 5. 什么是投影变换? 投影变换是将三维物体投影到二维平面上的过程。常用的投影方式包括正交投影和透视投影。 6. 正交投影和透视投影有什么区别? 正交投影是指将物体投影到一个平行于某个坐标轴的平面上,物体在投影后大小不会改变。透视投影是指将物体投影到一个斜截面上,物体在投影后大小会发生变化。 7. 什么是视口变换? 视口变换是将投影后的像映射到屏幕上的过程。视口变换通常包括平移、缩放和旋转等操作。 8. 三维变换和投影计算机图形学中有什么应用? 三维变换和投影计算机图形学中广泛应用于三维建模、游戏开发、动画制作、虚拟现实等领域。通过对三维物体进行变换和投影,可以实现逼真的三维场景渲染,提高用户的交互体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MorleyOlsen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值