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}$$