【发布时间】:2016-11-15 22:14:18
【问题描述】:
我被要求创建一个用 2 个五边形绘制圆的程序: 圆内的一个顶点在圆上。 另一个在圆外,边与圆相切。
我能够相当容易地绘制形状,但我的问题是对齐它们。这意味着五边形不在我被问到的圆圈内外。
我对python不太了解,感觉这种题需要一些我没有的数学知识。
代码已附上,也是我得到的屏幕截图。
感谢任何帮助。
import random
import math
import re
import turtle
from turtle import Turtle, mainloop
import sys
class KeysMouseEvents:
def __init__(self):
super().__init__()
global arg
turtle.setup(width=800,height=500,startx=300,starty=250)
self.T=Turtle()
self.screen=self.T.getscreen()
self.T.pensize(4)
self.T.color("black")
self.screen.onclick(self.drawconcfigs)
self.screen.listen()
self.count=0
self.first=(0,0)
self.T.hideturtle()
self.T.up()
self.screen.onkey(self.T.clear,"c")
def drawconcfigs(self,x,y):
#make turtle fastest speed
self.T.speed(3)
#initialize color list
colorlist = ['red', 'green', 'blue', 'yellow', 'white', 'pink', 'brown', 'purple', 'gray', 'orange']
#assign random colors for all three shapes
outersqcolor = random.choice(colorlist)
circlecolor = random.choice(colorlist)
while circlecolor == outersqcolor:
circlecolor = random.choice(colorlist)
innersqcolor = random.choice(colorlist)
extsquarerot = random.randint(0,90)
#echo extsquarerot
intsquarerot = random.randint(0,90)
degToRads = 0.01745329251
extsquarerot *= degToRads
intsquarerot *= degToRads
while (innersqcolor == circlecolor or innersqcolor == outersqcolor):
innersqcolor = random.choice(colorlist)
#process mouse clicks
self.count = (self.count + 1)
if self.count == 1:
self.firstx=x
self.firsty=y
self.T.goto(x,y)
self.T.down()
self.T.dot()
self.T.up()
return
if self.count == 2:
#draw rectangle first
self.secondx=x
self.secondy=y
self.T.goto(x,y)
self.T.down()
self.T.dot()
self.T.up()
self.count=0
X = self.secondx - self.firstx
Y = self.secondy - self.firsty
d = X * X + Y * Y
radius = math.sqrt (d)
#L = radius
L = math.sqrt(2 * radius * radius)
#upperleft = (self.firstx - L * math.cos(extsquarerot), self.firsty + L * math.sin(extsquarerot))
side=1.4*radius*math.sin(36)
self.T.color("black", outersqcolor)
self.T.goto(self.secondx,self.secondy)
self.T.right(extsquarerot/degToRads)
#self.T.goto(upperleft)
self.T.forward(radius)
#self.T.goto(self.firstx,self.firsty)
#self.T.right(135)
self.T.begin_fill()
self.T.down()
self.T.forward(side)
self.T.left(72)
self.T.forward(side)
self.T.left(72)
self.T.forward(side)
self.T.left(72)
self.T.forward(side)
self.T.left(72)
self.T.forward(side)
self.T.up()
self.T.end_fill()
#draw circle
X = self.secondx - self.firstx
Y = self.secondy - self.firsty
d = X * X + Y * Y
radius = math.sqrt (d);
self.T.goto(self.firstx, self.firsty-radius)
self.T.color("black", circlecolor)
self.T.begin_fill()
self.T.down()
self.T.setheading(0)
self.T.circle(radius)
self.T.up()
self.T.end_fill()
#draw square inside
a = math.sqrt (radius*radius/2)
upperleft = (self.firstx-a, self.firsty+a)
side=radius*math.sin(36)
#self.T.goto(upperleft)
self.T.color("black", innersqcolor)
self.T.goto(self.firstx,self.firsty)
self.T.left(intsquarerot/degToRads)
#self.T.goto(upperleft)
self.T.forward(radius)
#self.T.goto(self.firstx,self.firsty)
self.T.right(135)
self.T.begin_fill()
self.T.down()
self.T.forward(side)
self.T.right(72)
self.T.forward(side)
self.T.right(72)
self.T.forward(side)
self.T.right(72)
self.T.forward(side)
self.T.right(72)
self.T.forward(side)
self.T.right(72)
self.T.up()
self.T.end_fill()
self.T.goto(self.firstx,self.firsty)
self.T.down()
self.T.dot()
self.T.up()
def main(self):
mainloop()
def drawconcfigs():
draw=KeysMouseEvents()
draw.main()
if __name__ == '__main__':
arg=sys.argv[0]
drawconcfigs()
【问题讨论】:
-
内五角大楼需要圆心和半径,预先计算的边角(总是相同的角度),你只需要计算边宽。其他五角大楼需要相同的中心和半径,预先计算好的边角——你只需要计算边宽。使用圆心点和半径制作绘制圆和五边形的函数,以便代码更具可读性。
-
现在你的函数
drawconcfigs太长了,所以没人想看。
标签: python python-2.7 python-3.x turtle-graphics