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 相关文章推荐
基于jQuery的图片剪切插件
Aug 03 Javascript
jquery 插件学习(二)
Aug 06 Javascript
js获取ajax返回值代码
Apr 30 Javascript
Javascript基础教程之数据类型 (字符串 String)
Jan 18 Javascript
VUE实现表单元素双向绑定(总结)
Aug 08 Javascript
BootStrap给table表格的每一行添加一个按钮事件
Sep 07 Javascript
vuex进阶知识点巩固
May 20 Javascript
详解vue中组件参数
Jul 09 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
Jul 24 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
Dec 05 Javascript
TypeScript中使用getElementXXX()的示例代码
Sep 12 Javascript
vue中的使用token的方法示例
Mar 10 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
PHP中文分词的简单实现代码分享
2011/07/17 PHP
php学习之function的用法
2012/07/14 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
2014/05/10 PHP
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
2016/06/12 Javascript
Java与JavaScript中判断两字符串是否相等的区别
2017/03/13 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
React中jquery引用的实现方法
2017/09/12 jQuery
JS实现分页浏览横向图片(类轮播)实例代码
2017/11/06 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
JS async 函数的含义和用法实例总结
2020/04/08 Javascript
Python实现合并字典的方法
2015/07/07 Python
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
2018/12/10 Python
详解Python对JSON中的特殊类型进行Encoder
2019/07/15 Python
python Django 创建应用过程图示详解
2019/07/29 Python
Spring实战之使用util:命名空间简化配置操作示例
2019/12/09 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
python 中的命名空间,你真的了解吗?
2020/08/19 Python
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
曼联官方网上商店:Manchester United Direct
2017/07/28 全球购物
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
垃圾回收的优点和原理
2014/05/16 面试题
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
企业宣传标语
2014/06/09 职场文书
社区植树节活动总结
2015/02/06 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python
Golang的继承模拟实例
2021/06/30 Golang