图形变换算法

一、学习目的

(1)掌握多面体的存储方法。
(2)掌握图形的几何变换及投影变换。
(3)掌握三维形体不同投影方法的投影图的生成原理。
(4)掌握多面体投影图绘制的编程方法。

二、学习内容

(1)编程实现一个长方体的正轴测投影图。
(2)编程实现一个长方体的斜平行投影图。
(3)编程实现一个长方体的一点透视图。

三、基本算法


1. ​坐标系变换算法

  • 旋转矩阵构造
    用于将任意投影面对齐到标准坐标系(如XOY平面)。通过绕轴旋转(如绕X/Y/Z轴),结合 ​罗德里格斯旋转公式 或 ​欧拉角,生成旋转变换矩阵,使投影面法向量对齐目标轴(如Z轴)。
  • 平移变换
    将投影面平移到原点,简化投影计算。

2. ​投影矩阵算法

  • 正轴测投影
    通过正交投影矩阵移除深度坐标(Z轴),结合绕轴旋转实现立体效果。
  • 斜平行投影
    引入 ​错切矩阵​(Shear Matrix),沿某一轴向偏移深度坐标,模拟斜视角。
  • 一点透视投影
    构造 ​透视矩阵,引入灭点(Vanishing Point)。

四、具体代码

import numpy as np
import matplotlib.pyplot as pltclass Cube:def __init__(self, size=1):self.vertices = np.array([[0, 0, 0],[size, 0, 0],[size, size, 0],[0, size, 0],[0, 0, size],[size, 0, size],[size, size, size],[0, size, size]])self.edges = [[0, 1], [1, 2], [2, 3], [3, 0],[4, 5], [5, 6], [6, 7], [7, 4],[0, 4], [1, 5], [2, 6], [3, 7]]def orthographic_projection(self):return self.vertices[:, :2]def oblique_parallel_projection(self, alpha=np.pi/4, l=0.5):P = np.array([[1, 0, -l*np.cos(alpha)],[0, 1, -l*np.sin(alpha)],[0, 0, 0]])return np.dot(self.vertices, P.T)def one_point_perspective_projection(self, d=5):P = np.array([[1, 0, 0, 0],[0, 1, 0, 0],[0, 0, 1, 0],[0, 0, -1/d, 0]])homogeneous_vertices = np.hstack((self.vertices, np.ones((8, 1))))projected = np.dot(homogeneous_vertices, P.T)return (projected[:, :2].T / projected[:, 3]).Tdef plot_projection(self, projection, title):projected_vertices = projection()plt.figure()for edge in self.edges:plt.plot(projected_vertices[edge, 0], projected_vertices[edge, 1], 'b')plt.title(title)plt.axis('equal')plt.show()if __name__ == '__main__':cube = Cube()cube.plot_projection(cube.orthographic_projection, 'Orthographic Projection')cube.plot_projection(lambda: cube.oblique_parallel_projection(), 'Oblique Parallel Projection')cube.plot_projection(cube.one_point_perspective_projection, 'One-Point Perspective Projection')

五、运行结果

六、项目简介

# 立方体投影项目

## 项目概述

这个Python项目演示了立方体的三种不同投影方法:正交投影、斜平行投影和一点透视投影。

## 投影方法说明

1. **正交投影(Orthographic Projection)**: 直接忽略Z坐标,将3D点投影到XY平面

2. **斜平行投影(Oblique Parallel Projection)**: 保持平行线,但以一定角度显示

3. **一点透视投影(One-Point Perspective Projection)**: 模拟人眼看到的透视效果

## 运行要求

- Python 3.x

- NumPy

- Matplotlib

## 示例代码

```python

import numpy as np

import matplotlib.pyplot as plt

from cube_projections import Cube

cube = Cube()

cube.plot_projection(cube.orthographic_projection, 'Orthographic Projection')

```

## 预期输出

运行后会显示三个窗口,分别展示三种不同的立方体投影效果图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVAFX】自定义FXML 文件存放的位置以及使用

情况 1:FXML 文件与调用类在同一个包中(推荐) 假设类 MainApp 的包是 com.example,且 FXML 文件放在 resources/com/example 下: 项目根目录 ├── src │ └── sample │ └── Main.java ├── src/s…

Ubuntu20.04安装企业微信

建议先去企业微信官网看一下有没有linux版本,没有的话在按如下方式安装,不过现在是没有的。 方案 1、使用docker容器 2、使用deepin-wine 3、使用星火应用商店 4. 使用星火包deepin-wine 5、使用ukylin-wine 本人对docker不太熟悉,现…

CSS appearance 属性:掌握UI元素的原生外观

在现代网页设计中,为了达到一致的用户体验,我们有时需要让HTML元素模仿操作系统的默认控件样式。CSS中的appearance属性提供了一种简便的方式来控制这些元素是否以及如何显示其默认外观。本文将详细介绍appearance属性,并通过实际代码示例来展…

十四、C++速通秘籍—函数式编程

目录 上一章节: 一、引言 一、函数式编程基础 三、Lambda 表达式 作用: Lambda 表达式捕获值的方式: 注意: 四、函数对象 函数对象与普通函数对比: 五、函数适配器 1、适配普通函数 2、适配 Lambda 表达式 …

大模型Rag-指令调度

本文主要记录根据用户问题指令,基于大模型做Rag,匹配最相关描述集进行指令调度,可用于匹配后端接口以及展示答案及图表等。 1.指令查询处理逻辑 1.实现思路 指令识别:主要根据用户的问题q计算与指令描述集is [i0, ... , im]和指…

音视频学习 - ffmpeg 编译与调试

编译 环境 macOS Ventrua 13.4 ffmpeg 7.7.1 Visual Studio Code Version: 1.99.0 (Universal) 操作 FFmpeg 下载源码 $ cd ffmpeg-x.y.z $ ./configure nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.If you think configure made a mistake…

golang-常见的语法错误

https://juejin.cn/post/6923477800041054221 看这篇文章 Golang 基础面试高频题详细解析【第一版】来啦~ 大叔说码 for-range的坑 func main() { slice : []int{0, 1, 2, 3} m : make(map[int]*int) for key, val : range slice {m[key] &val }for k, v : …

音视频之H.265/HEVC预测编码

H.265/HEVC系列文章: 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 预测编码是视频编码中的核心技术之一。对于视频信号来说,一幅图像内邻近像素之间有着较强的空间相关性,相邻图像之…

基于政务问答的dify接口请求测试

Dify 的智能体后端服务 API 为开发者提供便捷方式,能让前端应用直接调用大语言模型能力。在请求时,需先前往应用左侧导航的 “API Access” 部分,在此可查看文档和管理访问凭据。为保障安全,API 密钥应通过后端调用,避…

VMware Workstation 保姆级 Linux(CentOS) 创建教程(附 iso)

文章目录 一、下载二、创建 一、下载 CentOS-7.9-x86_64-DVD-2009.iso 二、创建 VMware Workstation 保姆级安装教程(附安装包) VMware Workstation 保姆级安装教程(附安装包) VMware Workstation 保姆级安装教程(附安装包)

扩增子分析|基于R语言microeco包进行微生物群落网络分析(network网络、Zi-Pi关键物种和subnet子网络图)

一、引言 microeco包是福建农林大学姚敏杰教授团队开发的扩增子测序集成分析。该包综合了扩增子测序下游分析的多种功能包括群落组成、多样性、网络分析、零模型等等。通过简单的几行代码可实现复杂的分析。因此,microeco包发表以来被学界广泛关注,截止2…

GO语言-数据类型

文章目录 变量定义1. 整数类型2. 浮点类型3. 字符类型4. 布尔类型5. 字符串类型5.1 字符串的本质5.2 常用字符串处理函数(strings包)5.3 修改字符串的方式 6. 数据默认值7. 类型转换 变量定义 代码如下: package mainimport "fmt"var i1 1000 var i2 i…

线性代数 | 知识点整理 Ref 2

注:本文为 “线性代数 | 知识点整理” 相关文章合辑。 因 csdn 篇幅合并超限分篇连载,本篇为 Ref 2。 略作重排,未整理去重。 图片清晰度限于引文原状。 如有内容异常,请看原文。 【数学】线性代数知识点总结 阿巴 Jun 于 2024-…

JavaSE学习(前端初体验)

文章目录 前言一、准备环境二、创建站点(创建一个文件夹)三、将站点部署到编写器中四、VScode实用小设置五、案例展示 前言 首先了解前端三件套:HTML、CSS、JS HTML:超文本标记语言、框架层、描述数据的; CSS&#xf…

java + spring boot + mybatis 通过时间段进行查询

前端传来的只有日期内容&#xff0c;如&#xff1a;2025-04-17 需要在日期内容的基础上补充时间部分&#xff0c;代码示例&#xff1a; /*** 日志查询&#xff08;分页查询&#xff09;* param recordLogQueryDTO 查询参数对象* return 日志列表*/Overridepublic PageBean<…

解决ubuntu自带火狐浏览器无法播放视频问题

TIPS:一般执行完1 就可以了 首先安装必要的媒体编解码器和插件&#xff1a; # 安装常用媒体编解码器和插件 sudo apt update sudo apt install -y ubuntu-restricted-extras# 安装额外的编解码器 sudo apt install -y ffmpeg# 安装其他视频相关包 sudo apt install -y libavc…

计算机网络:流量控制与可靠传输机制

目录 基本概念 流量控制&#xff1a;别噎着啦&#xff01; 可靠传输&#xff1a;快递必达服务 传输差错&#xff1a;现实中的意外 滑动窗口 基本概念 换句话说&#xff1a;批量发货排队验收 停止-等待协议 SW&#xff08;发1份等1份&#xff09; 超时重传&#xff1a;…

Android组件刷新

Android中刷新View的方法有以下几种&#xff1a; 调用invalidate()方法&#xff0c;该方法会使View树中的所有视图无效或脏&#xff0c;等待下一次绘制时重新绘制。例如&#xff1a; mCustomView.invalidate(); 调用postInvalidate()方法&#xff0c;该方法类似于invalidate()…

Pycharm(十四)函数

一、函数概述 函数也叫方法,可以用function(函数,功能),method(方法)来表示。函数是把具有独立功能的代码封装到一起,使其成为具有独立功能的代码集。 它的好处:1.提高代码的复用性;2.模块化编程。 1.1 定义格式 def 函数名(形式参数1,形式参数2...): 函数体,就是逻…

Oracle测试题目及笔记(多选)

所有题目来自于互联网搜索 在以下概要文件的陈述中&#xff0c;哪两个是正确的&#xff1f; &#xff08;D 和 E&#xff09; A&#xff0e; 概要文件不能被用来为账户加锁 B&#xff0e; 概要文件不能被用来控制资源使用 C&#xff0e; 数据库管理员可以使用概要文件更改用户密…