除了纵横坐标可以确定一个位置外,知道方向和距离也可以确定一个位置。
例题:如下图,一艘船在A处遇险后向相距35 n mile 位于B处的救生船报警,救生船的导航系统需要输入以它的当前位置为原点、正东和正北分别为x轴和y轴的正向的目标坐标。请用海龟画图确定A点位置坐标(结果保留小数点后3位)。
分析:坐标原点和方向已作规定,只要估算画布的大小。有一个锐角是60度的直角三角型三边数量关系如下图:
,短直角边长是斜边的二分之一,长直角边长不超过斜边的十分之九。由于要在上面写字,图片区域采用画布的70%,数量采用向上50取整。画布计算如下:
宽=35*0.9/70%=45;
高=35*0.5/70%=25。
采用10像素表示1个坐标单位,因此画布大小是450x250,窗口大小采用画布大小的1.8倍(坐标数不重合)。
Python源程序代码(图片):
Python源程序代码(源码):
见附录1。
绘制出的精美图片:
答:遇险船A点坐标是(-30.311,-17.500) n mile。
用函数轨迹模块(附录2)和海龟画图完成下面练习题:
1、如下图,一艘货轮与灯塔相距40 n mile ,以灯塔为原点、正东和正北分别为x轴和y轴的正向,用海龟画图确定货轮位置坐标(结果保留小数点后2位)。
2、如下图,在一次活动中,位于A处的1班准备前往相距5km的B处与2班会合。以2班B处为原点、正东和正北分别为x轴和y轴的正向,用海龟画图确定1班A处位置坐标(结果保留小数点后4位)。
附录1:
#方向和距离确定坐标
import sys
sys.path.append("/5xstar/pyfiles") #预制自定义模块(py文件)存放根目录
import turtle as t #导入海龟画图
t.setup(450*1.8,250*1.8) #窗口大小,画布放大1.8倍
t.screensize(450,250)
t.shape("circle")
t.shapesize(0.25,0.25) #印章时是四分之一大小
from mymath.rcs import * #导入函数轨迹模块
xUnt = (1,10) #数值与像素数值比例1:10,实际坐标是像素数的十分之一
yUnt = (1,10)
wc = (-360,-220,90,30) #自定义坐标元组(左下角x坐标, 左下角y坐标, 右上角x坐标, 右上角y坐标)
build(t,xUnt,yUnt,wc) #画平面直角坐标系
t.up()
workFont=("宋体", 12, "bold") #标位置字体:12号,宋体,黑体
from decimal import Decimal #从精确数模块导入精确数类
def indication(name,pos,dx=5,dy=5,algn=None): #标定位置函数
'''
@name 位置名称
@pos 位置坐标
@dx 写字位置x增加值
@dy 写字位置y增加值
@align 写字方向:center,left,right
'''
t.setpos(pos)
t.stamp()
t.setpos(pos[0]+dx,pos[1]+dy)
if algn == None: #Decimal(pos[0]/10).quantize(Decimal('0.000'))表示x坐标除以10转为精确数,然后输出小数点后有3位数字的字符串
t.write("%s(%s,%s)" % (name,Decimal(pos[0]/10).quantize(Decimal('0.000')), Decimal(pos[1]/10).quantize(Decimal('0.000'))), font=workFont)
else:
t.write("%s(%s,%s)" % (name, Decimal(pos[0]/10).quantize(Decimal('0.000')), Decimal(pos[1]/10).quantize(Decimal('0.000'))), align=algn, font=workFont)
_dy=-workFont[1]-markFont[1]-5 #标定救生船 B点位置(原点)
indication("B",(0,0),dy=_dy)
t.sety(_dy-workFont[1]-5)
t.write("(救生船)", font=workFont)
t.setpos(0,0) #标定遇险船 A点的位置
t.down()
t.setheading(-150) #把方向定为南偏西60度
t.forward(330) #前进33 n mile
pos=t.pos() #缓存当前位置
heading=t.heading() #缓存当前方向
t.right(90) #向右转90度,这样园心在左边,与A点同侧
t.circle(20,60) #半径20,这一圆心与A点重合,画弧60度
t.up()
postemp=t.pos()
t.setx(postemp[0]+5)
t.write("60", font=workFont) #打印角度值
t.setpos(pos) #恢复海龟位置
t.setheading(heading) #恢复海龟方向
t.down()
t.forward(20) #前进剩下的2 n mile
pos=t.pos()
t.up()
_dy=-workFont[1]-5 #写字的y坐标偏移
indication("A",pos,dy=_dy) #标记A的坐标
_dy-=workFont[1]+5 #第二行字的y坐标偏移
t.sety(pos[1]+_dy)
t.write("(遇险船)", font=workFont)
t.setpos(pos) #画剩下的竖线
t.setheading(90)
t.down()
t.forward(100)
t.ht() #隐藏画笔
t.mainloop() #点击文件打开时,保持图片不关闭