canvas绘图——根据鼠标位置进行缩放的实现原理
以任一点 A 缩放的基本原理:
A 点为鼠标位置,正常放大是以原点放大,那么放大后 A 点就会变到 A1 点的位置 x1, y1。然后再将画布进行位移,将 A1 的位置移动到 A,则完成以 A 点缩放的功能。
代码示例:
this.scale 是当前缩放比例,this.offsetX, this.offsetY 是当前原点位移距离,step 是每次缩放的增量
if (wheelDelta > 0) { // 放大
if (this.scale < max) { // 缩放值小于设定的最大值,则可以继续放大
this.scale += step; // 累加后 this.scale 为放大后的缩放值
if (this.scale > max) { // 越界处理
this.scale = max;
}
this.painter.scale(this.scale); // 进行缩放
// 要根据鼠标位置缩放,则要在缩放后再次移动,将缩放点的位置移动到鼠标位置
const x = e.offsetX;
const y = e.offsetY;
offsetX = (x - this.offsetX) * this.scale / (this.scale - step) - (x - this.offsetX);
offsetY = (y - this.offsetY) * this.scale / (this.scale - step) - (y - this.offsetY);
this.move(-offsetX, -offsetY);
}
为什么是 x - this.offsetX?因为代码中,当画布左移后,this.offsetX 是负数,所以使用减号得到的才是正确的坐标。
this.scale / (this.scale - step) 是缩放后的缩放值除以缩放前的缩放值,得到缩放率。
this.move() 对画布进行移动,并累加 this.offsetX 和 this.offsetY
化简得:
const move = (e) => {
const x = e.offsetX - this.offsetX; // 鼠标位置换算到相对原点的坐标
const y = e.offsetY - this.offsetY;
const offsetX = x * (this.scale - preScale) / preScale; // x * 绝对缩放率 得到位移
const offsetY = y * (this.scale - preScale) / preScale;
this.move(-offsetX, -offsetY);
};
canvas绘图——根据鼠标位置进行缩放的实现原理的更多相关文章
- canvas 绘图api的位置问题
很久没碰canvas了,今天因为canvas绘图的为之问题浪费了一些时间. 我们知道canvas的默认宽高是300X150嘛. 实际使用的时候当然是自定义一个高宽啦. 通常我们会习惯性地在js中通过c ...
- Canvas绘图之平移translate、旋转rotate、缩放scale
画布操作介绍 画布绘图的环境通过translate(),scale(),rotate(), setTransform()和transform()来改变,它们会对画布的变换矩阵产生影响. 函数 方法 描 ...
- 基于canvas绘图 缩放 做标记
技术要点: 1.img 绘制到canvas 2.绘制完成以后进行拖拽,缩放 3.使用canvas画图,在绘制的img上进行标记划线,当然可以实现跟过功能,例如百度地图的功能,做单个标记,区域标记等. ...
- HTML5自学笔记[ 12 ]canvas绘图小示例之鼠标画线
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- canvas获取鼠标位置
canvas获取鼠标位置 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- 在WPF里面实现以鼠标位置为中心缩放移动图片
原文:在WPF里面实现以鼠标位置为中心缩放移动图片 在以前的文章使用WPF Resource以及Transform等技术实现鼠标控制图片缩放和移动的效果里面,介绍了如何在WPF里面移动和放大缩小图片, ...
- HTML5 学习总结(四)——canvas绘图、WebGL、SVG
一.Canvas canvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像技术.<canvas> 标记和 ...
- canvas绘图、WebGL、SVG
目录 一.Canvas 1.1.创建canvas元素 1.2.画线 1.3.绘制矩形 1.4.绘制圆弧 1.5.绘制图像 1.6.绘制文字 1.7.随机颜色与简单动画 二.WebGL 2.1.HTML ...
- HTML5 学习笔记(四)——canvas绘图、WebGL、SVG
一.Canvas canvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像技术.<canvas> 标记和 ...
随机推荐
- [Linux] Extend space of root disk in Linux7
[root@node1 ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/centos-root 26G 17G 9.8G ...
- POJO、JavaBean、DTO的区别
一.POJO(Plain Ordinary Java Object)简单的Java对象,其中有一些属性及其getter setter方法的类,没有业务逻辑(重点理解一下"没有业务逻辑&quo ...
- Html骨架、基本语法
万丈高楼平地起,勿贪快,脚踏实地,才能仰望星空 一.HTML骨架 标准骨架 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitio ...
- scrapy_redis项目配置
一.创建普通scrapy项目 二.spiders爬虫文件中修改项 import scrapy from XX.items import XXItem import json # ----1 导入类 f ...
- ecplise包的层次结构选择
ecplise包的层次结构选择 平坦方式: 分层方式:
- Codeforces Round #538 (Div. 2) C. Trailing Loves (or L'oeufs?) (分解质因数)
题目:http://codeforces.com/problemset/problem/1114/C 题意:给你n,m,让你求n!换算成m进制的末尾0的个数是多少(1<n<1e18 ...
- 20175224 2018-2019-2 《Java程序设计》第四周学习总结
教材学习内容总结 子类的定义 class 子类名 extends 父类名 { ... } 子类继承性 子类继承父类的成员变量.方法.成员变量可以被子类中自己定义的任何实例方法操作:继承的方法可以被子类 ...
- native-echarts 图形组件
import React, {Component} from 'react'; import { AppRegistry, StyleSheet, Text, Button, View, Toucha ...
- where are you?
#version_s#1.2#version_e# #update_s#https://files.cnblogs.com/files/dyh221/rank0410.zip#update_e#
- 记Weblogic部署BUG(websocket)
将含有websocket的SSM项目部署在Weblogic上面,遇到websocket报错如下 java.lang.ClassCastException: org.springframework.se ...