我正在寻找chaikin在python 2.7.x中实现的角切割算法(link1link2),但找不到它。
也许有人拥有它并能分享密码?

最佳答案

车先生的回答会有效,但这里有一个简短得多的版本,效率略高。

import numpy as np

def chaikins_corner_cutting(coords, refinements=5):
    coords = np.array(coords)

    for _ in range(refinements):
        L = coords.repeat(2, axis=0)
        R = np.empty_like(L)
        R[0] = L[0]
        R[2::2] = L[1:-1:2]
        R[1:-1:2] = L[2::2]
        R[-1] = L[-1]
        coords = L * 0.75 + R * 0.25

    return coords

它是如何工作的?
对于每两个点,我们需要用1:3的比率取它们之间的线的下半部分和上半部分:
LOWER-POINT = P1 * 0.25 + P2 * 0.75
UPPER-POINT = P1 * 0.75 + P2 * 0.25

并将它们都添加到新点列表中。
我们还需要添加边缘点,这样线就不会收缩。
我们以某种方式构建两个数组l和r,如果我们将它们按如下方式相乘,它将生成新的点列表。
NEW-POINTS = L * 0.75 + R * 0.25

例如,如果我们有4个点的数组:
P = 0 1 2 3

L和R数组如下:
L = 0 0 1 1 2 2 3 3
R = 0 1 0 2 1 3 2 3

其中每个数字对应一个点。

10-05 20:42
查看更多