1. 前言

使用canvas在一个矩形内画不重复的圆,解题思路。

2. html代码

Document

* {

margin: 0;

padding: 0;

background: #efefef;

}

.box {

width: 500px;

height: 500px;

position: absolute;

top: 0;

right: 0;

bottom: 0;

left: 0;

margin: auto;

border: 1px solid #999;

}

$('#box').draw({

number: 50, // 圆的个数

colors: ['#FF8E56', '#00A0FF', '#0ADFCD', '#1678D3', '#00D069', '#ECB700'],

text: ['Chrome', '火狐', 'Opera', '360', '猎豹', 'safari']

});

3. circleDraw.js

(function ($) {

$.fn.extend({

draw: function (option) {

if (!option) {

option = {};

}

option = $.extend({}, $.fn.draw.defaultOption, option);

try{

if(!(option.colors instanceof Array) || !(option.text instanceof Array)){

throw Error('colors、text 接受的参数是 Array[string]');

}

}catch(e){

console.log(e.stack)

}

var that = $(this);

try{

var width = $(that).width(),

height = $(that).height();

if(!(width && height)){

throw Error('请设置宽高度');

}

}catch(e){

console.log(e.stack)

}

$(that).append("");

var obj = $(that).find('canvas')[0];

ctx = obj.getContext('2d');

var circularIndex = 0,

loopIndex = 0;

// 获取中心点的坐标和半径 x1 , y1 , r1;

try{

while (true) {

circularIndex++;

// 寻找0 - ? 之间的数值

var x = Math.floor(Math.random() * width),

y = Math.floor(Math.random() * height);

var cir = $.fn.draw.circular.effect(x , y , width , height);

if(!cir){

circularIndex --;

loopIndex++;

if(loopIndex > 500000){ // 如果循环4000+ 还没有找到合适的圆,停止,防止死循环

break;

}

continue;

}else{

var color = option.colors[circularIndex] ? option.colors[circularIndex] :

option.colors[circularIndex % option.colors.length ];

var text = option.text[circularIndex] ? option.text[circularIndex] :

option.text[circularIndex % option.text.length ];

$.fn.draw.circular.begin(cir.x , cir.y , cir.r , text , color ,ctx);

}

if (circularIndex >=option.number) { // 随机生成10个园

break;

}

}

}catch(e){

console.log(e);

}

}

});

})(jQuery);

(function ($) {

var recordArr = [];

$.fn.draw.defaultOption = {

number:5, // 生成的个数

colors: ['#FF8E56'], // 默认一个颜色,可以接受的参数是 Array

text:['Chrome']

}

$.fn.draw.circular = {

/**

x1 x轴坐标

y y轴坐标

r 半径

text 文字

color 填充颜色

**/

begin: function (x, y, r, text, color , ctx) {

recordArr.push({

x: x,

y: y,

r: r

})

ctx.beginPath();

ctx.arc(x, y, r, 0, 2 * Math.PI, false);

ctx.fillStyle = color;

ctx.fill();

ctx.font = "14px Microsoft YaHei";

ctx.fillStyle = "#fffffe";

ctx.textAlign = "center";

ctx.fillText(text, x , y + 5);

ctx.closePath();

},

/**

* x 坐标

* y 坐标

* width 当前盒子宽度

* height 盒子高度

* */

effect:function (x , y , width , height) {

// 设置一个以盒子大小来计算的半径

var boxR = Math.floor(width / 6);

// 获取随机半径

var randomR = Math.floor(Math.random() * boxR);

if (randomR < 30) { // 设置半径不能低于30

return false;

} else {

// 不能划到框外

if (x + randomR > width || y + randomR > height) {

return false;

} else if (y - 2 * randomR < 0 || x - 2 * randomR < 0) {

return false;

}

// 不能出现重叠圆

for(var a = 0 ; a < recordArr.length ; a++){

var distant = Math.floor(Math.sqrt(

Math.pow(Math.abs(recordArr[a].x - x), 2) + Math.pow(Math.abs(recordArr[a].y - y), 2)

));

if(distant < randomR + recordArr[a].r){

return false;

}

}

return {

x:x,

y:y,

r:randomR

};

}

}

}

})(jQuery)

欢迎大家吐槽,如果转载请标明出处。

html5随机圆不重叠,利用canvas在一个盒子里画不重叠的圆,相关推荐

  1. 利用canvas实现的JS画圆圈特效代码

    <body> <canvas id="myCanvas" width="1200"  height="300" style ...

  2. img 标签 点击跳出图层_如何用PS在一个图层里画出一个会动的太极八卦图|教程...

    如何用PS的加减运算做出一个标准的八卦图(超详细步骤,小白福利),首先要考虑八卦图一共用了几个圆,每个圆与每个圆之间的联系. 首先ctrl+n新建一个画板(宽和高随便设置) 用矢量工具来画八卦图,什么 ...

  3. 利用canvas实现田字格里写字,并适配移动端

    结构: <!DOCTYPE html> <head> <meta charset="UTF-8"> <title>我们一起学写字&l ...

  4. Canvas入门-利用Canvas绘制好玩的电子时钟

    在这之前 你需要了解一下方法的使用: beginPath() closePath() moveTo() lineTo() fill() stroke() fillRect() clearRect() ...

  5. html5 canvas 椭圆,html5中怎么利用Canvas绘制椭圆

    html5中怎么利用Canvas绘制椭圆 发布时间:2021-07-08 16:32:10 来源:亿速云 阅读:58 作者:Leah html5中怎么利用Canvas绘制椭圆,针对这个问题,这篇文章详 ...

  6. 在html利用canvas蚂蚁,html5 利用canvas实现简单的人物走动

    最近在学习html5,其中涉及到很关键的元素canvas-画布,在网上下载了一些游戏源代码,虽然能看懂,但是想单独地针对某个功能提取出来还是有难处的,于是乎自己又上网查找了一些例子,才将超级玛丽简单的 ...

  7. html5绘制图形幸运大转盘,微信小程序利用canvas 绘制幸运大转盘功能

    小程序对 canvas api 跟h5的不太一致 ,所以这个搞的比较久,不多说,先贴代码 Page({ /** * 页面的初始数据 */ data: { awardsConfig: {}, resta ...

  8. html5 自动扣图,html5利用canvas实现颜色容差抠图功能

    利用canvas的getImageData,我们可以获取到一张图片每一个像素的信息,而通过对每一个像素信息的对比,我们就可以找到需要消去的像素点.比如下面这一张图片,如果我们想要扣去白色部分(粉色是b ...

  9. php图片素描化,html5利用canvas实现图片转素描效果

    本章给大家介绍html5如何利用canvas实现图片转素描效果.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 素描滤镜原理: 最基础的算法就是: 1.去色:(去色公式:gray = ...

最新文章

  1. 屠榜大杀器UniMP!百度登顶图神经网络权威榜单三项榜首
  2. 【Android FFMPEG 开发】FFMPEG ANativeWindow 原生绘制 ( 设置 ANativeWindow 缓冲区属性 | 获取绘制缓冲区 | 填充数据到缓冲区 | 启动绘制 )
  3. 高级数据结构与算法 | 二叉搜索树(Binary Search Tree)
  4. Xshell配置ssh免密码登录-密钥公钥(Public key)
  5. 重磅!微软发布 Visual Studio Online:Web 版 VS Code + 云开发环境
  6. python自动保存图片_Python学习笔记:利用爬虫自动保存图片
  7. python网络编程100例_python网络编程
  8. 愤怒的小鸟4只编外鸟_丽萨荐书 愤怒的小鸟 Angry Birds ICR #1
  9. 博客园的“随笔、文章、新闻、日记”有啥区别
  10. jQuery.noConflict() 解决冲突 原理深入
  11. Javascript特效:进度条
  12. ping,python实现批量ping包工具--小案例v4优化版本
  13. OpenStack Queens版本Barbican项目介绍
  14. PicGo配置阿里云OSS
  15. 字符数组动态开辟空间和静态开辟空间
  16. 论文导读:TOWARDS END-TO-END SPOKEN LANGUAGE UNDERSTANDING
  17. Cesium设置三维球的视角和位置(中心点)
  18. 化学计算机专业就业方向,女生就读数学专业、计算机类或化学专业怎么样?考研方向,就业前景?...
  19. Java编程思想之对象入门
  20. 封装composer包包

热门文章

  1. leetcode 17.电话号码的字母组合
  2. kali系统安装详细(跟着图片一步一步进发)
  3. 天猫店群是什么意思?天猫店群和传统模式相比有什么优势?
  4. Office Web外接程序开发流程
  5. 关于test指令和add指令的区别,inc指令和add指令的区别
  6. Mendeley在开题报告中的简单使用方法
  7. 函数声明后面的const用法
  8. iso文件系统转换成img格式的步骤整理
  9. python中的元类Metaclass
  10. 漫画版:什么是深度学习?