js实现固定区域内的不重叠随机圆

关键词:js、固定区域、不重叠、随机圆,半径固定、半径随机

最近公司有一个需求就是在一个固定的区域(500X500)内显示10个圆,且半径固定,而且不重叠

因为圆的个数固定,而且半径固定,那么就有可能会没有解决方案。

不过其实也没有很难,处理好半径的最大值就好了。

效果图:

这里写图片描述

思路:

(固定半径)
step1:先在区域内生成一个随机的圆心坐标,
step2:然后拿一个固定半径(从大到小拿固定半径)
step3:判断圆心和半径是否合法(是否超边距,或者两个圆相交)
step4:如果不合法,重新执行step2和step3
step5:如果合法,记为一个新圆
step6:重复step1~5,直到生成10个圆

(随机半径)
step1:先在区域内生成一个随机的圆心坐标,
step2:根据圆心坐标,与其他圆比较,获取最短的圆心距减去比较圆的半径(圆心距- Rn R n )的值,作为新圆的半径(这样就会生成一个相切的圆)
step3:判断圆心和半径是否合法(是否超边距)
step4:如果不合法,重新执行step2和step3
step5:如果合法,记为一个新圆
step6:重复step1~5,直到生成10个圆

代码:

在线案例:https://runjs.cn/code/wlsd61jc

// 参数
let obj = {
    id: string, 
在Vue中实现在某一区域中多个元素随机定位显示且重叠的一种比较简单的方法是使用CSS中的`position: absolute`属性和JavaScript中的随机数生成函数。具体实现步骤如下: 1. 在Vue的模板中,定义一个容器元素,设置其样式为`position: relative`,表示其内部的元素都是以该容器为基准进行绝对定位。 ```html <template> <div class="container"> <div class="box" v-for="(item, index) in items" :key="index">{{ item }}</div> </div> </template> <style> .container { position: relative; width: 500px; height: 300px; border: 1px solid #ccc; } .box { position: absolute; width: 50px; height: 50px; background-color: #f00; color: #fff; text-align: center; line-height: 50px; } </style> ``` 2. 在Vue的`data`中定义一个数组`items`,存储要显示的元素。 ```javascript export default { data() { return { items: ['A', 'B', 'C', 'D', 'E'] } } } ``` 3. 在Vue的`mounted`生命周期函数中,使用JavaScript中的`Math.random()`函数生成随机的`left`和`top`值,将每个元素进行定位,并检测是否与其他元素重叠,若重叠则重新生成随机位置,直到重叠为止。 ```javascript export default { mounted() { const boxes = this.$el.querySelectorAll('.box') const containerRect = this.$el.getBoundingClientRect() const boxRects = Array.from(boxes).map(box => box.getBoundingClientRect()) for (let i = 0; i < boxes.length; i++) { let left = Math.floor(Math.random() * (containerRect.width - boxRects[i].width)) let top = Math.floor(Math.random() * (containerRect.height - boxRects[i].height)) while (isOverlap(left, top, i, boxRects)) { left = Math.floor(Math.random() * (containerRect.width - boxRects[i].width)) top = Math.floor(Math.random() * (containerRect.height - boxRects[i].height)) } boxes[i].style.left = `${left}px` boxes[i].style.top = `${top}px` } function isOverlap(left, top, index, rects) { for (let i = 0; i < index; i++) { if (left + rects[index].width > rects[i].left && left < rects[i].left + rects[i].width && top + rects[index].height > rects[i].top && top < rects[i].top + rects[i].height) { return true } } return false } } } ``` 4. 在判断是否重叠的函数`isOverlap`中,通过比较当前元素的位置和之前元素的位置,判断是否重叠,若重叠则返回`true`,否则返回`false`。 这样,就实现了在Vue中实现在某一区域中多个元素随机定位显示且重叠的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值