请问大家如图圈中为什么是+45啊
如果不加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()
不知道你的regpoly是个什么库,pypi上搜索不到,GitHub上倒是有一个同名的绘制正多边形的库,不过源代码也和你用的差别很大。所以要么你自己看源代码,要么提供你用的这个regpoly库,否则无法解答你 Brick_Porter 发表于 2022-10-5 07:48
不知道你的regpoly是个什么库,pypi上搜索不到,GitHub上倒是有一个同名的绘制正多边形的库,不过源代码也 ...
from graphics import *
import math
class RegPoly(object):
# class static variables
pi = math.pi
# constructor
def __init__(self, n, r, x0, y0, color, wide):
#initialise the class variables
self.n = n
self.r = r
self.x0, self.y0 = x0, y0
self.color = color
self.wide = wide
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))
#end for
#end init
def drawNodes(self, canvas):
# draw the points of the
for i in range(self.n):
# draw a small circle around point i
circle = Circle(self.points,2)
circle.setOutline(self.color)
circle.setWidth(self.wide)
circle.draw(canvas)
#endfor
#end drawNodes
def drawRegPoly(self, canvas):
# draw the regular polygon
for i in range(self.n):
# draw the lines between self.points, self.points
line = Line(self.points, self.points[(i+1)%self.n])
line.draw(canvas)
#endfor
#end drawRegPoly
def drawRadius(self, canvas, i):
#draw a line between the centre and point i
line = Line(self.points,Point(self.x0, self.y0))
line.setOutline(self.color)
line.setWidth(self.wide)
line.draw(canvas)
return line
#end drawRadius
def getPoint(self, i):
#return point i
return self.points
#end getPoint
这个是regpoly的源代码! 本帖最后由 Brick_Porter 于 2022-10-5 21:57 编辑
1105748041 发表于 2022-10-5 16:55
from graphics import *
import math
看了你提供的源代码之后我发现了问题,这个源代码的逻辑有问题才导致了要加上这个莫名其妙的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,Point(self.x0, self.y0))这里我们可以看出,drawRadius内部调用了Line,关键在于这里出现了一个莫名其妙的常数60,i%60我们很容易意识到这里是为了避免i超过self.points的索引范围引发错误,但是写出一个60就不对了。如果正多边形是120条边,按照i%60的逻辑永远只有一半的点可以画出与圆心的半径,另一半的点永远无法画出来。
由于此处写死了60,导致你需要手动补偿因为写死导致的逻辑错误,也就是那个莫名其妙的+45。此处应该把写死的60改成self.n,也就是前面__init__方法中记录的正多边形的变数。 Brick_Porter 发表于 2022-10-5 21:49
看了你提供的源代码之后我发现了问题,这个源代码的逻辑有问题才导致了要加上这个莫名其妙的45,逻辑上来 ...
这是我们老师提供的class文件,我又仔细看了一遍,如果删除+45,所有点都是从90°也就是正右方开始画的,如果+45就相当于从正上方开始画 1105748041 发表于 2022-10-5 21:53
这是我们老师提供的class文件,我又仔细看了一遍,如果删除+45,所有点都是从90°也就是正右方开始画的, ...
这个应该和graphics也有关系
因为画布canvas就是有它提供的 1105748041 发表于 2022-10-5 21:53
这是我们老师提供的class文件,我又仔细看了一遍,如果删除+45,所有点都是从90°也就是正右方开始画的, ...
你提供的regpoly是处理正多边形的逻辑,与最终画出来的效果无关。如果出现了角度不符合预期的情况,那就是graphics这个模块导致的,不过这种把代码写死的行为真的让我有些难以理解。而且代码中的每个方法都或多或少有些问题 Brick_Porter 发表于 2022-10-5 22:02
你提供的regpoly是处理正多边形的逻辑,与最终画出来的效果无关。如果出现了角度不符合预期的情况,那就 ...
{:10_266:}谢谢你的解答!!
页:
[1]