|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
如果不加45时钟就对不上了,代码如下:
from datetime import *
from graphics import *
from regpoly import *
canvas = GraphWin("Regular Graphics", 500, 500)
canvas.setBackground('white')
w,h=canvas.getWidth(),canvas.getHeight()
def clock(radius):
secMarks = RegPoly(60 , radius, w/2, h/2, "red", 2)
hourMarks = RegPoly(12, radius-10, w/2, h/2, "red", 2)
secMarks.drawNodes(canvas)
hourMarks.drawNodes(canvas)
hourDigits = RegPoly(12, radius+20, w/2, h/2, "red", 2)
for i in range(12):
digits = Text(hourDigits.getPoint((i+10)%12), i+1)
digits.draw(canvas)
while True:
time = datetime.now()
hour = time.hour
min = time.minute
sec = time.second
hourHand = RegPoly(60, radius-50, w/2, h/2, "black", 6)
minHand = RegPoly(60, radius-30, w/2, h/2, "black", 4)
secHand = RegPoly(60, radius-20, w/2, h/2, "black", 2)
hourLine = hourHand.drawRadius(canvas, hour*5+min//12+45)
minLine = minHand.drawRadius(canvas, min+45)
secLine = secHand.drawRadius(canvas, sec+45)
update(1)
hourLine.undraw()
minLine.undraw()
secLine.undraw()
本帖最后由 Brick_Porter 于 2022-10-5 21:57 编辑
看了你提供的源代码之后我发现了问题,这个源代码的逻辑有问题才导致了要加上这个莫名其妙的45,逻辑上来说确实和你想的一样,这个+45是不需要的。详细解释如下:
首先,RegPoly这个类是用来绘制正多边形的。先不说具体细节,只说实现思路。先在画布上画一个半径为r的圆,然后利用三角函数计算出内接正多边形与圆的相交点,这些点全部都被记录下来。最后就是根据需要我们可以:
1. 把这些点用小圆点绘制出来(drawNodes);
2. 或者连接它们绘制正多边形(drawRegPoly);
3. 或者连接某个点与圆心绘制半径(drawRadius);
4. 又或者查看某个点的坐标(getPoint)。
以上就是这个类的全部功能了。这些功能的代码都有问题。由于你的疑问在第3个功能,所以其他功能暂时不讲解。
我们重点来看看RegPoly这个类的两个方法__init__和drawRadius。__init__的几个参数含义如下:
n:正多边形的边数;
r:正多边形外接圆的半径;
x0:正多边形外接圆的圆心x坐标;
y0:正多边形外接圆的圆心y坐标;
color:正多边形边线的颜色;
wide:正多边形变线的粗细。
此外,__init__中还有一个循环语句: self.points = []
for i in range(self.n):
x = self.x0 + self.r*math.cos(2*math.pi*i/self.n)
y = self.y0 + self.r*math.sin(2*math.pi*i/self.n)
self.points.append(Point(x, y))
这段代码就是在计算正多边形与外接圆相交的每个点的坐标,然后把它们记录到self.points这个列表中。记住这个self.points列表,在后面要频繁用到它。
接下来就是有问题的drawRadius这个方法了,它的两个参数canvas和i分别表示画布和第i个坐标点(也就是self.points中的坐标),它的功能是连接第i个点和圆心,画出半径。问题出在这一行: line = Line(self.points[i%60],Point(self.x0, self.y0))
这里我们可以看出,drawRadius内部调用了Line,关键在于这里出现了一个莫名其妙的常数60,i%60我们很容易意识到这里是为了避免i超过self.points的索引范围引发错误,但是写出一个60就不对了。如果正多边形是120条边,按照i%60的逻辑永远只有一半的点可以画出与圆心的半径,另一半的点永远无法画出来。
由于此处写死了60,导致你需要手动补偿因为写死导致的逻辑错误,也就是那个莫名其妙的+45。此处应该把写死的60改成self.n,也就是前面__init__方法中记录的正多边形的变数。
|
-
|