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加加速(javascript加速)
Aug 19 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
Mar 25 Javascript
Extjs NumberField后面加单位实现思路
Jul 30 Javascript
js实现无需数据库的县级以上联动行政区域下拉控件
Aug 14 Javascript
Js操作Select大全(取值、设置选中等等)
Oct 29 Javascript
js点击button按钮跳转到另一个新页面
Oct 10 Javascript
JavaScript匿名函数用法分析
Feb 13 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
Feb 06 Javascript
JavaScript用200行代码制作打飞机小游戏实例
Jun 21 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
Jul 13 Javascript
vue项目中使用fetch的实现方法
Apr 25 Javascript
Vue+Vant 图片上传加显示的案例
Nov 03 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
php下将XML转换为数组
2010/01/01 PHP
第三章 php操作符与控制结构代码
2011/12/30 PHP
php curl_init函数用法
2014/01/31 PHP
php将字符串转换为数组实例讲解
2020/05/05 PHP
jQuery EasyUI 的EasyLoader功能介绍
2010/09/12 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
Egret引擎开发指南之创建项目
2014/09/03 Javascript
html的DOM中document对象forms集合用法实例
2015/01/21 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
js仿手机页面文件下拉刷新效果
2016/10/14 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀
2018/06/13 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
2019/10/30 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
33个Python爬虫项目实战(推荐)
2019/07/08 Python
python 实现人和电脑猜拳的示例代码
2020/03/02 Python
浅谈keras2 predict和fit_generator的坑
2020/06/17 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
2021/02/04 Python
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
台湾东南旅游社网站:东南旅游
2019/02/11 全球购物
什么是URL
2015/12/13 面试题
求职信格式范本
2013/11/15 职场文书
求职推荐信范文
2013/12/01 职场文书
团队会宣传标语
2014/10/09 职场文书
公安机关纪律作风整顿剖析
2014/10/10 职场文书
群众路线专项整治方案
2014/10/27 职场文书
实习计划书范文
2015/01/16 职场文书
如何做好工作总结!
2019/04/10 职场文书
Python selenium的这三种等待方式一定要会!
2021/06/10 Python