软件项目技术点(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图. 在软件里显示的同样是这样的动态效果: 那 ...
随机推荐
- Python3学习札记
1.- (按位取反) x的按位取反结果为-(x+1) e.g. -5输出-6 更多细节,阅:http://stackoverflow.com/a/11810203 2.DocString约定 为一 ...
- 关于web界面设计的整体可维护性的感悟
1.表现与数据分开管理: 某些数据具备特殊的表现格式,比如颜色,大小等等.为了对这些格式表现分开管理进行 a.使用css定义该类型数据的表现形式: 定义数据的类别,通过该类别对数据格式进行统一定义 . ...
- 2016级算法第四次上机-D.AlvinZH的1021实验plus
978 AlvinZH的1021实验plus 思路 贪心,中等题. 使用miss变量表示未覆盖的最小数字,初始值为1. 初始覆盖区间为[1,miss),目标是覆盖[1,m],即miss需要大于m. 需 ...
- angular5给懒加载模块添加loading
在根组件的构造函数中直接执行: this.router.events.subscribe(event=>{ if(event instanceof RouteConfigLoadEnd) { t ...
- 大数据-hive安装
1.下载Hive需要的版本 我们选用的是hive-3.1.0 将下载下来的hive压缩文件放到/opt/workspace/下 2.解压hive-3.1.0.tar.gz文件 [root@master ...
- 高阶篇:6)设计评审Design reviews;
本章目的:明白设计评审Design reviews的概念和流程,不犯常见错误. 1 设计评审概念: 所谓设计评审,是指对设计所作的正式的.综合性的和系统性的审查,并写成文件,以评定设计要求与设计能力是 ...
- iis+php(FastCGI)
1. 安装 IIS 时选择添加 CGI 功能 2. 安装 PHP, 2.1 下载 nts 版本 (非线程安全版本) zip 压缩包,下载对应的 vc++ 运行时(php官网下载页面左侧有下载链接) 2 ...
- HTML学习-01
1.标签描述了基本的链接地址/链接目标,该标签作为HTML文档中所有的链接标签的默认链接. 2.如果<head>里面设置了base,那么后面的img图片需要添加的相对路径. 3.不能使用工 ...
- 【Web开发】一、页面布局
一.Frame <frameset id="topFrameSet" rows="69,*" border="0" framespac ...
- 递归demo
递归算法就是直接或间接调用自己的算法 public static void main(String[] args) { int m = sum(9); System.out.println(m); } ...