大家好,我是前端西瓜哥。这次来简单说说实现图形编辑器对齐功能的思路。

对齐功能

实现图形编辑器的对齐功能。

编辑器 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 进行对齐。

开发一款图形工具,会遇到很多有趣的简单几何算法小知识,解决后挺有成就感的。

我是前端西瓜哥,欢迎关注我,学习更多前端图形知识。

图形编辑器:对齐功能的实现相关推荐

  1. 图形编辑器:标尺功能的实现

    大家好,我是前端西瓜哥.今天我们来实现图形编辑器的标尺功能. 项目地址: https://github.com/F-star/suika 线上体验: https://blog.fstars.wang/ ...

  2. GPS数据矢量化JAVA_SVGX矢量化图形编辑器,100%JAVA实现的矢量化图形编辑器

    SVGX矢量化图形编辑器,100%JAVA实现的矢量化图形编辑器 SVGX矢量化图形编辑器是面向工程应用的矢量图形制作软件,基于著名的Eclipse GEF图形编辑框架实现了W3C SVG 1.1规范 ...

  3. canvas图形编辑器

      原文地址:http://jeffzhong.space/2017/11/02/drawboard/   使用canvas进行开发项目,我们离不开各种线段,曲线,图形,但每次都必须用代码一步一步去实 ...

  4. Grafana 仪表盘和图形编辑器

    Grafana 是一个跨平台.开源的数据可视化网络应用程序平台.用户配置连接的数据源之后,Grafana 可以在浏览器显示数据图表和警告.该软件的企业版本提供更多的扩展功能.扩展功能通过插件的形式提供 ...

  5. 图形编辑器——Graph Editor(树图必备)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 使用步骤 前言 图形编辑器--Graph Editor 可以用用来生成树,且可以标记边的权重 告别word.visio ...

  6. R语言图形编辑器GUI开发环境RStudio安装(Windows操作系统下、RStudio开发环境安装)

    R语言图形编辑器GUI开发环境RStudio安装(Windows操作系统下.RStudio开发环境安装) RStudio是R语言的集成开发环境(IDE),它是一个独立的开源项目,它将许多功能强大的编程 ...

  7. unity2d游戏开发系列教程:二、新建工程并熟悉Unity编辑器常用功能

    目录 unity2d游戏开发系列教程:一.环境安装 第一步.打开项目 耐心等待一小会 工程界面 第二步.创建第一个场景(第一关)进行试玩 点击图中标号1的运行按钮,即可简单试玩感受,操作如下 移动A, ...

  8. 图形编辑器:工具管理和切换

    大家好,我是前端西瓜哥.今天我们看看对于一款图形编辑器,应该怎么去实现工具,比如绘制矩形.选中工具,以及如何去管理它们的. 项目地址,欢迎 star: https://github.com/F-sta ...

  9. 对齐就是这么简单!!!(PowerPoint2010对齐功能)

    以前,帮老师们作些课件,有一件很头痛的事,就是一个幻灯片页上有几个对象, 比如:自选图形.文本框.艺术字等等,尤其是几个自选图形要组合起来时, 对齐是一个比较难的事. 虽然,PowerPoint一直提 ...

最新文章

  1. alpine运行程序提示not found
  2. MATLAB常用命令(窗口命令、标点符号特殊功能和帮助命令)
  3. linux vi/vim使用
  4. .NET Core + Spring Cloud:API 网关
  5. python打飞机源码_python 飞机大战 游戏源码(pygame入门级)
  6. (15)css常用样式—background背景属性
  7. activity 、window与view的关系 (上)
  8. Spring Cloud F Spring Boot 2.0 版本升级说明书
  9. Target-Action回调模式
  10. 关键路径c语言,有向图的关键路径的C程序实现代码
  11. 电工电子技术基础----multisim7使用及实验过程
  12. 很少人用的下载者方法
  13. 解决HP ProLiant DL380 G5的安装与启动CentOS7时不能识别raid硬盘问题
  14. [C++]_ELVE_Windows下QT5.12连接MySql8.0解决方案
  15. [树状数组] 洛谷P3374
  16. 【已解决】机械革命s1-01触控手势失效解决方案
  17. css有哪些动画效果怎么实现的
  18. Adobe Reader PDF阅读器闪退问题解决(批处理)
  19. 广点通sdk接入(作为广告主身份)
  20. 图像处理实验4:图像去噪

热门文章

  1. 分布电容和杂散电容_杂散电容概述
  2. Linus Torvalds 在 22 号宣布Linux 5.18发布
  3. 配置ssh使用socks代理
  4. Springboot项目架构设计
  5. ResNet+cifar10总结-由浅入深
  6. 转『天涯杂谈』那些让人惊艳的歌词(整理版),很经典,与大家分享。
  7. vue3编写组件的几种方式
  8. C语言再学习25——常用字符串函数归纳
  9. Summer Project
  10. jboss简单使用--刚开始接触,感觉还是比较详细的