0

我正在创建一个绘制二次贝塞尔曲线的程序,其中曲线的点随着程序运行而移动。我沿着它画了 40 个点来绘制曲线,使它看起来有点立体。但是,我希望绘制的曲线部分始终具有相同的长度,即 200 个单位。我所做的只是在 X 单位长的曲线上最多画出 200 个单位。这样做的问题是,随着曲线变大,在视觉上绘制的部分会缩小。无论曲线有多长,我都希望它始终保持不变,但我不知道如何去做。

这是它的样子。我还将发布您必须在 CodeSkulptor 3 中运行才能获得这些结果的代码(它是一个 Web IDE,我无法在此处发布链接,如果您搜索它就会显示出来)。

曲线1

蓝色部分是绘制曲线的部分,当总曲线长度较短时,此处显示较长

曲线2

当总曲线较长时,它会略短。当您延长总曲线时,它会变得更短。

更新:

我已经重新设计了程序以产生我想要的结果,但是它通过每秒使用大量迭代来实现,这会大大减慢画布的速度。我不相信这是一个解决方案,而是表明我正在努力完成的事情。我希望有人可以帮助我找到一种方法,使该程序产生相同的结果,但无需数千次迭代。

新代码以及作为原始问题一部分的所有代码位于此处:https ://py3.codeskulptor.org/#user303_MAsllc2ZJd4RIOO.py

4

1 回答 1

0

如果你只使用

distanceBetweenPoints = currentBezierLength / tailSegments

没有if/else然后它会正确绘制。

def DrawPointsOnTail(canvas):
    global tailSegments, centerPoint, endPoint, midPoint, tailLength
    currentBezierLength = BezierLength(centerPoint.position,
                                       midPoint.position, 
                                       endPoint.position,
                                       100)
    print (currentBezierLength)
    #if (currentBezierLength < tailLength):
    distanceBetweenPoints = currentBezierLength / tailSegments
    #else:
    #distanceBetweenPoints = tailLength / tailSegments

    for i in range(0, tailSegments):
        currentSegment = Point(BezierCurve(centerPoint.position,
                                           midPoint.position,
                                           endPoint.position,
                                           (i * distanceBetweenPoints) / currentBezierLength),
                               3, "Blue")
        currentSegment.draw(canvas)

codeskulptor 上的代码

于 2019-07-19T23:03:13.760 回答