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中的ajax分页实现代码
Sep 20 Javascript
浅析javascript的间隔调用和延时调用
Nov 12 Javascript
JavaScript 动态加载脚本和样式的方法
Apr 13 Javascript
javascript常用经典算法实例详解
Nov 25 Javascript
浅析Node.js实现HTTP文件下载
Aug 05 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
Sep 01 Javascript
jQuery与JS加载事件用法分析
Sep 04 Javascript
谈谈JavaScript数组常用方法总结
Jan 24 Javascript
微信小程序学习笔记之跳转页面、传递参数获得数据操作图文详解
Mar 28 Javascript
浅谈一个webpack构建速度优化误区
Jun 24 Javascript
vue随机验证码组件的封装实现
Feb 19 Javascript
vue项目多环境配置(.env)的实现
Jul 21 Vue.js
详细分析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
在DC的漫画和电影中,蝙蝠侠的宿敌,小丑的真名是什么?
2020/04/09 欧美动漫
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
基于php无限分类的深入理解
2013/06/02 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
2014/08/19 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
因str_replace导致的注入问题总结
2019/08/08 PHP
代码精简的可以实现元素圆角的js函数
2007/07/21 Javascript
一些实用的jQuery代码片段收集
2011/07/12 Javascript
js数字转换为float,取N位小数
2014/02/08 Javascript
JS替换字符串中空格方法
2015/04/17 Javascript
详解Backbone.js框架中的模型Model与其集合collection
2016/05/05 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
基于JavaScript实现添加到购物车效果附源码下载
2016/08/22 Javascript
学习Node.js模块机制
2016/10/17 Javascript
javaScript基础详解
2017/01/19 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
微信sdk实现禁止微信分享(使用原生php实现)
2019/11/15 Javascript
tensorflow实现KNN识别MNIST
2018/03/12 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
python numpy 常用随机数的产生方法的实现
2019/08/21 Python
Python生成个性签名图片获取GUI过程解析
2019/12/16 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
解决django FileFIELD的编码问题
2020/03/30 Python
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
伦敦香水公司:The London Perfume Company
2019/11/13 全球购物
法制宣传教育方案
2014/05/09 职场文书
工商管理专业毕业生自我鉴定2014
2014/10/04 职场文书
共青团员自我评价
2015/03/10 职场文书
小学四年级作文之写景
2019/08/23 职场文书
2019幼儿园感恩节活动策划书
2019/11/28 职场文书
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电