达令说
参见柴金算法。Chaikin 算法是一种直接处理控制多边形的几何算法。曲线生成方案基于“角切割”,其中算法通过从原始角上切掉角来生成新的控制多边形。下图说明了这个想法,其中通过切断第一个序列的角,将初始控制多边形细化为第二个多边形(稍微偏移)。这是一个示例实现。"""polygoninterpolation.pyChaikin's Algorith for curveshttp://graphics.cs.ucdavis.edu/~joy/GeometricModelingLectures/Unit-7-Notes/Chaikins-Algorithm.pdf"""import mathimport randomfrom graphics import *class MultiLine: def __init__(self, points=None, rgb_color=(255, 255, 255), width=1): self.lines = [] if points is None: self.points = [] else: self.points = points self._build_lines() self.rgb_color = rgb_color self.width = width def add_point(self): self.points.append(point) def _build_lines(self): for idx, point in enumerate(self.points[:-1]): self.lines.append(Line(self.points[idx], self.points[idx + 1])) def draw(self, win): for line in self.lines: line.setOutline(color_rgb(*self.rgb_color)) line.setWidth(self.width) line.draw(win)def get_chaikin(points, factor=4): new_points = [] # [points[0]] for idx in range(len(points) - 1): p1, p2 = points[idx], points[idx+1] p_one_qtr, p_three_qtr = get_quarter_points(p1, p2, factor) new_points.append(p_one_qtr) new_points.append(p_three_qtr) return new_points # + [points[-1]] # for a closed polygondef get_quarter_points(p1, p2, factor=4): n = factor qtr_x = (p2.x - p1.x) / n qtr_y = (p2.y - p1.y) / n return Point(p1.x + qtr_x, p1.y + qtr_y), \ Point(p1.x + (n-1) * qtr_x, p1.y + (n-1) * qtr_y)win = GraphWin("My Window", 500, 500)win.setBackground(color_rgb(0, 0, 0))# points0 = [Point(250, 20),# Point(20, 400),# Point(480, 400)]# points0 = [Point(20, 400),# Point(35, 200),# Point(250, 100),# Point(400, 150),# Point(450, 350),# Point(380, 450)]# points0 = [Point(20, 400),# Point(35, 200),# Point(250, 100),# Point(400, 150),# Point(220, 170),# Point(310, 190),# Point(180, 270),# Point(450, 230),# Point(440, 440),# Point(380, 450)]points0 = [Point(random.randrange(500), random.randrange(500)) for _ in range(random.randrange(3, 80))]x_line0 = MultiLine(points0)# x_line0.draw(win)points1 = get_chaikin(points0)x_line1 = MultiLine(points1, rgb_color=(200, 200, 200), width=1)# x_line1.draw(win)points2 = get_chaikin(points1)x_line2 = MultiLine(points2, rgb_color=(200, 200, 200), width=1)# x_line2.draw(win)points3 = get_chaikin(points2)x_line3 = MultiLine(points3, rgb_color=(200, 200, 200), width=1)# x_line3.draw(win)points4 = get_chaikin(points3)x_line4 = MultiLine(points4, rgb_color=(200, 200, 200), width=1)# x_line4.draw(win)points5 = get_chaikin(points4)x_line5 = MultiLine(points5, rgb_color=(200, 200, 200), width=1)x_line5.draw(win)# poly0 = Polygon(points0)# poly0.setOutline(color_rgb(0, 255, 0))# poly0.setWidth(1)# poly0.draw(win)## points1 = get_chaikin(points0 + [points0[0]])# poly1 = Polygon(points1)# poly1.setOutline(color_rgb(0, 255, 0))# poly1.setWidth(1)# poly1.draw(win)## points2 = get_chaikin(points1 + [points1[0]])# poly2 = Polygon(points2)# poly2.setOutline(color_rgb(0, 255, 0))# poly2.setWidth(1)# poly2.draw(win)## points3 = get_chaikin(points2 + [points2[0]])# poly3 = Polygon(points3)# poly3.setOutline(color_rgb(0, 255, 0))# poly3.setWidth(1)# poly3.draw(win)## points4 = get_chaikin(points3 + [points3[0]])# poly4 = Polygon(points4)# poly4.setOutline(color_rgb(0, 255, 0))# poly4.setWidth(1)# poly4.draw(win)## points5 = get_chaikin(points4 + [points4[0]])# poly5 = Polygon(points5)# poly5.setOutline(color_rgb(0, 255, 0))# poly5.setWidth(2)# poly5.draw(win)print("done")print(win.getMouse())win.close()