《程序员数学》学习笔记

加载茶壶数据teapot.py程序分析

学习附录C中的程序,分析teapot.py程序,了解加载茶壶数据teapot.off的过程。

加载库

from transforms import *
from math import pi

读取teapot.off 数据

在这里插入图片描述

`with open("teapot.off") as f:  
    lines = f.readlines()#读取茶壶数据
vertex_count, face_count, edge_count = map(int,lines[1].split())  #获取数据的统计数据`

获取每个坐标点向量值load_vertices()

其中 vertices.append(scale_by(2)(rotate_x_by(-pi/2)(translate_by((-0.5,0,-0.6))(v))))
这条指令中:(rotate_x_by(-pi/2)(translate_by((-0.5,0,-0.6))(v)) 把茶壶的中心移到坐标原点,并且把绕X轴旋转-90度;
scale_by(2) 把茶壶图像放大2倍

其中三个函数的原型:

def scale_by(scalar): #向量缩放
    def new_function(v):
        return scale(scalar,v)
    return new_function

def rotate_x_by(angle):
    def new_function(v):
        return rotate_x(angle,v)
    return new_function
    
def translate_by(translation):
    def new_function(v):
        return add(translation,v)
    return new_function

获取每个面的顶点坐标load_polygons()

其中poly = list(map(vertices.getitem, map(int,lines[i].split()[1:])))
这条指令 根据每个面的各顶点的索引号,到vertices中找到对应的坐标值

把大于等于4个顶点的面转换为三角形的坐标点triangulate(poly)

在这里插入图片描述

整体封装函数load_triangles():

def load_triangles():
    tris = []
    polys = load_polygons() #加载茶壶面信息
    for poly in polys:
        for tri in triangulate(poly):  #把面信息转为三角形
            assert(len(tri)==3)
            for v in tri:
                assert(len(v)==3)
            tris.append(tri)
    return tris

整个程序通过调用该函数完成茶壶数据的获取,为下一步绘制做准备。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值