JavaScript图像放大镜效果实现方法详解


Posted in Javascript onJune 28, 2020

1. 基本四瓣花型图案

根据四瓣花卉线的参数方程:

t= r*(1+sin(12*θ)/5)*(0.5+sin(4*θ)/2);

x=t*cos(θ));

y=t*sin(θ));

编写如下的HTML文件。

<!DOCTYPE html>

<head>

	<title>基本的四瓣花型图案</title>

	<script type="text/javascript">
		function draw(id)
		{
			var canvas = document.getElementById(
				id);
			if (canvas == null)
				return false;
			var context = canvas.getContext('2d');
			context.fillStyle = "#EEEEFF";
			context.fillRect(0, 0, 320, 320);
			context.strokeStyle = "blue";
			context.lineWidth = 1;
			var dig = Math.PI / 64;
			context.beginPath();
			for (var i = 0; i <= 128; i++)
			{
				d = 120 * (1 + Math.sin(12 * i *
					dig) / 5);
				t = d * (0.5 + Math.sin(4 * i * dig) /
					2);
				x = (160 + t * Math.cos(i * dig));
				y = (160 + t * Math.sin(i * dig));
				if (i == 0)
					context.moveTo(x, y);
				else
					context.lineTo(x, y);
			}
			context.stroke();
		}
	</script>

</head>

<body onload="draw('myCanvas');">

	<canvas id="myCanvas" width="320" height="320"></canvas>

</body>

</html>

在浏览器中打开包含这段HTML代码的html文件,可以看到在画布中绘制出如图1所示的四瓣花卉线图案。

JavaScript图像放大镜效果实现方法详解

图1 四瓣花卉线图案

2.平铺的100朵四瓣花

用一个二重循环将图1的四瓣花卉绘制10行10列共100朵。编写的HTML文件内容如下。

<!DOCTYPE html>

<head>

	<title>平铺的100朵四瓣花</title>

	<script type="text/javascript">
		function draw(id)
		{
			var canvas = document.getElementById(
				id);
			if (canvas == null)
				return false;
			var context = canvas.getContext('2d');
			context.fillStyle = "#EEEEFF";
			context.fillRect(0, 0, 320, 320);
			context.strokeStyle = "blue";
			context.lineWidth = 1;
			var dig = Math.PI / 64;
			context.beginPath();
			for (px = 20; px < 320; px += 30)
				for (py = 20; py < 320; py += 30)
			{
				for (var i = 0; i <= 128; i++)
				{
					d = 20 * (1 + Math.sin(12 * i *
						dig) / 5);
					t = d * (0.5 + Math.sin(4 * i *
						dig) / 2);
					x = px + t * Math.cos(i * dig);
					y = py + t * Math.sin(i * dig);
					if (i == 0)
						context.moveTo(x, y);
					else
						context.lineTo(x, y);
				}
				context.stroke();
			}
		}
	</script>
</head>
<body onload="draw('myCanvas');">
	<canvas id="myCanvas" width="320" height="320"></canvas>
</body>
</html>

在浏览器中打开包含这段HTML代码的html文件,可以看到在画布中绘制出如图2所示的平铺的100朵四瓣花卉图案。

JavaScript图像放大镜效果实现方法详解

图2 平铺的100朵四瓣花卉图案

3.放大镜看平铺的四瓣花

将图2图形中位于中心点周围100以内的点的坐标进行球面镜反射变换,可以实现放大镜效果。编写的HTML文件内容如下。

<!DOCTYPE html>

<head>

	<title>球面镜反射变换</title>

	<script type="text/javascript">
		function draw(id)
		{
			var canvas = document.getElementById(
				id);
			if (canvas == null)
				return false;
			var context = canvas.getContext('2d');
			context.fillStyle = "#EEEEFF";
			context.fillRect(0, 0, 320, 320);
			context.strokeStyle = "blue";
			context.lineWidth = 1;
			var dig = Math.PI / 64;
			context.beginPath();
			var r = 140;
			var x0 = 160;
			var y0 = 160;
			for (px = 20; px < 320; px += 30)
				for (py = 20; py < 320; py += 30)
			{
				for (var i = 0; i <= 128; i++)
				{
					d = 20 * (1 + Math.sin(12 * i *
						dig) / 5);
					t = d * (0.5 + Math.sin(4 * i *
						dig) / 2);
					x = px + t * Math.cos(i * dig);
					y = py + t * Math.sin(i * dig);
					l = Math.sqrt((x - x0) * (x - x0) +
						(y - y0) * (y - y0));
					if (l < r)
					{ // 圆心为(160,160),半径为140的圆内各点进行球面镜反射变换
						s = x - x0 < 0 ? -1 : 1;
						if (x - x0 == 0) x = x0 + 0.1;
						bt = 2 * Math.atan(l / r);
						th = Math.atan((y - y0) / (x - x0));
						m = r * Math.sin(bt);
						x = s * m * Math.cos(th) + x0;
						y = s * m * Math.sin(th) + y0;
					}
					if (i == 0)
						context.moveTo(x, y);
					else
						context.lineTo(x, y);
				}
				context.stroke();
			}
		}
	</script>

</head>

<body onload="draw('myCanvas');">

	<canvas id="myCanvas" width="320" height="320"></canvas>

</body>

</html>

在浏览器中打开包含这段HTML代码的html文件,可以看到在画布中绘制出如图3所示的图形放大镜效果1。

JavaScript图像放大镜效果实现方法详解

图3 图形放大镜效果1

上面程序中语句var r=140;、var x0=160;和var y0=160;用于设置放大镜的圆心坐标和半径。若修改r=100,x0=100,y0=100,则在画布中绘制出如图4所示的图形放大镜效果2。

JavaScript图像放大镜效果实现方法详解

图4 图形放大镜效果2

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
extjs 学习笔记 四 带分页的grid
Oct 20 Javascript
onmouseover和onmouseout的一些问题思考
Aug 14 Javascript
js实现网页随机切换背景图片的方法
Nov 01 Javascript
node.js中的buffer.fill方法使用说明
Dec 14 Javascript
js实现同一页面多个不同运动效果的方法
Apr 10 Javascript
TypeScript 学习笔记之基本类型
Jun 19 Javascript
JavaScript时间操作之年月日星期级联操作
Jan 15 Javascript
JSON字符串和JSON对象相互转化实例详解
Jan 05 Javascript
微信小程序联网请求的轮播图
Jul 07 Javascript
react-native fetch的具体使用方法
Nov 01 Javascript
JS同步、异步、延迟加载的方法
May 05 Javascript
JavaScript数组特性与实践应用深入详解
Dec 30 Javascript
详细分析Node.js 模块系统
Jun 28 #Javascript
微信小程序实现拨打电话功能的示例代码
Jun 28 #Javascript
js瀑布流布局的实现
Jun 28 #Javascript
JavaScript如何使用插值实现图像渐变
Jun 28 #Javascript
vue实现登录拦截
Jun 29 #Javascript
Laravel 如何在blade文件中使用Vue组件的示例代码
Jun 28 #Javascript
JavaScript多种图形实现代码实例
Jun 28 #Javascript
You might like
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
基于jquery的无限级联下拉框js插件
2011/10/29 Javascript
js style动态设置table高度
2014/10/21 Javascript
基于javascript的COOkie的操作实现只能点一次
2014/12/26 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
原生JS实现首页进度加载动画
2016/09/14 Javascript
jQuery事件详解
2017/02/23 Javascript
jQuery编写textarea输入字数限制代码
2017/03/23 jQuery
JQuery 获取Dom元素的实例讲解
2017/07/08 jQuery
用户管理的设计_jquery的ajax实现二级联动效果
2017/07/13 jQuery
seaJs使用心得之exports与module.exports的区别实例分析
2017/10/13 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
2018/01/16 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
vue中设置、获取、删除cookie的方法
2018/09/21 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
微信小程序上传文件到阿里OSS教程
2019/05/20 Javascript
layui 弹出删除确认界面的实例
2019/09/06 Javascript
实例讲解Python中的私有属性
2014/08/21 Python
Python的Urllib库的基本使用教程
2015/04/30 Python
python魔法方法-属性转换和类的表示详解
2016/07/22 Python
用Python实现KNN分类算法
2017/12/22 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
TensorFlow模型保存和提取的方法
2018/03/08 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
美国卡车、吉普车和SUV零件网站:4 Wheel Parts
2016/11/24 全球购物
英国拳击装备购物网站:RDX Sports
2018/01/23 全球购物
计算机应用专业推荐信
2013/11/13 职场文书
运动会跳远广播稿
2014/02/04 职场文书
理工类毕业自我鉴定
2014/02/20 职场文书
开业主持词
2014/03/21 职场文书
异地年检委托书范本
2014/09/24 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
感动中国何玥观后感
2015/06/02 职场文书