我想,将VMobject变为一个个内外嵌套的壳,但是目前来看无法实现
首先,我们考察非平滑节点,以正方形为例:
def playscene0(): c = Square() li = c.get_anchors_and_handles() # 获取VMobject的anchors和handles l = len(li[0]) # 注意li的长度为4,这意味这[li[0][i],li[1][i],li[2][i],li[3][i]]组成一条贝塞尔曲线 v = VMobject(stroke_width=10) # 创建空的VMobject v1 = VMobject(stroke_width=10) # 创建空的VMobject myli = [] for i in range(l): myli.append(li[0][i]);myli.append(li[1][i]);myli.append(li[2][i]);myli.append(li[3][i]) # 注意不需要加[] v.points = myli def getinner(a, b, c): vect1 = b - a vect1 = vect1/np.sqrt(vect1[0]**2 + vect1[1]**2 + vect1[2]**2) # 如果不是np.array()类型而是list类型则会报错:TypeError: unsupported operand type(s) for -: 'list' and 'list' vect2 = c - a vect2 = vect2/np.sqrt(vect2[0]**2 + vect2[1]**2 + vect2[2]**2) vect3 = [x + y for x,y in zip(vect1, vect2)] vect3 = vect3/np.sqrt(vect3[0]**2 + vect3[1]**2 + vect3[2]**2) point = a + vect3 return point innerli = [] for i in range(l): if i == 0: a = getinner(myli[0],myli[1],myli[-2]) innerli.append(a);innerli.append(myli[1] - myli[0] + a) else: a = getinner(myli[4*i-1],myli[4*i-2],myli[4*i+1]) innerli.append(myli[4*i-2] - myli[4*i-1] + a);innerli.append(a);innerli.append(a);innerli.append(myli[4*i+1] - myli[4*i] + a) z = getinner(myli[0],myli[1],myli[-2]) innerli.append(myli[-2] - myli[-1] + z);innerli.append(z) print(innerli) v1.points = innerli
基本思想是,根据某个锚点的两个手柄,将锚点沿着两个手柄的角平分线移动一定距离,得到内部的innerli。但是如果对于平滑节点,则无法实现,因为其两个锚点做向量运算为零向量,如果考虑其垂直平分线,那么有两个方向可以考虑,这个问题的解决方法是考虑锚点两侧的像素颜色,从而选出锚点移动的方向,但是还有另一个问题,对于锚点的手柄,如何才能使其能恰好贴紧外侧的内部边缘?这个对于锚点的运算是线性的吗?这我不打算研究了
标签:动画,基于,VMobject,myli,锚点,innerli,li,append From: https://www.cnblogs.com/daxiangcai/p/16795740.html