暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

玄武之道:——论Python 和 Turtle

虾神说D 2016-06-22
789

时暧其曭莽兮,召玄武而奔属。虾神的话有几个字我也不认识
……………………………………………………………………
玄武是守护北方的神兽 ,龟蛇合体,为周天二十八星宿中,北方七宿的总称,即 斗、牛、女、虚、危、室、壁。星宿投影显化,照应诸天,凝聚星斗之力,化为一尊天神,即北极真武荡魔大帝,大帝脚踏龟蛇,手持真武剑,周行六合,威慑万灵。


 
科普了一点道门知识,啥用?就是讲讲Python的一个绘图包---- Turtle。Python是蛇,Turtle是龟,暗合道长道门天象,合该道长教大兴。


Python就不多介绍了,说说Turtle吧,Turtle最早是logo程序,所以运起来很傻白甜,当然很符合道长这种懒得思考的性格,Turtle绘图可以按照设定的步长和方向,进行路径跟随绘制,形成相应的图形,百度上有很多经典的绘图实例,比如希尔伯特曲线(Hilbert)....


既然Turtle能绘制图形,而道长经常和行政区划打交道,那么道长就想用Turtle绘制一个shp图层看看:


一个行政区划的面图层,就是有一定数量的拐点包围形成的,又因为shp有自己投影信息,因此拐点就有自己地理的定位信息,就是它们的经纬度,为嘛说这么多,纯粹为了凑字数噻。


既然拐点有自己信息,道长就能跟着拐点的序列进行跟踪绘制,那么问题就来了:


拐点的信息是经纬度,而Turtle的绘制规则是步长和方向,明显拐点的信息不能直接构成Turtle绘制的条件,所以道长需要一定计算方法,把点的信息转化成步长的和方向。


首先说步长,这个简单,有了A点和B点的经纬度信息,通过两点间的距离公式,就很方便计算噻:

至于方向就比较麻烦了,首先道长要确定的是A点到B点需要拐多大的方向,这就是AB向量的坐标方位角。嘛是坐标方位角:起点指北方向线起,依顺时针方向到目标方向线之间的水平夹角。
 
根据示意图,总结一下,四个象限的角度:


对于这个,就道长就设计一个函数,判断AB坐标的差值,及通过反三角函数,return出道长想要的坐标方位角,代码如下:


 


干到这时候,很多人就想,哎呦,方向有啊,道长以前也是这么想的,但是一跑代码就懵逼了,跑出了一个鬼,MD!太上老君即继续律令。
好吧,道长把世界想到太简单,其实道长还是纯洁的孩子。




手上没有尺子,临时用银行卡画一下,欢迎大家通过这张银行卡给道长卡里打香油钱,道长老司机会保佑你们轻松上路,啪啪无忧。(虾神的话:其实给我就可以了……道长不食人间烟火了


好吧,回到主题,观察一下道长画的图,会发现之前计算的坐标方位角其实只是计算了A到B点的∠α1,线路从α到A到B,是有一个累计角的过程,就是A到B的方向是α到A的方向角减去A到B的坐标方位角,即∠α2 = ∠α3 -∠α1,∠α1就是AB的方位角,而∠α2就是道长要求的方向。


到现在,道长凑齐了,绘制面图层的两个要素,步长和方向,接下来,只是代码编写的过程了。正如道长之前所说的,Turtle的编写很简单:

    Turtle.goto(0,0) ##定位到初始点的位置
    Turtle.speed(10) ##可以填写你要绘制的速度
    Turtle.fillcolor('yellow') ##最后图形填充的颜色
    Turtle.forward(15)  ##填写的步长
    Turtle.right(144)  ##填写的方向的角度

当然,道长也稍微简单做了一个while循环的算法进行跟踪绘制,最后动起来把:

    
当然这个效果时候,给了熊爷和大虾瞅瞅,得到两个回答:
 




看看两个民粹,两个五毛,不要怀疑道长,道长是生在新中国、长在红旗下的一代!小时候,唱着“我是共产主义接班人”的歌曲,心中满怀激情、充满憧憬。长大有强烈宗教信仰的党外爱国皿煮人士!!!是很有可参加我们县政治协商会议的!!!(虾神的话:我以人格保证道长的中左()立场……

文章转载自虾神说D,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论