【问题标题】:How to get the points of a bezier curve/parabola using 3 unique points on a graph如何使用图表上的 3 个独特点获取贝塞尔曲线/抛物线的点
【发布时间】:2019-06-24 13:30:39
【问题描述】:

我正在尝试在两个主要点之间制作抛物线/贝塞尔曲线(使用第三个点作为控制点),但不知道该怎么做。

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()

这会在我的主要观点 2 点之间创建一条线, 我也想用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”给了我gist.github.com/SuperDoxin/d7bb473dcec7e1c55f48,这是否涵盖了它?

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


【解决方案1】:

基于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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2020-04-27
    • 2011-05-04
    • 2011-03-11
    相关资源
    最近更新 更多