python-Objects and Graphics 课后题

翻译:选择一个有趣的现实世界对象的例子,并通过列出其数据(属性,它“知道”)及其方法(行为,它可以“做什么”)来描述它作为编程对象。

解:类:狗。对象:大黄。属性:黄毛、长舌头、四条腿。方法:摇尾巴、汪汪汪。

翻译:用你自己的话描述图形模块中由以下每个操作产生的对象。 尽你所能精确。 务必提及各种物体的大小,位置和外观等。 如果有帮助,您可以包括草图。

解:(a)点:坐标为(130,130)    

(b)圆:圆心坐标(30,40);半径25;绿色填充;边界线是红色。

(c)矩形:左上角坐标(20,20),右下角坐标(40,40);颜色是rgb(0,255,150),这是一种青色;边界线宽为3

(d)线:端点坐标分别为(100,100)和(100,200);线的颜色为暗红色;有个箭头。

(e)椭圆:矩形的左上角坐标(50,50),右下角坐标(60,100),然后在其内画一个唯一的内切椭圆。(画椭圆的主要原理,根据两点确定的矩形,然后画一个唯一的内切的椭圆。也就是实现了两点确定一个椭圆)。

(f)多边形:端点坐标分别为(5,5),(10,10),(5,10),(10,5);填充颜色为橘黄色

(g)文本:坐标是(100,100),文本内容是Hello World;setFace代表设置字体;serSize代表设置大小;setStyle(italic“)代表为斜体

翻译:描述以下交互式图形程序运行时会发生什么。

解:首先会出现一个绘图框,里面有一个圆,圆心坐标为(50,50),半径是20,这个圆是红色的,边界线也是红色的。然后鼠标点击某个位置,该圆的圆心就会移动到该位置,在点击第10次后,绘图框关闭。

通过以下方式修改上一个问题中的程序:

  1. 使它绘制正方形而不是圆形。
  2. 每次连续点击都会在屏幕上绘制一个额外的正方形(而不是移动前一个正方形)。
  3. 输入所有点击后在窗口上打印消息,并在关闭窗口之前等待最后一次点击。

解:(a)将上面的代码shape=Circle(Point(50,50),20)改为

shape= Rectangle(Point(50,50),Point(100,100))

(b)前面代码一样,只不过在移动之前,先复制一份,r2=r.clone()。然后再将r2移动,r2.move(px,py),移动后再在绘图框里绘制r2.draw(win)

win=GraphWin()

r=Rectangle(Point(50,50),Point(100,100))

r.setOutline("red")

r.setFill("red")

r.draw(win)

for i in range(10):

    p1=win.getMouse()

    p2=r.getCenter()

    px=p1.getX()-p2.getX()

    py=p1.getY()-p2.getY()

    r2=r.clone()

    r2.move(px,py)

    r2.draw(win)

win.close()

(c) 再最后加了四行代码。首先是改变绘图框的做标系,做下角为(0,0),右上角为(10,10),文本内容绘制在上面,最后在关闭绘图框之前再监听一下鼠标的点击事件即可。

win=GraphWin()

r=Rectangle(Point(50,50),Point(100,100))

r.setOutline("red")

r.setFill("red")

r.draw(win)

for i in range(3):

    p1=win.getMouse()

    p2=r.getCenter()

    px=p1.getX()-p2.getX()

    py=p1.getY()-p2.getY()

    r2=r.clone()

    r2.move(px,py)

    r2.draw(win)

win.setCoords(0,0,10,10)

t=Text(Point(5,9.5),"好了,别点了,再点就该停止了")

t.draw(win)

win.getMouse()

win.close()

翻译:射箭目标由黄色的中心圆圈组成,周围环绕着红色,蓝色,黑色和白色的同心环。 每个环具有相同的“宽度”,与黄色圆的半径相同。写一个绘制这样一个目标的程序。 提示:稍后绘制的对象将出现在之前绘制的对象之上。

解:没啥意思,就是画五个圆。

win=GraphWin()

whiteCir=Circle(Point(100,100),50)

whiteCir.setFill("white")

whiteCir.setOutline("white")

blackCir=Circle(Point(100,100),40)

blackCir.setFill("black")

blackCir.setOutline("black")

blueCir=Circle(Point(100,100),30)

blueCir.setFill("blue")

blueCir.setOutline("blue")

redCir=Circle(Point(100,100),20)

redCir.setFill("red")

redCir.setOutline("red")

yellowCir=Circle(Point(100,100),10)

yellowCir.setFill("yellow")

yellowCir.setOutline("yellow")

whiteCir.draw(win)

blackCir.draw(win)

blueCir.draw(win)

redCir.draw(win)

yellowCir.draw(win)

win.getMouse()

翻译:写一个绘制某种面孔的程序。

解:win=GraphWin()

head=Circle(Point(100,100),50)

head.draw(win)

#左眼睛

leftEye=Circle(Point(75,75),5);

#左眼睛的瞳仁

leftEye1=Circle(Point(75,75),2);

leftEye.setFill("black")

leftEye1.setFill("white")

#右眼睛,是通过复制左眼睛获得的

rightEye=leftEye.clone()

#右眼睛的瞳仁,通过复制获得

rightEye1=leftEye1.clone()

rightEye.move(50,0)

rightEye1.move(50,0)

#鼻子

nose=Circle(Point(100,100),2)

nose.setFill("black")

#嘴巴

mouth=Line(Point(95,125),Point(105,125));

leftEye.draw(win)

leftEye1.draw(win)

rightEye.draw(win)

rightEye1.draw(win)

nose.draw(win)

mouth.draw(win)

win.getMouse()

翻译:写一个有圣诞树和雪人的冬季场景的程序。

解:pass(graphics不提供画弧的函数,它是tkinter的扩展,tkinter是用来开发界面的,提供的画图方法也非常有限。)

翻译:编写一个程序,在屏幕上绘制5个骰子,描绘直线(1,2,3,4,5或2,3,4,5,6)。

解:pass

翻译:修改图形未来值程序,以便输入(principal和apr)也使用Entry对象以图形方式完成。

解:pass

翻译:圆交点。 编写一个程序,计算圆与水平线的交点,并以文本和图形方式显示信息。

输入:圆的半径和线的y轴截距。

输出:在坐标为-10,-10到10,10的窗口中以给定半径绘制以(0,0)为中心的圆。

使用给定的y截距在窗口上绘制一条水平线。

以红色绘制两个交点。

打印出交点的x值。

解:from math import *

#输入

r=input("圆的半径:")

y=input("线的y轴截距:")

win=GraphWin()

#定义坐标系,即绘图框的左下角为(-10,-10),右上角为(10,10)

win.setCoords(-10,-10,10,10)

#定义圆并绘制

c=Circle(Point(0,0),r)

c.draw(win)

#定义直线并绘制

l=Line(Point(-10,y),Point(10,y))

l.draw(win)

#通过公式得到第一个两个交点的x值

x1=-sqrt(pow(r,2)-pow(y,2))

x2=sqrt(pow(r,2)-pow(y,2))

#得到两个交点赋予红色并绘制

p1=Point(x1,y)

p2=Point(x2,y)

p1.setFill("red")

p2.setFill("red")

p1.draw(win)

p2.draw(win)

#打印x的值

print ("左边的交点x值为%.2f"%x1)

print ("右边的交点x值为%.2f"%x2)

#监听鼠标点击事件,即绘图框任意地方,绘图框消失,若无该代码,则绘图框会一闪而过

win.getMouse()

翻译:线格式

该程序允许用户绘制线段,然后显示有关线段的一些图形和文本信息。

       输入:点击两次线段的终点鼠标

输出:以青色绘制线段的中点。

划清界线。

打印线的长度和斜率。   

解:from math import *

win=GraphWin()

#如果不设置坐标系,默认的绘图框是左上角为原点,为符合数学坐标系,故将原点设置在左下角,右上角为(100,100)

win.setCoords(0,0,100,100)

#通过点击获取线段两端点并绘制线段

p1=win.getMouse()

p2=win.getMouse()

l=Line(p1,p2)

l.draw(win)

#获取中点并绘制,颜色我给的不是青色是红色,颜色不重要

cp=l.getCenter()

cp.setFill("red")

cp.draw(win)

#获取线段两端点的xy值,用来计算斜率和长度

x1=p1.getX()

y1=p1.getY()

x2=p2.getX()

y2=p2.getY()

dx=x2-x1

dy=y2-y1

#计算斜率

K=dy/dx

#计算长度

L=sqrt(pow(dx,2)+pow(dy,2))

print ("该线段的斜率为%.2f"%K)

print ("该线段的长度为%.2f"%L)

win.getMouse()

翻译:矩形信息。

该程序显示有关用户绘制的矩形的信息。

       输入:两次鼠标单击矩形的对角。

       输出:绘制矩形。

打印矩形的周长和面积。

解:win=GraphWin()

from math import *

#通过鼠标点击获取矩形对角点并绘制矩形

p1=win.getMouse()

p2=win.getMouse()

rec=Rectangle(p1,p2)

rec.draw(win)

#通过对角点来获取矩形的长和宽

dx=abs(p1.getX()-p2.getX())

dy=abs(p1.getX()-p2.getY())

#计算周长和面积

perimeter=2*(dx+dy)

area=dx*dy

print ("该矩形的周长是:%.2f"%perimeter)

print ("该矩形的面积是:%.2f"%area)

win.getMouse()

翻译:三角形信息。

       与上一个问题相同,但三角形的顶点有3次点击。

       解:from math import *

win=GraphWin()

#鼠标点击三下绘制三角形

p1=win.getMouse()

p2=win.getMouse()

p3=win.getMouse()

tri=Polygon(p1,p2,p3)

tri.draw(win)

#计算三角形三条边长

a=sqrt(pow((p1.getX()-p2.getX()),2)+pow((p1.getY()-p2.getY()),2))

b=sqrt(pow((p2.getX()-p3.getX()),2)+pow((p2.getY()-p3.getY()),2))

c=sqrt(pow((p1.getX()-p3.getX()),2)+pow((p1.getY()-p3.getY()),2))

#计算周长和面积

s=(a+b+c)/2

perimeter=a+b+c

area=sqrt(s*(s-a)*(s-b)*(s-c))

print ("该三角形的周长是:%.2f"%perimeter)

print ("该三角形的面积是:%.2f"%area)

win.getMouse()

:可以发现,这个题在计算三条边长的时候略显麻烦,可以将计算边长的代码封装在一个函数内。以下代码同样可以实现这个功能。

#定义计算两点间距离的函数

def getLength(p1,p2):

    from math import *

    return sqrt(pow((p1.getX() - p2.getX()), 2) + pow((p1.getY() - p2.getY()), 2))

def main():

    from math import *

    win = GraphWin()

    # 鼠标点击三下绘制三角形

    p1 = win.getMouse()

    p2 = win.getMouse()

    p3 = win.getMouse()

    tri = Polygon(p1, p2, p3)

    tri.draw(win)

    # 调用getLength函数来计算两点间的距离

    a = getLength(p1,p2)

    b = getLength(p2,p3)

    c = getLength(p1,p3)

    # 计算周长和面积

    s = (a + b + c) / 2

    perimeter = a + b + c

    area = sqrt(s * (s - a) * (s - b) * (s - c))

    print ("该三角形的周长是:%.2f" % perimeter)

    print ("该三角形的面积是:%.2f" % area)

    win.getMouse()

main()

翻译:您将编写一个程序,允许用户使用五次鼠标单击绘制一个简单的房子。 前两次点击将是房子矩形框架的对角。 第三次单击将指示矩形门的顶部边缘的中心。 门的总宽度应为房屋框架宽度的五分之一。 门的侧面应从顶部的角落向下延伸到框架的底部。 第四次单击将指示方形窗口的中心。 窗户宽度是门的一半。 最后一次点击将指示屋顶的顶峰。 屋顶的边缘将从峰顶处延伸到房屋框架顶部边缘的角落。

解:def getLength(p1,p2):

    from math import *

    return sqrt(pow((p1.getX() - p2.getX()), 2) + pow((p1.getY() - p2.getY()), 2))

def main():

    win=GraphWin()

    #定义一个坐标系

    win.setCoords(0,0,100,100)

    #获取前两个鼠标点击的点绘制房子

    p1 = win.getMouse()

    p2 = win.getMouse()

    house=Rectangle(p1,p2)

    house.draw(win)

    #获取第三个鼠标点击的点

    p3 = win.getMouse()

    #计算房子的宽度

    houseWidth=getLength(p1,p2)

    #通过房子的宽度计算门的宽度

    doorWidth=houseWidth/5

    #通过门的宽度和第三次点击的点计算门的左上角点和右下角点

    doorP1=Point(p3.getX()-doorWidth/2,p3.getY())

    doorP2=Point(p3.getX()+doorWidth/2,p1.getY())

    #通过门的两点来绘制门

    door=Rectangle(doorP1,doorP2)

    door.draw(win)

    #获取第四次点击的点

    p4 = win.getMouse()

    #通过门的宽度计算窗户的宽度

    windowWidth=doorWidth/2

    #通过窗户的宽度和第四次点击的点来获取窗户的对角点

    windowP1=Point(p4.getX()-windowWidth/2,p4.getY()+windowWidth/2)

    windowP2=Point(p4.getX()+windowWidth/2,p4.getY()-windowWidth/2)

    #通过窗户的对角点来绘制窗户

    window=Rectangle(windowP1,windowP2)

    window.draw(win)

    #获取第五次鼠标点击的点

    p5 = win.getMouse()

    #通过第一次和第二次点击的点来获取房顶的两个点

    roofP1=Point(p1.getX(),p2.getY())

    roofP2=p2

    #绘制房顶

    roof=Polygon(p5,roofP1,roofP2)

    roof.draw(win)

    win.getMouse()

main()

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值