当前位置: 首页 > 知识库问答 >
问题:

用Python绘制Bezier曲线的问题

戴建义
2023-03-14

大家好,我需要一些帮助。我用Python(Tkinter)写了一个代码,它是绘制一个3度贝塞尔曲线,并且它是工作的。。。。kinda.我的问题是:我如何直接从键盘输入x和y坐标为控制点,而不是先x后y(像我的代码)。第二个问题是关于参数(u或t值。通常它是标准化的(值0到1),但对于循环将不工作的十进制值为步骤(我知道这是显而易见的:))。如果我把u=1-&>1000,然后除以1000,它在数字上是不稳定的。第三个也是最不重要的是如何绘制曲线,你我会说我用了小行,这真的很愚蠢,但是不知道这里有其他的方式是我的代码,抱歉它是Word格式的,有一些麻烦:

import tkinter

from tkinter import*

master=Tk()

w=Canvas(master,width=800,height=800)


w.pack()

def kriva():

        P0=[]
        P1=[]
        P2=[]
        P3=[]
        P0.append (float(input(" x for P0")))  #HERE IS THE PLACE FOR INPUT COORDINATES OF CONTROL POINTS
        P0.append (float(input(" y for P0")))
        P1.append(float(input(" x for P1")))
        P1.append(float(input(" yfor P1")))    
        P2.append(float(input(" x for za P2")))
        P2.append(float(input(" y for za P2")))

        P3.append(float(input(" x for P3")))
        P3.append(float(input(" y for P3")))


        for u  in range (0,1000,1):
            u=(u/1000) # PARAMETAR FOR CURVE
               x=(P0[0]*(1-u)**3+P1[0]*3*u*(1-u)**2+P2[0]*3*u**2*(1-u)+P3[0])*u**3#BERNSTAIN    POLYNOMS FOR X AND Y         
               y=(P0[1]*(1-u)**3+P1[1]*3*u*(1-u)**2+P2[1]*3*u**2*(1-u)+P3[1]*u**3)
            x1=x+1 #THIS IS END OF THE LINE
            y1=y+1
            print (x)
            print (y)
            w.create_line(x,y,x1,y1) #IM DOOING THIS THIS WAY BECAUSE I DONT KNOW ANY OTHER    WAY TO DRAW CURVE :)

kriva()
mainloop()

已修复所有问题。这是最终代码。特别感谢您的帮助

导入tkinter

从tkinter导入*

master=TK()

W=Canvas(master,width=800,height=800)

W.Pack()

def kriva():

P0=[]

P1=[]

P2=[]

P3=[]

#p0:

unosp0=input("unesi koordinate za P0")

koordinatep0=unosp0.split(',')

print (koordinatep0)

P0.append(float((koordinatep0[0])))

P0.append(float((koordinatep0[1])))

print (P0)

#p1:

unosp1=input("unesi koordinate za P1")

koordinatep1=unosp1.split(',')

print (koordinatep1)

P1.append(float((koordinatep1[0])))

P1.append(float((koordinatep1[1])))

print (P1)

#p2:

unosp2=input("unesi koordinate za P2")

koordinatep2=unosp2.split(',')

print (koordinatep2)

P2.append(float((koordinatep2[0])))

P2.append(float((koordinatep2[1])))

print (P2)

#p3:

unosp3=input("unesi koordinate za P3")

koordinatep3=unosp3.split(',')

print (koordinatep3)

P3.append(float((koordinatep3[0])))

P3.append(float((koordinatep3[1])))

print (P3)

x1=P0[0]

y1=P0[1]

for u  in range (0,1001,1):

    u=(u/1000)

    x=(P0[0]*(1-u)**3+P1[0]*3*u*(1-u)**2+P2[0]*3*u**2*(1-u)+P3[0]*u**3)

    y=(P0[1]*(1-u)**3+P1[1]*3*u*(1-u)**2+P2[1]*3*u**2*(1-u)+P3[1]*u**3)
    linija=w.create_line(x,y,x1,y1)

    x1=x

    y1=y

克里瓦()

mainloop()

共有1个答案

湛宝
2023-03-14

要从相同的输入中同时获得X和Y坐标,您只需确定一个简单的语法并对其进行解析。例如,你可以说X和Y将按这个顺序输入,用逗号分隔,然后做如下的操作

inp = input('Enter X,Y coordinates:')
parts = inp.split(',')
if len(parts) != 2:
    raise ValueErrror("You entered the wrong number of coordinates!")
x = float(parts[0].strip())
y = float(parts[1].strip())

或者更紧凑(但没有错误处理):

x, y = (float(p.strip()) for p in input('Enter X,Y coordinates:').split(','))

对于迭代一个浮点数,除以1000是很好的。你说它在数值上不稳定是什么意思?我会这样做:

num_of_points = 1000
for i in xrange(num_of_points+1):
    u = float(i) / float(num_of_points)

请注意,我将范围设置为 ,这样 实际上将包含在内:这意味着循环实际上将从0到1.0(含)。

在点之间画一条线很可能是正确答案。是的,这是一个近似值,但是它只受到图像分辨率和你想要画的点的数量的限制。如果您想要更精确的描述,只需迭代较大的

要做比直线更精确的事情,你需要计算出两点之间曲线的近似值。但这正是你的脚本正在做的,它近似于贝塞尔。所以你可以递归地逼近你找到的每一对点之间的曲线,但这和在你的近似值上添加更多的点是一样的。

也就是说,你画线的具体方式让我感到困惑。据我所知,您正在计算曲线上的一个点 (更确切地说,参数 ,然后从该点画一条线到 处的一点。换句话说,你总是在曲线上的点上画一个45度的“勾”。不知道为什么,除非你只想做一个小标记,不知道怎么填一个像素。

不管是什么原因,正确的做法是在曲线上确定两个“相邻”的点,并用一条线连接它们。类似于:

last_point = calculate_point_on_curve(u=0)
for i in xrange(1, num_of_points+1):
    x, y = calculate_point_on_curve( float(i) / float(num_of_points) )
    last_x, last_y = last_point
    w.create_line(last_x, last_y, x, y)
    last_point = (x, y)

这里,用于计算线上点的实际参数方程隐藏在 函数中,只是为了简化代码片段。

要处理明显的抽取问题,请尝试以下操作:

u = 0.0
for t in xrange(10001):
    calculate_point_on_curve(u)
    u = u + 0.0001
 类似资料:
  • 为了做到这一点,我将需要找到控制点的“边缘”曲线决定形状,然后填充形状,这是发现在两个新的曲线之间。然而,我很不确定如何做到这一点。我想过的一件事是通过简单地在连接原控制点和原终点的直线上画垂直段来确定新曲线的起点和终点,但这仍然不能解决为新曲线寻找新控制点的问题。

  • 我试图画一条具有一定厚度的三次bezier路径,但曲线看起来像是一系列断开的线段(在我的例子中是3段)。这是一张截图(蓝色圆圈是曲线的控制点)。 我注意到在cocos2d-x测试中的“绘制原语”中也出现了同样的效果。不管怎样,我很确定应该有一个变通办法,但我自己找不到。此外,线条受到锯齿效应的影响,我不知道如何应用一个alpha阴影来避免它。 这是我使用的代码:

  • 本文向大家介绍python绘制高斯曲线,包括了python绘制高斯曲线的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python绘制高斯曲线的具体代码,供大家参考,具体内容如下 源码: 效果图: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我画了4条线从中心到按钮,我给你看的照片。我不知道如何在图片中画出红色的曲线。 [在此处输入图像说明] 或 [在此输入图像说明(更简单)]

  • 问题内容: 我正在尝试用Java绘制曲线。一个简单的以(X,Y)开始,(X,Y)结束和曲线量的贝塞尔曲线就足够了。 我找不到在Swing中执行此操作的方法。如果不在Swing中,我可以使用一些简单的数学方法吗?我将如何在Swing中实现它? 编辑:我知道如何通过重写paint(Graphics g)方法绘制形状和线条。 问题答案: 您可以使用Java 2D Object Path2D.Double

  • 问题内容: 我正在用Piccolo编写一个交互式applet,并且需要在其中包含高斯曲线(又称正态分布图)。 我想象任何一种Java实现都足够,但是我找不到。理想情况下,我想传递一组值并将图表绘制在面板,图像对象或可以嵌入在applet中的任何对象中。 在让我自己动手编写代码之前,有人知道做这件事的有用代码吗? 欢迎使用其他语言的实现,只要它们易于移植到Java中即可。 问题答案: 不知道它是否有