计算机图形学入门——太极图形学元编程

OPenGL---传统学习入门的所学习的部分,计算机图形学远远不是这么这么简单

图形个图像是有很大的区别的

直观的解释就是:图像——计算机视觉的目的是输入图像理解其中的信息

                             图形——图形学是将我们了解到的信息和知识转变为图形

我们要做的是生成,可以从物理出发也可以从规则出发,当然也可以从大数据出发(这样的话就涉及到深度学习的Gan网络)

计算机图形学是用来生成数字内容的技术

关于源编程

什么是源编程——源编程的概念在编程之上

传统代码——代码生成结果

我们生成一部分代码,让这些代码实例化,再由这些代码去生成我们需要的东西

需要用到的部分:在并行计算中使用模板以及使用编译器优化代码

在并行计算中写一个库(这个库2D和3D都可以使用的时候)

#一个天真的实现方法
def copy_4(src,dst):
    for i in range(4):
        dst[i] = src[i]
a = ti.field(ti.f32, shape=4)
b = ti.field(ti.f32, shape=4)
copy_4(a,b)


#提高复用性
def copy(src,dst,size):
    for i in range(size):
        dst[i] = src[i]
a = ti.field(ti.f32, shape=4)
b = ti.field(ti.f32, shape=4)
c = ti.field(ti.f32, shape=12)
d = ti.field(ti.f32, shape=12)
copy(a,b,4)
copy(c,d,12)


#使用并行计算,这个template可以接受任何类型的数组,类似于泛型?,会自动匹配,使用这个模板都是引用传递
@ti.kernel
def copy(src: ti.template(),dst:ti.template(),size: ti.i32):
    for i in range(size):
        dst[i] = src[i]

a = ti.field(ti.f32, shape=4)
b = ti.field(ti.f32, shape=4)
c = ti.field(ti.f32, shape=12)
d = ti.field(ti.f32, shape=12)

copy(a,b,4)
copy(c,d,12)

#使用template的限制 ,若是field全局的变量就可以都被修改
vec = ti.Vector([0.0,0.0])
@ti.kernel
def my_kernel(x: ti.template()):
    x[0] = 2.0#这就是错误方法无法执行
    vec2 = x
    vec2[0] = 2.0 #这样是可行的
    print(vec2)

注意在ti.func中使用的话传递的是引用,也就是说在func中改变数据的值夜会改变源数据的值

#值传递使用的是引用
@ti.func
def my_func(x: ti.template()):
    x += 1 #这个值会改变源数据
@ti.kernel
def my_kernel():
    x = 24
    my_func(x)#这个值在func里面被加一后再外面也会被加一
    print(x)#25

my_kernel()

基于此,其实size也没有必要存留了

@ti.kernel
def copy(src:ti.template(),dst:ti.template()):
    for i in src:
        dst[i] = src[i]

这样所做的拷贝都可以执行,其中只要shape一样就可以了 

但这样会有一个新的问题

#但是这个时候又会出现另一个问题,就是
c = ti.Vector.field(ti.f32,shape=(12,24))
d = ti.Vector.field(ti.f32,shape=(12,24))
copy(c,d)#这样不能执行,因为有多个维度
#可能需要写多个函数
#基于此的解决方法就是
def copy(x:ti.template(),y:ti.template()):
    for I in ti.grouped(y):
        # if y is 0D ,then I = ti.Vector([])
        # if y is 1D ,then I = ti.Vector([i])
        # if y is 2D ,then I = ti.Vector([i,j])
        # if y is 3D ,then I = ti.Vector([i,j,k])
        # ...
        x[I] = y[I]

有点像C++中的部分操作,和C++模板类似,在实例化的时候生成一个新的kernel

之后还有一个代码加速的部分,ti.static(),这都是给编译器给的代码

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用turtle库可以绘制太极图形。以下是一个使用turtle库绘制太极图形的完整代码: ```python import turtle window = turtle.Screen() bage = turtle.Turtle() radius = 100 bage.width(3) bage.color("black", "black") bage.begin_fill() bage.circle(radius/2, 180) bage.circle(radius, 180) bage.left(180) bage.circle(-radius/2, 180) bage.end_fill() bage.left(90) bage.up() bage.forward(radius*0.35) bage.right(90) bage.down() bage.color("white", "white") bage.begin_fill() bage.circle(radius*0.15) bage.end_fill() bage.left(90) bage.up() bage.backward(radius*0.7) bage.down() bage.left(90) bage.color("black", "black") bage.begin_fill() bage.circle(radius*0.15) bage.end_fill() bage.right(90) bage.up() bage.backward(radius*0.65) bage.right(90) bage.down() bage.circle(radius, 180) bage.ht() window.exitonclick() ``` 这段代码使用turtle库创建了一个窗口,并创建了一个名为bage的海龟对象。通过调用海龟对象的方法和属性,可以绘制太极图形。首先设置海龟的宽度和颜色,然后使用`circle`方法绘制半圆和圆形来构建太极图形的两个部分。接着调整海龟的位置和方向,使用`circle`方法绘制两个小圆来表示太极图形的阴阳部分。最后隐藏海龟对象并等待用户点击窗口关闭。 运行这段代码,就可以在窗口中看到绘制的太极图形。 #### 引用[.reference_title] - *1* *2* [python绘图:turtle画太极图](https://blog.csdn.net/gouxf_0219/article/details/84396581)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值