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 相关文章推荐
javascript 客户端验证上传图片的大小(兼容IE和火狐)
Aug 15 Javascript
浅析js设置控件的readonly与enabled属性问题
Dec 25 Javascript
node.js中的buffer.fill方法使用说明
Dec 14 Javascript
javascript递归回溯法解八皇后问题
Apr 22 Javascript
JavaScript中的Math.LOG2E属性使用详解
Jun 14 Javascript
js实现仿京东2级菜单效果(带延时功能)
Aug 27 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
May 31 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
Jun 22 Javascript
同步文本框内容JS代码实现
Aug 04 Javascript
vue通过style或者class改变样式的实例代码
Oct 30 Javascript
JS实现带阴历的日历功能详解
Jan 24 Javascript
微信小程序select下拉框实现源码
Nov 08 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
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
php生成局部唯一识别码LUID的代码
2012/10/06 PHP
使用Thinkphp框架开发移动端接口
2015/08/05 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
Gambit vs CL BO3 第一场 2.13
2021/03/10 DOTA
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
jquery如何判断某元素是否具备指定的样式
2013/11/05 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
yepnope.js使用详解及示例分享
2014/06/23 Javascript
jQuery事件绑定on()与弹窗实现代码
2016/04/28 Javascript
js重写方法的简单实现
2016/07/10 Javascript
jQuery插件Validation快速完成表单验证的方式
2016/07/28 Javascript
使用Angular.js实现简单的购物车功能
2016/11/21 Javascript
纯js实现倒计时功能
2017/01/06 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
js实现随机数字字母验证码
2017/06/19 Javascript
搭建element-ui的Vue前端工程操作实例
2018/02/23 Javascript
vue组件之间的数据传递方法详解
2019/04/19 Javascript
python实现kMeans算法
2017/12/21 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
python 字典操作提取key,value的方法
2019/06/26 Python
Django框架基础模板标签与filter使用方法详解
2019/07/23 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
使用matlab或python将txt文件转为excel表格
2019/11/01 Python
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
Desigual美国官方网站:西班牙服装品牌
2019/03/29 全球购物
《小白兔和小灰兔》教学反思
2014/02/18 职场文书
建筑工地标语
2014/06/18 职场文书
交通安全责任书范本
2014/07/24 职场文书
见习报告的格式
2014/10/31 职场文书
2015年暑期见闻
2015/07/14 职场文书
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技