如何使用图形上的3个唯一点获取贝塞尔曲线/抛物线的点

时间:2019-06-24 13:30:39

标签: python python-3.x turtle-graphics bezier

我正在尝试在两个主要点之间建立抛物线/贝塞尔曲线(使用第三个点作为控制点),但无法解决该问题。

from turtle import *

pointA = (0.00,50.00)
pointB = (0.00,350.00)
pointC = (-300.00,50.00)

pu()
goto(pointB)
pd()
dot()
goto(pointC)
dot()

ht()

这将在两个要点之间建立一条线,这是我的主要要点, 我也想用pointA画一条曲线,这样我可以有多条线, 我已经排除了抛物线弯曲的可能性,因为除非我旋转飞机,否则该方程式不适合抛物线,但那是我还没准备好的另一锅鱼。

我很乐意为我提供帮助, 谢谢

编辑: 我尝试了很多事情,但都没有得到解决,我最终还是只用中点转换了几个像素来运行。例如

for j in range(3):
        pu()
        goto(pointB)
        pd()
        dot()
        midpoint = ((pointB[0]+pointC[0])/2, (pointB[1]+pointC[1])/2)
        goto(midpoint[0]+(20*j), midpoint[1])
        goto(pointC)
        dot()

这是im用途的更现实的用法,除了我想将实线更改为可变线时,取决于将在同一条线上的两个点的位置,因此使其看起来像1条奇异线。

1 个答案:

答案 0 :(得分:0)

基于Wikipedia's explanation of quadratic Bézier curves,我们应该可以轻松地做到:

from turtle import Screen, Turtle, Vec2D

p0 = Vec2D(0, 50)
p1 = Vec2D(-300, 50)
p2 = Vec2D(0, 350)

b = lambda t: p1 + (1 - t)**2 * (p0 - p1) + t**2 * (p2 - p1)

turtle = Turtle()
turtle.penup()

for position in [p2, p1, p0]:
    turtle.goto(position)
    turtle.dot()

turtle.pendown()

t = 0

while t <= 1:
    position = b(t)

    turtle.setheading(turtle.towards(position))
    turtle.goto(position)

    t += 0.1

screen = Screen()
screen.exitonclick()

enter image description here