记一次简单的前端学习——阿基米德螺旋的绘制及功能

在此首先感谢这位大大的资料↓
https://blog.csdn.net/github_39335046/article/details/73931821
之前我一直在寻找canvas 怎么绘制阿基米德螺旋的文章但苦寻无果,最后看了上面这位大大的文章便觉得可以参考,才有了之后的成品。
先从最初的想法说起,记得以前看过一个视频是关于画家不断的画圆圈最后通过下笔的轻重和粗细来形成一种画里有画的感觉,类似(https://www.iqiyi.com/v_19rrh4yr7s.html)。然后我就想我能不能用canvas也作出这样的效果来。于是就开始去找怎么用canvas 绘制螺旋。首先是参考另一位网友的方法,但可惜这种方法不能知道当前画笔所处的位置,所以只好放弃寻找其他的方法。最后也是不负有心人找到了。( • ̀ω•́ )✧先贴上代码
因为博主其实是个后端新生,所以前端接触的比较少,完全是因为个人兴趣所以代码比较简陋也希望大家可以见谅,如果有不足的地方希望大家可以补充!

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			var canvas;
			var ctx;
			var dot = [];
			var a = 0;
			var f = 360
			var b = 0;
			var v = 0.005;
			var p1;
			var center = {x:500,y:300};
			var id;
			window.onload = function(){
				/**
				 * 页面加载时将图片加载入Canvas
				 */
				canvas = document.getElementById("myCanvas");
				ctx = canvas.getContext("2d");
				img = new Image();
				img.src = "img/start.png";
				img.onload = function(){
				 	//ctx.drawImage(img,300,100,400,400);
				 	ctx.drawImage(img,0,0,1000,600);
				 }
			}
			function drawCircle(p1){
				ctx.beginPath();
				var flag = false;
				var color= "#000000";
				for(var i = 0;i < dot.length;i++){
					if((dot[i].bx - p1.x <= 5 && dot[i].bx - p1.x >= 0) && (dot[i].by - p1.y <= 5 && dot[i].by - p1.y >= 0)  ){
						flag = true;
						var red = dot[i].red.toString(16);		//将十进制的RGB值转换为16进制并在空位补0
						var green = dot[i].green.toString(16);
						var blue = dot[i].blue.toString(16);
						if(red.length == 1){
							red = "0" + red;
						}
						if(green.length == 1){
							green = "0" + green;
						}
						if(blue.length == 1){
							blue = "0" + blue;
						}
						color = "#" + red + green + blue;
						break;
					}
				}
				if(flag){
					ctx.arc(p1.x,p1.y,1,0,2 * Math.PI);
				}else{
					ctx.arc(p1.x,p1.y,0.2,0,2 * Math.PI);
				}
				//ctx.stroke();
				ctx.fillStyle = color;
				ctx.fill();
			}
			function Ball(x,y,red,green,blue){
				this.bx = x;
				this.by = y;
				this.red = red;
				this.green = green;
				this.blue = blue;
			}
			function getData(){
				images = ctx.getImageData(0,0,1000,600);
				/**
				 * 将图片上有颜色的点存储进数组中
				 */
				for(var x = 0; x < canvas.width; x += 5){
					for(var y =0; y < canvas.height; y += 5){
						var i = (y * images.width + x) * 4;
						if(images.data[i+3] >= 125){ 			//表示有颜色
							var red = images.data[i];				//分别获取RGB值
							var green = images.data[i+1];
							var blue = images.data[i+2];
							var b1 = new Ball(x,y,red,green,blue);
							dot.push(b1);
						}
					}
				}
			}
			function startChange(){
				ctx.clearRect(0,0,1000,600);
				/**
				 * 开启定时器
				 */
				id = setInterval(function(){
					a = a + Math.PI / f;
					b = b + v;
					p1 = {x: center.x + b * Math.sin(a),y:center.y - b * Math.cos(a)}
					drawCircle(p1)
				},1)
			}
			function stopChange(){
				clearInterval(id)
			}
			
		</script>
	</head>
	<body>
		<canvas height="600px" width="1000px" id="myCanvas" style="border: 2px solid red;"></canvas>
		<button style="height: 100px;width: 100px;" onclick="getData()">获取消息</button>
		<button style="height: 100px;width: 100px;" onclick="startChange()">开始转换</button>
		<button style="height: 100px;width: 100px;" onclick="stopChange()">暂停</button>
	</body>
</html>

之前做了一个纯黑色的版本,这个版本是可以根据图片颜色来决定下笔的颜色。如果你需要将其换回黑白只要修改下ctx.fillStyle 为黑色即可,附上一个成品图。<彩色版本>
在这里插入图片描述<黑白版本>
在这里插入图片描述今天就到此啦 再会!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值