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

3
我正在尝试在两个主要点之间创建一个抛物线/贝塞尔曲线(使用第三个点作为控制点),但不知道如何实现。
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()

这是一个更现实的使用例子,只不过我想将那条实线改成可变线,因为它取决于两个点的位置,会在同一条直线上,从而使其看起来像一条单一的线。


1
哪些是你的主要观点?通常,如果你有三个观点,第一个是真正的观点,第二个是控制点,第三个再次是真实的观点,因此你展示的代码表明你将点 B 和 C 视为真正的观点,这非常值得注意。话虽如此,如果没有内置的贝塞尔函数,您可能只需实现跟踪贝塞尔路径的实际代码。在谷歌搜索“python turtle draw bezier curve”可以找到 https://gist.github.com/SuperDoxin/d7bb473dcec7e1c55f48 ,这是否足够解决问题? - Mike 'Pomax' Kamermans
1个回答

3
基于维基百科关于二次贝塞尔曲线的解释,我们应该能够简单地执行以下操作:
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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接