一个简单的三维向量类

作者:朱金灿
来源:http://blog.youkuaiyun.com/clever101/


      最近在看《3D数学基础:图形与游戏开发》。该书第六章实现了一个简单三维向量类。我看了一下代码,发现有些地方是错的,于是做了一些小修改。该三维向量类实现了一些常用的向量运算,如点乘、叉乘等。对此不熟悉的同学可以参考相关线性代数教材。现把源码贴上:



参考文献:


1. 3D数学基础:图形与游戏开发,作者: 邓恩,译者: 陈洪 / 史银雪 / 王荣静






1、 一个三维向量类,并定义相应的特殊方法实现两个该类对象之间的加、减运算(要求支持运算符+、-),实现该类对象与标量的乘、除运算(要求支持运算符*、/),以及向量长度的计算(要求使用属性实现)。 2、 编程实现如下功能: (1)定义一个抽象类Shape,在抽象类 Shape中定义求面积 getArea()和周长 getPerimeter()的抽象方法。 (2)分别定义继承抽象类Shape的3个子类即Triangle、Rectangle、和Circle,在这3个子类中重写 Shape中的方法getArea()和 getPerimeter( )。 (3)创建类Triangle、 Rectangle、 Circle的对象,对3个类中的方法进行调用测试。 3、使用第六章(王雷春版)介绍的知识设计一个“书籍出租管理系统”,该系统包括以下功能。 (1) 菜单项“1”:显示书籍(包括书籍名称、价格和借出状态)。 (2) 菜单项“2”:增加书籍(包括书籍名称和价格)。 (3) 菜单项“3”:借出书籍(包括借出书籍名称和借出天数)。 (4) 菜单项“4”:归还书籍(包括归还书籍名称和应付的租书费)。 (5) 菜单项“5”:统计书籍(包括借出书籍册数、未借出书籍册数和总册数)。 (6) 菜单项“-1”:退出系统。 体会利用面向对象编程的思想。 4、设计一个“超市进销存管理系统”,要求如下: (1)系统包括7种操作,分别是:1查询所有商品;2添加商品;3修改商品;4.删除商品;5卖出端口;6.汇总;-1.退出系统。 (2)选择操作序号“1”,显示所有商品 (3)选择操作序号“2”,添加新的商品(包括商品名称、数量和进货价格)。 (4)选择操作序号“3”,修改商品 (5)选择操作序号“4”,删除商品 (6)选择操作序号“5”,卖出商品(包括商品名称、数量和售出价格)。 (7)选择操作序号“6”,汇总当天卖出商品,包括每种销售商品名称、数量、进货总价、销售总价等。 (8)选择操作序号“-1”,退出系统。
### 创建三维和四向量的方法 在编程中,特别是使用 NumPy 库时,可以通过多种方式创建三维和四向量。以下是详细的说明和示例代码。 #### 使用 `numpy` 创建三维向量 通过指定形状来初始化一个三维数组(即三维向量),可以使用 `np.zeros()`、`np.ones()` 或 `np.random.rand()` 等方法[^1]: ```python import numpy as np # 方法一:使用 zeros 初始化三维向量 vector_3d_zeros = np.zeros((2, 3, 4)) print("Using zeros:\n", vector_3d_zeros) # 方法二:使用 ones 初始化三维向量 vector_3d_ones = np.ones((2, 3, 4)) print("Using ones:\n", vector_3d_ones) # 方法三:使用 random.rand 随机生成三维向量 vector_3d_random = np.random.rand(2, 3, 4) print("Using random.rand:\n", vector_3d_random) ``` 以上代码分别展示了如何用全零、全一或随机值填充一个三维向量。其中 `(2, 3, 4)` 表示该向量有两层,每层包含三个二矩阵,每个矩阵大小为 `3x4`[^1]。 --- #### 使用 `numpy` 创建四向量 同样地,也可以扩展到更高维度,例如四向量。以下是一些常见的创建方式[^5]: ```python # 方法一:使用 zeros 初始化四向量 vector_4d_zeros = np.zeros((1, 2, 3, 4)) print("Using zeros:\n", vector_4d_zeros) # 方法二:使用 ones 初始化四向量 vector_4d_ones = np.ones((1, 2, 3, 4)) print("Using ones:\n", vector_4d_ones) # 方法三:使用 random.rand 随机生成四向量 vector_4d_random = np.random.rand(1, 2, 3, 4) print("Using random.rand:\n", vector_4d_random) ``` 这里 `(1, 2, 3, 4)` 表示该向量一个顶层容器,内部包含两个三层结构,每一层又由三个二矩阵组成,每个矩阵大小为 `3x4`[^5]。 --- #### 手动定义三维/四向量 除了自动化的函数外,还可以手动构建这些高向量。这种方式适合于特定场景下的定制化需求[^4]: ```python # 定义一个简单三维向量 manual_vector_3d = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] vector_3d_manual = np.array(manual_vector_3d) print("Manual 3D Vector:\n", vector_3d_manual) # 定义一个简单的四向量 manual_vector_4d = [[[[1, 2], [3, 4]], [[5, 6], [7, 8]]]] vector_4d_manual = np.array(manual_vector_4d) print("Manual 4D Vector:\n", vector_4d_manual) ``` 这种手动定义的方式更加灵活,但也需要注意数据的一致性和嵌套层次的准确性[^4]。 --- #### 增加维度的操作 有时需要动态调整现有低向量至更高的维度,这可通过 `np.expand_dims()` 函数完成[^5]: ```python # 将二向量三维 original_vector = np.array([[1, 2], [3, 4]]) expanded_vector = np.expand_dims(original_vector, axis=0) # 在第0轴增加新维度 print("Expanded to 3D:\n", expanded_vector) # 进一步将其升成四 final_vector = np.expand_dims(expanded_vector, axis=0) # 再次新增维度 print("Expanded to 4D:\n", final_vector) ``` 这种方法特别适用于图像处理等领域中的批量操作,例如将单张灰度图转换为符合深度学习模型输入格式的数据形式[^5]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

clever101

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

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

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

打赏作者

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

抵扣说明:

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

余额充值