图形编辑器:对齐功能的实现
大家好,我是前端西瓜哥。这次来简单说说实现图形编辑器对齐功能的思路。
对齐功能
实现图形编辑器的对齐功能。
编辑器 github 地址:
github.com/F-star/suik…
线上体验:
blog.fstars.wang/app/suika/
原理不复杂。
首先要指定多个图形,不能只有一个。因为一个的话是没有参照物的,只能自己参照自己,位移距离为 0。
先求出每个图形的 AABB 包围盒。
AABB(axis-aligned bounding box)指的是 轴对齐包围盒。指的是包围图形的矩形,但 4 条边平行于坐标轴。
如下图,最外层的就是 AABB 包围盒。
里面带有旋转角度的是 OBB 包围盒子,oriented bounding box (OBB)。优点是能更紧密的包裹图形,但带了旋转,在判断碰撞时要额外进行处理。
AABB 我用下面结构表示:
interface?IBox2?{??minX:?number;
??minY:?number;
??maxX:?number;
??maxY:?number;
}
计算好全部 AABB 包围盒后,再计算这些包围盒共同组成的大包围盒,我暂且称其为 mixedBBox。这个大包围盒会作为对齐的参照。
左对齐
首先是 左对齐。
其实就是让所有图形的 AABB 包围盒的左边和 mixedBBox 的左侧对齐。
for?(let?i?=?0;?i?<?elements.length;?i++)?{
??const?el?=?elements[i];
??const?dx?=?mixedBBox.minX?-?bBoxes[i].minX;
??el.x?+=?dx;
}
水平对齐(左右对齐)
水平对齐,指的是将多个图形的 x 坐标往中间靠拢。
让所有图形的包围盒的中心的垂直中线和 mixedBBox 的中心垂直中线对齐。
const?centerX?=?mixedBBox.minX?/?2?+?mixedBBox.maxX?/?2;
for?(let?i?=?0;?i?<?elements.length;?i++)?{
??const?el?=?elements[i];
??const?dx?=?centerX?-?(bBoxes[i].minX?/?2?+?bBoxes[i].maxX?/?2);
??el.x?+=?dx;
}
右对齐
所有图形的包围盒和 mixedBBox 右侧对齐:
for?(let?i?=?0;?i?<?elements.length;?i++)?{
??const?el?=?elements[i];
??const?dx?=?mixedBBox.maxX?-?bBoxes[i].maxX;
??el.x?+=?dx;
}
顶对齐
for?(let?i?=?0;?i?<?elements.length;?i++)?{
??const?el?=?elements[i];
??const?dy?=?mixedBBox.minY?-?bBoxes[i].minY;
??el.y?+=?dy;
}
垂直对齐(上下对齐)
for?(let?i?=?0;?i?<?elements.length;?i++)?{
??const?el?=?elements[i];
??dy?=?centerY?-?(bBoxes[i].minY?/?2?+?bBoxes[i].maxY?/?2);
??el.y?+=?dy;
}
底对齐
for?(let?i?=?0;?i?<?elements.length;?i++)?{
??const?el?=?elements[i];
??const?dy?=?mixedBBox.maxY?-?bBoxes[i].maxY;
??el.y?+=?dy;
}
结尾
另外,如果图形编辑器还有一个舞台,也可以选中单个图形,让这个图形让舞台的盒作为 mixedBBox 进行对齐。
开发一款图形工具,会遇到很多有趣的简单几何算法小知识,解决后挺有成就感的。
我是前端西瓜哥,欢迎关注我,学习更多前端图形知识。
图形编辑器:对齐功能的实现相关推荐
- 图形编辑器:标尺功能的实现
大家好,我是前端西瓜哥.今天我们来实现图形编辑器的标尺功能. 项目地址: https://github.com/F-star/suika 线上体验: https://blog.fstars.wang/ ...
- GPS数据矢量化JAVA_SVGX矢量化图形编辑器,100%JAVA实现的矢量化图形编辑器
SVGX矢量化图形编辑器,100%JAVA实现的矢量化图形编辑器 SVGX矢量化图形编辑器是面向工程应用的矢量图形制作软件,基于著名的Eclipse GEF图形编辑框架实现了W3C SVG 1.1规范 ...
- canvas图形编辑器
原文地址:http://jeffzhong.space/2017/11/02/drawboard/ 使用canvas进行开发项目,我们离不开各种线段,曲线,图形,但每次都必须用代码一步一步去实 ...
- Grafana 仪表盘和图形编辑器
Grafana 是一个跨平台.开源的数据可视化网络应用程序平台.用户配置连接的数据源之后,Grafana 可以在浏览器显示数据图表和警告.该软件的企业版本提供更多的扩展功能.扩展功能通过插件的形式提供 ...
- 图形编辑器——Graph Editor(树图必备)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 使用步骤 前言 图形编辑器--Graph Editor 可以用用来生成树,且可以标记边的权重 告别word.visio ...
- R语言图形编辑器GUI开发环境RStudio安装(Windows操作系统下、RStudio开发环境安装)
R语言图形编辑器GUI开发环境RStudio安装(Windows操作系统下.RStudio开发环境安装) RStudio是R语言的集成开发环境(IDE),它是一个独立的开源项目,它将许多功能强大的编程 ...
- unity2d游戏开发系列教程:二、新建工程并熟悉Unity编辑器常用功能
目录 unity2d游戏开发系列教程:一.环境安装 第一步.打开项目 耐心等待一小会 工程界面 第二步.创建第一个场景(第一关)进行试玩 点击图中标号1的运行按钮,即可简单试玩感受,操作如下 移动A, ...
- 图形编辑器:工具管理和切换
大家好,我是前端西瓜哥.今天我们看看对于一款图形编辑器,应该怎么去实现工具,比如绘制矩形.选中工具,以及如何去管理它们的. 项目地址,欢迎 star: https://github.com/F-sta ...
- 对齐就是这么简单!!!(PowerPoint2010对齐功能)
以前,帮老师们作些课件,有一件很头痛的事,就是一个幻灯片页上有几个对象, 比如:自选图形.文本框.艺术字等等,尤其是几个自选图形要组合起来时, 对齐是一个比较难的事. 虽然,PowerPoint一直提 ...
最新文章
- alpine运行程序提示not found
- MATLAB常用命令(窗口命令、标点符号特殊功能和帮助命令)
- linux vi/vim使用
- .NET Core + Spring Cloud:API 网关
- python打飞机源码_python 飞机大战 游戏源码(pygame入门级)
- (15)css常用样式—background背景属性
- activity 、window与view的关系 (上)
- Spring Cloud F Spring Boot 2.0 版本升级说明书
- Target-Action回调模式
- 关键路径c语言,有向图的关键路径的C程序实现代码
- 电工电子技术基础----multisim7使用及实验过程
- 很少人用的下载者方法
- 解决HP ProLiant DL380 G5的安装与启动CentOS7时不能识别raid硬盘问题
- [C++]_ELVE_Windows下QT5.12连接MySql8.0解决方案
- [树状数组] 洛谷P3374
- 【已解决】机械革命s1-01触控手势失效解决方案
- css有哪些动画效果怎么实现的
- Adobe Reader PDF阅读器闪退问题解决(批处理)
- 广点通sdk接入(作为广告主身份)
- 图像处理实验4:图像去噪