【发布时间】:2014-07-11 11:38:26
【问题描述】:
大家好,我需要一些帮助。我用 Python (Tkinter) 编写了一个绘制 3 度贝塞尔曲线的代码,它可以工作......有点。我的问题是:我如何直接从键盘 x 和 y 输入控制点的坐标,而不是第一个 x 然后 y(就像在我的代码中一样)。第二个问题是关于参数(u 或 t)值。通常它是标准化的(值 0 到 1),但 for 循环不适用于步骤的十进制值(我知道它很明显:))。如果我把 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)
打印 (x)
打印(y)
打印 (x1)
打印(y1)
x1=str(x+000001)
y1=str(x+0,00001)
linija=w.create_line(x,y,x1,y1)
x1=x
y1=y
kriva()
主循环()
【问题讨论】:
-
通过绘制许多小线来绘制曲线并不愚蠢。这几乎是最好的方法。
-
Sundar,我不确定哪些错误...我已经尝试运行脚本并且它可以工作...没有报告错误。谢谢
-
Kevin 你知道我可以用其他方法吗?至少用点,如果不是平滑曲线?
-
“我试过运行脚本,它可以工作”。您的意思是,您已经复制粘贴了您在此处编写的确切代码,然后运行它,它可以工作吗?或者您的意思是,您最初从作品中转录此代码的代码?因为后者不排除你提问时打错的可能性。
-
“至少有点,如果不是平滑曲线的话?” 我不知道你的意思。线由点组成。