软件项目技术点(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图. 在软件里显示的同样是这样的动态效果: 那 ...
随机推荐
- 论文阅读 | FCOS: Fully Convolutional One-Stage Object Detection
论文阅读——FCOS: Fully Convolutional One-Stage Object Detection 概述 目前anchor-free大热,从DenseBoxes到CornerNet. ...
- 分分钟钟学会Python - 数据类型(list、tuple)
第四节 数据类型(列表.元祖) 今日内容 列表 元祖 1.列表 1.格式 users = ["ji",1,3,"gyhj"] 2.公共方法 1.len #计算长 ...
- Canvas 同心圆旋转示例解析
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- HBase启动时IP地址解析不正确的问题及解决方法
HBase启动时遇到IP地址解析不正确,连不上Regionserver , 配置文件上写的 192.168.100.28, 错误信息 Problem binding to /202.102.110. ...
- 02-oracle字符函数
字符函数(scott/tiger 登陆) --upper(col name)将字符大写 --lower(col name)将字符小写 --initcap(col name)字符串的首字母大写,其余小写 ...
- Python - 三级菜单优化方法 (单层循环)
menu = {...... } current_layer = menu layers = [] while True: for k in current_layer: print(k) choic ...
- (转)Python 标准库笔记:string模块
String模块包含大量实用常量和类,以及一些过时的遗留功能,并还可用作字符串操作. 原文:http://www.10tiao.com/html/384/201709/2651305041/1.htm ...
- select for update和select for update wait和select for update nowait的区别
CREATE TABLE "TEST6" ( "ID" ), "NAME" ), "AGE" ,), "SEX ...
- Orcale 之子查询
子查询和连接查询一样,都提供了使用单个查询访问多个表中的数据的方法.子查询在其他查询的基础上,提供一种进一步有效的方式来访问数据. IN 关键字 使用 IN 关键字可以将原表中特定的的值与子查询中返回 ...
- 游戏中的网络同步机制——Lockstep(帧同步)
本文来自: https://bindog.github.io/blog/2015/03/10/synchronization-in-multiplayer-networked-game-lockste ...