前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >图形编辑器开发:实现选中图形的水平翻转和垂直翻转

图形编辑器开发:实现选中图形的水平翻转和垂直翻转

作者头像
前端西瓜哥
发布于 2024-07-12 08:28:57
发布于 2024-07-12 08:28:57
18700
代码可运行
举报
运行总次数:0
代码可运行

大家好,我是前端西瓜哥。

今天我们来实现一个比较少用到的功能:对选中图形做水平翻转和垂直翻转

翻转实现分成这么 3 步:

  1. 计算选中图形的中心位置,作为翻转的翻转中心;
  2. 得到翻转矩阵;
  3. 给所有的图形应用翻转矩阵。

选中图形的中心

选中图形如果是单个,我们 选择图形的 OBB (带朝向的包围盒)的中点位置作为翻转中心

以矩形为例,就是计算给矩形的 [width/ 2, height / 2] 应用变形矩阵后的位置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
getCenter(): IPoint {
  const tf = new Matrix(...this.attrs.transform);
  return tf.apply({
    x: this.attrs.width / 2,
    y: this.attrs.height / 2,
  });
}

这里用 width / height / transform 表达矩形的位置、大小、旋转、翻转等物理信息。

选中图形如果是多个,就计算每个图形的 AABB 包围盒(包围图形的最小矩形),然后将它们合并成一个大包围盒,取这个大包围盒的中心作为翻转中心

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const mergedBox = mergeBoxes(graphicsArr.map((item) => item.getBbox()));
// 翻转中心
const flipCenter = {
  x: box.minX / 2 + box.maxX / 2,
  y: box.minY / 2 + box.maxY / 2,
};

得到翻转矩阵

我们以水平翻转切入。

假设我们 基于 y 轴做水平翻转,本质就是 将图形的点的 x 值取反

一个点原来在右边(x > 0),水平翻转一下,跑到右边去了(x < 0)。同理,一个点原来在左边,水平翻转一下,跑到左边去了。

也就是说,等价于 x 乘以 -1,其他保持不变。这个操作对应的矩阵是缩放矩阵 Scale(-1, 1)

回到我们的对选中图形水平翻转。我们不是基于 y 轴做翻转,是对选中图形的中心做翻转。

所以我们需要先把图形移动到原点 Translate(-cx, -cy),然后再做翻转 Scale(-1, 1),最后再移动回来 Translate(cx, cy)

记住在原矩阵应用新的矩阵是要左乘的,不是右乘。图形需要应用的矩阵是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Translate(cx, cy) * Scale(-1, 1) * Translate(-cx, -cy)

用 pixi.js 的 Matrix 类的话,就是这样写。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const flipMatrix = new Matrix()
  .translate(-flipCenter.x, -flipCenter.y) // 先左乘 “移动到原点” 的矩阵
  .scale(-1, 1) // 再缩放
  .translate(flipCenter.x, flipCenter.y); // 最后移动回来

也可以使用其他矩阵库,用法类似。

应用矩阵

最后给选中的每个图形 应用这个翻转矩阵(记住是左乘这个矩阵)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (const graphics of graphicsArr) {
  graphics.attrs.transform = flipMatrix.append(graphics.attrs.transform)}

至此,翻转就完成了。

就是如此简单。

拓展延伸

虽然这里只是讲如何翻转,但我想优秀的读者可能已经察觉到了,开始举一反三了。

这次做的是翻转需求,如果下次需求是要做个旋转,其实也是一个道理,将中间的缩放矩阵换成缩放矩阵就行了。

或者更复杂一些,基于某条线做镜像对称,其实也就是在原来缩放的基础上再补上一个旋转。

这就是引入矩阵这一数学工具的含金量。

你说我不用矩阵,用解析几何的做法也能解。的确可以,但这种方式难度高也容易写错,写久了自己回过头来发现自己也看不懂了,也实属正常,没有可持续性。

以前我是用几何算法去实现的,那可太痛苦了,纸上画来画去,推导一番好像想通了,翻译成代码,发现效果不对,再做调试,最后还是要重新看推导过程是不是哪来不对,反复几遍才做完。

当然,使用矩阵实现需求是有个前提的,就是图形要用矩阵来表达。

或者可以不用矩阵表达,但是可以转换成矩阵的表示,且能在做完矩阵变换后转换回来。

但通常来说非矩阵表达转换为矩阵,转换结果只是矩阵的子集,也就是说有些矩阵是无法转换回原表达,会丢失一些信息,这点要注意

此外就是对矩阵有一点点认识,不然不会用,看着干瞪眼,不过网上很多资料,对读者来说应该问题不大。

结尾

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端西瓜哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《dig挖出DNS的秘密》-linux命令五分钟系列之三十四
【初次见面】 我相信使用nslookup的同学一定比使用dig的同学多,所以还是有必要花些时间给大家介绍一下dig的。 dig,和nslookup作用有些类似,都是DNS查询工具。 dig,其实是一个缩写,即Domain Information Groper。 一些专业的DNS管理员在追查DNS问题时,都乐于使用dig命令,是看中了dig设置灵活、输出清晰、功能强大的特点。 【最简单的dig用法】 最简单的dig用法,当然就是直接输入dig按回车。 $ dig ; <<>> DiG 9.8.2rc1-Re
小小科
2018/05/03
1.8K0
Linux运维部署DNS主从同步
作为重要的互联网基础设施服务,保证DNS域名解析服务的正常运转至关重要,只有这样才能提供稳定、快速且不间断的域名查询服务。在DNS域名解析服务中,从服务器可以从主服务器上获取指定的区域数据文件,从而起到备份解析记录与负载均衡的作用,因此通过部署从服务器可以减轻主服务器的负载压力,还可以提升用户的查询效率。
王先森sec
2023/04/24
2K0
DNS原理和CentOS7上bind域名服务器配置详解
1、什么是DNS? ( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。DNS就是这样的一位“翻译官”,它的基本工作原理可用下图来表示。
kirin
2020/09/07
3.4K0
DNS原理和CentOS7上bind域名服务器配置详解
CentOS7上使用bind9搭建DNS主从服务器
   Linux中通常使用bind来实现DNS服务器的架设,bind软件由isc(https://www.isc.org/downloads/bind/)维护。在yum仓库中可以找到软件,配置好yum源,直接使用命令yum install bind就可以安装。当前bind的稳定版本为bind9,bind的服务名称为named,监听的端口为53号端口。bind的主要配置文件为/etc/named.conf,此文件主要用于配置区域,并指定区域数据库文件名称。区域数据库文件通常保存于/var/named/目录下,用于定义区域的资源类型。
三杯水Plus
2018/11/14
4.8K0
DNS主从、委派及转发实现
本实例,我们将通过多种DNS技术的交错,说明如何搭建DNS主从服务器、DNS转发及子域授权的相关知识。
用户1456517
2019/03/05
3.3K0
DNS主从、委派及转发实现
Linux下搭建主从DNS服务器并实现智能解析
组织域:.com, .net, .org, .gov, .edu, .mil 国家域:.iq, .tw, .hk, .jp, .cn, ...
星哥玩云
2022/07/25
13.9K0
Linux下搭建主从DNS服务器并实现智能解析
Centos7搭建DNS服务
DNS(bind)的主配置文件是 etc/named.conf/ ,进入配置
小手冰凉
2019/09/10
1.8K0
Centos7搭建DNS服务
bind杂记(3)
[root@www named]# dig -t NS ops.zz.com @10.201.106.129 +norecurse
py3study
2020/01/10
3.3K0
Ubuntu下DNS服务搭建
DNS(domain name system 域名系统):基于C/S模式的域名解析服务,监听在53/udp,53/tcp端口,其中tcp用来区域传送,udp用来解析,其实是一个数据库,用于TCP/IP程序的分布式数据库,同时也是一种重要的网络协议,DNS储存了网络中的IP地址与对应主机的信息,邮件路由信息,还有其他网络应用方面的信息,它所提供的服务是用来将主机名和域名转换为IP,就像一个翻译官
dogfei
2020/07/31
2.4K0
DNS:使用 Bind 9 配置权威 DNS 服务器
我承认爱情是空幻的,只有情感才是真实的,是情感在促使我们去追求,使我们产生爱情的真正的美 ----卢梭《爱弥儿》
山河已无恙
2023/08/21
3.2K0
DNS:使用 Bind 9 配置权威 DNS 服务器
Linux下DNS简单部署(主从域名服务器)
一、DNS简介 DNS(Domain Name System),域名系统,因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。DNS服务器的作用就是就好比生活中的电话簿、114查号台一样,为各种网络程序找到对应目标主机的IP地址或对应的主机域名。 二、DNS功能 每个IP地址都可以有一个主机名,主机名由一个或多
洗尽了浮华
2018/01/23
7.6K1
DNS主从同步及正反向区域解析
环境说明: 主DNS:Centos 6.9, IP:192.168.1.19 从DNS:Centos 7.3, IP:192.168.1.20 开始前的准备工作 关闭防火墙和SELinxu [root@Centos6 ~]# chkconfig iptables off #对于Centos 6 [root@centos7 ~]# systemctl disable firewalld #对于Centos 7 [root@Centos6 ~]# sed -i.bak 's@SELINUX=enforcin
用户1456517
2019/03/05
8.4K0
【在Linux世界中追寻伟大的One Piece】DNS与ICMP
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序。但是IP地址不方便记忆。
枫叶丹
2024/10/10
1250
【在Linux世界中追寻伟大的One Piece】DNS与ICMP
全面理解DNS及HTTPDNS
移动场景下DNS解析开销是整个网络请求中不可忽略的一部分。在弱网环境下,基于UDP的LocalDNS解析非常容易出现解析超时的问题,并且即使解析成功会消耗数百毫秒乃至更甚,对我们整个业务请求而言是非常不利的,它直接影响了客户的体验。
架构之家
2022/07/12
2.9K0
全面理解DNS及HTTPDNS
是的,我写的开源项目被曝出了高危漏洞。。
前几天看到了一个开源项目中的远程执行漏洞,开发者通过 HTTP 接口暴露了一个参数,接收参数之后,代码中将该参数拼接了一个命令,然后把这个命令使用 Python 中的 Popen 执行了,然后把对应的输出结果返回到了 HTTP Response 中。
崔庆才
2022/01/05
7780
Linux 命令(197)—— dig 命令
dig 是一个灵活的 DNS 查询工具,它会打印出 DNS 域名服务器的回应,主要用来从 DNS 域名服务器查询主机地址信息。
恋喵大鲤鱼
2022/11/05
4.3K0
通过Dig来学DNS
DNS是网络里面很常用的服务,有一整套的设计 策略和方法,算是很成熟的技术了。作者本人最近刚好用到了DNS,便顺便整理的了笔记,希望对大家有些帮助。本文笔者主要想通过dig工具来讲解下DNS是怎么一回事。
灰子学技术
2023/10/30
3490
通过Dig来学DNS
DNS 域名解析服务配置(建议收藏的教程)
DNS(Domain Name System,域名系统),因特网上作为域名和 IP 地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。
杰哥的IT之旅
2021/09/27
27.5K0
Linux下搭建DNS 服务器
         bind-utils # 工具,包含dig,nslookup等网络诊断工具。
保持热爱奔赴山海
2019/09/18
7.2K0
Linux下搭建DNS 服务器
DNS安装与设置(3)
    DNS版本:version: 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6
py3study
2020/01/13
3.3K0
相关推荐
《dig挖出DNS的秘密》-linux命令五分钟系列之三十四
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验