随机位置
2018-06-25 本文已影响0人
xhbisme
一次偶然的机会,设计师出了这样一张图:
设计师的图在区域内,小圆形随机分布。
一般来讲,在区域内生成一个{x,y}对象并不复杂,这里的难点是碰撞检测。
先来了解一下调用方式:
调用方式参数1是随机一个位置后,调用的回调,这里会传出来{x,y,size},size可以忽略,没什么用。
参数2是告诉位置组件,圆的个数(也就是位置的个数)和小圆半径size(和回传的size是一个字段)。
参数三是整体区域的半径。
细心的同学会问:为啥都是传的半径呢?配置是什么样子的呢?getSpotPos怎么接受返回的位置呢?
我们先来看下配置的样子(getConfig函数里做了什么):
配置信息PS:想要几个位置就传几个尺寸,简单的令人发指有木有。。。
再来看下getSpotPos如何接受返回值的:
getSpotPos大家一定会有疑问:这里为什么是10次的时候重新渲染? 小编:因为配置里有10个尺寸信息啊~.~(这里其实可以抽象成一个变量)。
好了,用法就是上边这么用了,传说中的随机位置和碰撞呢?
表糟急,代码这就来。
片段1 片段280行代码,童叟无欺。
大概思想:在大圆范围(实例中,这10个元素的情况下,范围半径小于150,计算将会很吃力,所以保证范围不会小于150)中间,生成第一个位置,也是最大的元素所在的位置。然后,其他的位置随机生成后,与生成过的位置进行碰撞检测,无碰撞就记录,有碰撞,再生成。
碰撞中主要做的事情:保证不太靠边,保证不会和大圆圆心离得太近,然后就是两个位置x和y相等的情况(概率事件,不得不防)。最后是一般情况。
因为都是圆,所以只需检测圆心距离是否大于两半径与最小间距之和就可以了。
做完之后,小编发现----数学很重要啊。