爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3040|回复: 2

[混合编程] IDL编程学习之螺旋数组的生成算法与程序[难]

[复制链接]
发表于 2018-5-3 15:41:44 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
五一假期前想生成一个从内向外螺旋递增的数组:
      17      16      15      14      13
      18       5       4       3      12
      19       6       1       2      11
      20       7       8       9      10
      21      22      23      24      25

但是失败了。
虽然看似简单,但是我能想出的算法面临着复杂的逻辑。
我的思路是这样:
以5×5的数组为例,那么中心点是[2,2],假设我已经从内向外填了一些空格,那么对于每一步,都面临着四个方向的选择,其中最多2个方向相对于中心点是“顺时针”的,且这2个方向距离中心点有远有近,优先填近的,如果近的已经填了,就走远的。
从中心点到当前位置[i,j]的向量=vec1=[i-2,j-2]
该向量顺时针选装90°的向量=vec2=[j-2,2-i]
当前位置面临的下一步向量dir=[ii,jj]包括[0,1][0,-1][1,0][-1,0]四者
符合顺时针则dir*vec2>0
如果距离中心近的(dir*vec1<0)没有填值(x[i+ii,j+jj] eq 0),就把该位置填上,且当前位置移到该位置,不然就填远离中心的那一位置。
实现了5×5的数组,改动下,形成任意奇数×奇数的螺旋数组
程序见附件。
当然,程序比较臃肿,算法比较原始,如果某位高人有高招,不吝赐教!
后续我可能也会自己跟帖把程序优化一下。。。但平时比较忙。

swan.pro

735 Bytes, 下载次数: 2, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao
 楼主| 发表于 2018-5-3 16:01:45 | 显示全部楼层
生成的数组是逆时针的,这是因为数组的横竖顺序与笛卡尔坐标有区别
不过只要把生成的数组转动一下即可,print,reverse(x,2)
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2018-5-4 11:39:17 | 显示全部楼层
昨天写了这个螺旋数组的代码,脑力疲劳,今天花了些时间,一题多解
今天的新想法是增加一个判据(一个标量),便于直接找出下一步向量(该构造方法下,其判据值为最大值)。
关于判据的构造,我考虑着:
dir与vec2的向量积一定要是正的才行,判据=判据其余部分*(dir*vec2 gt 0),不符合的话,无论其他部分是多少,判据=0
下一个格子的值(简称值)与上述向量积的要求一样,判据=其余部分*(值 eq 0),不符合的话,无论其他部分是多少,判据=0
还有一项是dir*vec1,这一项正、负、零都行,值越小越优先,
如果构造为  判据=其余部分*(dir*vec1 le 0),则该状况下的0值与上2种情况的0值混淆,会出现没有最大值的逻辑错误。
所以只需要改动一下,使布尔值都大于0:判据=其余部分*((dir*vec1 le 0)+1),这样,布尔值是1或2,而不是0和1,就可以在筛选掉以上两种情况下,对第3个量进行比较了。

swan.pro

589 Bytes, 下载次数: 0, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表