软件项目技术点(5)——在canvas上绘制动态网格线
AxeSlide软件项目梳理 canvas绘图系列知识点整理
grid类的实现
当鼠标在画布上缩放时,网格能跟着我的鼠标滚动而相应的有放大缩小的效果。

下面是具体实现的代码,draw函数里计算出大网格每条线的间隔和小网格线的间隔,以及大网格和小网格绘制所用的颜色。
具体的实现算法也是参照另外一个软件用到的,但是我们改进了很多,例如控制只将当前画面显示出来的线条绘制出来
draw() {
var scale = (editor && editor.canvas && editor.canvas.canvasImp.scale) || 1;//获取当前画布缩放比
var B = .05;
var t = 50;
for (var e = 50 * scale; e >= 200;) // 放大
{
e /= 4;
t = e / scale;
}
for (; 50 > e;) //缩小
{
e *= 4;
t = e / scale;
}
var i = B + (e - 50) / 150 * (.07 - B);//颜色值
this.clear(0, 0, this.canvasWidth, this.canvasHeight);//清空画布
this.drawGrid(t, i + 0.03);//绘制小格子
this.drawGrid(t * 4, .21 - i);//绘制大格子
}
private drawGrid(e, i) {//e表示每两条线的间隔距离值;i颜色值,大格子的颜色和小格子的颜色值不同
var P = "rgba(0,0,0,";
var l = P + i + ")", t = 0;
var scale = (editor && editor.canvas && editor.canvas.canvasImp.scale) || 1;
this.context2D.beginPath();
//为优化性能,控制只绘制当前画面大小的网格线
var b = this.getLimits();
var winInfo = getWindow();
var viewMinx = 0;
var viewMiny = 0;
var viewMaxx = winInfo.width;
var viewMaxy = winInfo.height;
var isDraw = false;
var windowViewPoints = new Common.List<Core.Point>();
windowViewPoints.add(new Core.Point(viewMinx, viewMiny));
windowViewPoints.add(new Core.Point(viewMaxx, viewMaxy));
windowViewPoints.add(new Core.Point(viewMinx, viewMaxy));
windowViewPoints.add(new Core.Point(viewMaxx, viewMiny));
var that = this;
var minX = 0, maxX = 0, minY = 0, maxY = 0;//最大、最新 x y值
windowViewPoints.foreach((index, item: Core.Point) => {
var point = that.context2D.transformedPoint(item.x, item.y);
if (index == 0) {
maxX = minX = point.x;
minY = maxY = point.y;
}
else {
minX = minX > point.x ? point.x : minX;
maxX = maxX < point.x ? point.x : maxX;
minY = minY > point.y ? point.y : minY;
maxY = maxY < point.y ? point.y : maxY;
}
});
//纵向线条
t = b.minX;
while (true) {
if (Math.abs(t - minX) <= e || t >= minX) {
this.context2D.moveTo(t, minY);
this.context2D.lineTo(t, maxY);
}
t = t + e;
if (t >= maxX) break;
}
//横向线条
t = b.minY;
while (true) {
if (Math.abs(t - minY) <= e || t >= minY) {
this.context2D.moveTo(minX, t);
this.context2D.lineTo(maxX, t);
}
t = t + e;
if (t >= maxY) break;
}
this.context2D.closePath();
this.context2D.strokeStyle = l;
this.context2D.lineWidth = 1 / scale;
this.context2D.stroke();
}
软件项目技术点(5)——在canvas上绘制动态网格线的更多相关文章
- 软件项目技术点(7)——在canvas上绘制自定义图形
AxeSlide软件项目梳理 canvas绘图系列知识点整理 图形种类 目前我们软件可以绘制出来的形状有如下这几种,作为开发者我们一直想支持用户可以拖拽的类似word里面图形库,但目前还没有找到比 ...
- 软件项目技术点(6)——结合鼠标操作绘制动态canvas画布
AxeSlide软件项目梳理 canvas绘图系列知识点整理 我们创建一个类封装了所有鼠标需要处理的事件. export class MouseEventInfo { el: HTMLElemen ...
- Canvas上绘制几何图形
重要的类自定义View组件要重写View组件的onDraw(Canvase)方法,接下来是在该 Canvas上绘制大量的几何图形,点.直线.弧.圆.椭圆.文字.矩形.多边形.曲线.圆角矩形,等各种形状 ...
- 软件项目技术点(2)——Canvas之平移translate、旋转rotate、缩放scale
AxeSlide软件项目梳理 canvas绘图系列知识点整理 画布操作介绍 画布绘图的环境通过translate(),scale(),rotate(), setTransform()和transf ...
- 软件项目技术点(2)——Canvas之坐标系转换
AxeSlide软件项目梳理 canvas绘图系列知识点整理 默认坐标系与当前坐标系 canvas中的坐标是从左上角开始的,x轴沿着水平方向(按像素)向右延伸,y轴沿垂直方向向下延伸.左上角坐标为 ...
- 软件项目技术点(2)——Canvas之获取Canvas当前坐标系矩阵
AxeSlide软件项目梳理 canvas绘图系列知识点整理 前言 在我的另一篇博文 Canvas坐标系转换 中,我们知道了所有的平移缩放旋转操作都会影响到画布坐标系.那在我们对画布进行了一系列操 ...
- 软件项目技术点(8)—— canvas调用drawImage绘制图片
AxeSlide软件项目梳理 canvas绘图系列知识点整理 html5中标签canvas,函数drawImage(): 使用drawImage()方法绘制图像.绘图环境提供了该方法的三个不同版本 ...
- 软件项目技术点(1)——d3.interpolateZoom-在两个点之间平滑地缩放平移
AxeSlide软件项目梳理 canvas绘图系列知识点整理 软件参考d3的知识点 我们在软件中主要用到d3.js的核心函数d3.interpolateZoom - 在两个点之间平滑地缩放平移.请 ...
- 软件项目技术点(9)——如何将gif动态图拆分绘制
AxeSlide软件项目梳理 canvas绘图系列知识点整理 背景介绍 我们的软件支持插入gif图片,并且展示在软件里是动态的,例如插入下面这张gif图. 在软件里显示的同样是这样的动态效果: 那 ...
随机推荐
- 2016级算法第四次上机-G.ModricWang的序列问题 II
1021 ModricWang的序列问题II 思路 此题与上一题区别不是很大,只是增加了一个长度限制,当场通过的人数就少了很多. 大体解题过程与上一题相同.区别在于对\(f[]\) 的操作.没有长度限 ...
- IntelliJ IDEA 版本控制(svn、git) 修改文件后,所属目录的颜色也变化
IntelliJ IDEA 的版本控制默认文件修改了,所属目录的颜色是不会变化,这很不方便.如: 修改方法如下: File --> settings --> version control ...
- DFS-20190206
找出所有方案 排列和组合问题 排列: https://www.lintcode.com/problem/combination-sum/description public class Solutio ...
- 基于两阶段提交的分布式事务实现(UP-2PC)
引言:分布式事务是分布式数据库的基础性功能,在2017年上海MySQL嘉年华(IMG)和中国数据库大会(DTCC2018)中作者都对银联UPSQL Proxy的分布式事务做了简要介绍,受限于交流形式难 ...
- .net将List序列转为Json字符串
将List类型转化为Json,是我们平常开发时最常见的了.在使用中,有很多种方法,也可以使用. 第一种 第三方组件:Newtonsoft.Json.dll //转化成Json Newtonsoft.J ...
- Docker入门笔记(1)
Docker入门笔记(1) 1.安装Docker yum -y install docker-ce 2.查看Docker版本 [root@localhost ~]# docker -v Docker ...
- 实验Complex
#include<iostream> #include<cmath> using namespace std; class Complex { public: Complex ...
- String字符串排序1.8 lamda表达式以及1.7自定义排序
// 1.8 public class text { public static void main(String[] args) { String s1 = "哈哈哈11,呵呵呵22,嘿嘿 ...
- webpack查缺补漏
webpack是模块化打包工具,通过webpack,可以使得我们更加方便地组织代码.压缩.转译等等. 但是学习webpack也需要一定的成本,这里记录使用webpack许久以来一些模糊的知识点,方便以 ...
- Zookeeper概念学习系列之paxos协议
不多说,直接上干货! 前言 一种最终一致的算法,paxos算法. paxos算法是由大牛lamport发明的,关于paxos算法有很多趣事.比如lamport论文最初由故事描述来引入算法,以至于那班习 ...