Homework 2 for Computer Graphics¶
1¶
已知园的数学描述为:$x^2 + y^2 = R^2$,定义中点园算法中的判别参数,并写出中点园 算法。
以下代码节选自大作业。大作业中的 main.py
只负责命令行选项的读取和 GUI 窗口的
初始化,实际会调用各个子模块的 paint()
完成绘制。 paint()
实现算法,最终会
调用 setpixel()
, set8pixel()
, set4pixel()
等函数。本题中 p
为判别参数。
"""Computer graphics algorithms demonstration."""
import taichi as ti
from . import set8pixel
@ti.func
def circle(R: int, G: int, B: int, x0: int, y0: int, r: int):
"""circle.
:param R:
:type R: int
:param G:
:type G: int
:param B:
:type B: int
:param x0:
:type x0: int
:param y0:
:type y0: int
:param r:
:type r: int
"""
x, y = 0, r
p = 5 / 4 - r
while x <= y:
if p < 0:
p += 2 * x + 3
else:
p += 2 * x - 2 * y + 5
y -= 1
set8pixel(x0, y0, x, y, R, G, B)
x += 1
@ti.kernel
def paint(R: int, G: int, B: int, x0: int, y0: int, r: int):
"""paint.
:param R:
:type R: int
:param G:
:type G: int
:param B:
:type B: int
:param x0:
:type x0: int
:param y0:
:type y0: int
:param r:
:type r: int
"""
circle(R, G, B, x0, y0, r)
"""Computer graphics algorithms demonstration."""
from .. import setpixel
def set4pixel(x0, y0, x, y, R, G, B):
"""set4pixel.
:param x0:
:param y0:
:param x:
:param y:
:param R:
:param G:
:param B:
"""
setpixel(x0 + x, y0 + y, R, G, B)
setpixel(x0 - x, y0 + y, R, G, B)
setpixel(x0 + x, y0 - y, R, G, B)
setpixel(x0 - x, y0 - y, R, G, B)
def set8pixel(x0, y0, x, y, R, G, B):
"""set8pixel.
:param x0:
:param y0:
:param x:
:param y:
:param R:
:param G:
:param B:
"""
set4pixel(x0, y0, x, y, R, G, B)
set4pixel(x0, y0, y, x, R, G, B)
"""Computer graphics algorithms demonstration."""
import taichi as ti
pixels = ti.Vector.field(3, float)
def init() -> None:
"""init.
:rtype: None
"""
pass
@ti.pyfunc
def setpixel(x: int, y: int, R: int, G: int, B: int):
"""setpixel.
:param x:
:type x: int
:param y:
:type y: int
:param R:
:type R: int
:param G:
:type G: int
:param B:
:type B: int
"""
pixels[x, y] = ti.Vector([R, G, B])
2¶
已知Bezier曲线的定义为:$p(t) = \sum_{k = 0}^n P_k B_{k,n}(t), t \in [0, 1]$ 其中$B_{k,n}(t)$为:$B_{k,n}(t) = \binom{n}{k}t^k(1 - t)^{n - k} = \frac{n!}{k!(n - k)!}t^k(1 - t)^{n - k}$ 求$n = 2$时Bezier曲线的参数多项式表示和矩阵表示。
$$\begin{aligned} p(t) & = (1 - t)^2P_0 + 2t(1 - t)P_1 + t^2P_2\ & = (P_0 - 2P_1 + P_2)t^2 + 2(P_1 - P_0)t + P_0\ & = \begin{bmatrix} t^2 & t & 1 \end{bmatrix} \begin{bmatrix} 1 & -2 & 1\ -2 & 2 & 0\ 1 & 0 & 0 \end{bmatrix} \begin{bmatrix} P_0\ P_1\ P_2 \end{bmatrix} \end{aligned}$$