如何实现随机生成坐标点,并且使每个坐标点之间的距离大于某个距离?(用于散点图的绘制,进行数据的处理)

背景:

最近需要开发一个新需求,需要绘制一个随机生成数字的散点图,要求点与点的距离要大于某个特定值。

解决思路:

通过循环获取每个坐标点,每获取一个新的坐标点,都要与之前生成的坐标点进行对比,如果大于指定距离,
则符合条件,退出循环,如果小于或等于该距离,则继续随机生成,进行比对。

实现代码:

        let dataArray  = [];

        for (let i = 1; i < 10; i++) {
            let obj = {};
            if (i == 0) {
                obj.x = Math.round(Math.random() * 100);
                obj.y = Math.round(Math.random() * 100);
            } else {
                let number = 0;
                while (number <= 10) {
                    obj.x = Math.round(Math.random() * 100);
                    obj.y = Math.round(Math.random() * 100);
                    let flag = dataArray.every((item) => {
                         //点与点之间的计算公式
                        number = Math.sqrt(Math.pow(Math.abs(obj.x - item.x), 2) + Math.pow(Math.abs(obj.y - item.y), 2));
                        return number >= 10
                    })
                    if (flag) {
                        break
                    }
                }
            }
            dataArray.push(obj);
        }

        console.log(dataArray)

配合echarts完整代码实现:

可直接复制到本地看效果!!!!

<!DOCTYPE html>
<html lang="zh-CN" style="height: 100%">

<head>
    <meta charset="utf-8">
</head>
<body style="height: 100%; margin: 0">
    <div id="container" style="height: 100%"></div>
    <script type="text/javascript" src="https://fastly.jsdelivr.net/npm/echarts@5.4.0/dist/echarts.min.js"></script>
    <script type="text/javascript">
        var dom = document.getElementById('container');
        var myChart = echarts.init(dom, null, {
            renderer: 'canvas',
            useDirtyRect: false
        });
        var app = {};
        var option;
        let dataArray  = [];

        for (let i = 1; i < 10; i++) {
            let obj = {};
            if (i == 0) {
                obj.x = Math.round(Math.random() * 100);
                obj.y = Math.round(Math.random() * 100);
            } else {
                let number = 0;
                while (number <= 10) {
                    obj.x = Math.round(Math.random() * 100);
                    obj.y = Math.round(Math.random() * 100);
                    let flag = dataArray.every((item) => {
                         //点与点之间的计算公式
                        number = Math.sqrt(Math.pow(Math.abs(obj.x - item.x), 2) + Math.pow(Math.abs(obj.y - item.y), 2));
                        return number >= 10
                    })
                    if (flag) {
                        break
                    }
                }
            }
            dataArray.push(obj);
        }

        console.log(dataArray)

        let newArray = []

        dataArray.map((ele) => {
            let array = []
            array.push(ele.x);
            array.push(ele.y);
            newArray.push(array);
        })

        option = {
            xAxis: {},
            yAxis: {},
            tooltip: {
                trigger: 'axis',
                axisPointer: {
                    type: 'cross'
                }
            },
            series: [
                {
                    symbolSize: 20,
                    data: newArray,
                    type: 'scatter'
                }
            ]
        };

        if (option && typeof option === 'object') {
            myChart.setOption(option);
        }

        window.addEventListener('resize', myChart.resize);
    </script>
</body>

</html>

效果图:

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值