当前位置:首页 > 科技  > 软件

图形编辑器开发:一些会用到的简单几何算法

来源: 责编: 时间:2023-08-09 23:03:01 222观看
导读大家好,我是前端西瓜哥。开发图形编辑器,你会经常要解决一些算法问题。本文盘点一些我开发图形编辑器时常用到的简单几何算法。矩形碰撞检测判断两个矩形是否发生碰撞(或者说相交),即两个矩形有重合的区域。常见使用场景:使

8SE28资讯网——每日最新资讯28at.com

大家好,我是前端西瓜哥。8SE28资讯网——每日最新资讯28at.com

开发图形编辑器,你会经常要解决一些算法问题。本文盘点一些我开发图形编辑器时常用到的简单几何算法。8SE28资讯网——每日最新资讯28at.com

矩形碰撞检测

判断两个矩形是否发生碰撞(或者说相交),即两个矩形有重合的区域。8SE28资讯网——每日最新资讯28at.com

8SE28资讯网——每日最新资讯28at.com

常见使用场景:8SE28资讯网——每日最新资讯28at.com

使用选择工具框选图形(框选策略除了相交,还可以用相交或其他方案)。8SE28资讯网——每日最新资讯28at.com

遍历图形,通过判断视口矩形和图形包围盒的矩形碰撞,剔除掉视口外的图形渲染操作,提高性能。8SE28资讯网——每日最新资讯28at.com

export function isRectIntersect2(rect1: IBox2, rect2: IBox2) {  return (    rect1.minX <= rect2.maxX &&    rect1.maxX >= rect2.minX &&    rect1.minY <= rect2.maxY &&    rect1.maxY >= rect2.minY  );}

关于 IBox2 为包围盒的接口签名:8SE28资讯网——每日最新资讯28at.com

interface IBox2 {  minX: number;  minY: number;  maxX: number;  maxY: number;}

8SE28资讯网——每日最新资讯28at.com

矩形包含检测

该算法用于判断矩形 1 是否包含矩形 2。8SE28资讯网——每日最新资讯28at.com

8SE28资讯网——每日最新资讯28at.com

常见使用场景:8SE28资讯网——每日最新资讯28at.com

使用选择工具框选图形(这次用的是包含策略);8SE28资讯网——每日最新资讯28at.com

function isRectContain2(rect1: IBox2, rect2: IBox2) {  return (    rect1.minX <= rect2.minX &&    rect1.minY <= rect2.minY &&    rect1.maxX >= rect2.maxX &&    rect1.maxY >= rect2.maxY  );}

计算旋转后坐标

对图形旋转,是一个非常基础的功能。计算旋转后的点是很常见的需求。8SE28资讯网——每日最新资讯28at.com

8SE28资讯网——每日最新资讯28at.com

常见使用场景:8SE28资讯网——每日最新资讯28at.com

  • 计算包围盒旋转后的坐标,绘制缩放控制点。
  • 计算光标位置是否落在一个旋转的矩形上,因为旋转的矩形并不是一个正交的矩形,计算出来后判断有点复杂。所以通常我们会将光标给予矩形的中点反过来旋转一下,然后判断点是否在矩形中。

用到三角函数算法。8SE28资讯网——每日最新资讯28at.com

const transformRotate = (  x: number,  y: number,  radian: number,  cx: number,  cy: number,) => {  if (!radian) {    return { x, y };  }  const cos = Math.cos(radian);  const sin = Math.sin(radian);  return {    x: (x - cx) * cos - (y - cy) * sin + cx,    y: (x - cx) * sin + (y - cy) * cos + cy,  };}

点是否在矩形中

8SE28资讯网——每日最新资讯28at.com

常见使用场景:8SE28资讯网——每日最新资讯28at.com

用于实现图形拾取,判断矩形图形或包围盒是否在光标位置上。8SE28资讯网——每日最新资讯28at.com

function isPointInRect(point: IPoint, rect: IRect) {  return (    point.x >= rect.x &&    point.y >= rect.y &&    point.x <= rect.x + rect.width &&    point.y <= rect.y + rect.height  );}

多个矩形组成的大矩形

选中多个矩形时,要计算它们组成的大矩形,然后绘制出大选中框。8SE28资讯网——每日最新资讯28at.com

8SE28资讯网——每日最新资讯28at.com

function getRectsBBox(...rects: IRect[]): IBox {  if (rects.length === 0) {    throw new Error('the count of rect can not be 0');  }  const minX = Math.min(...rects.map((rect) => rect.x));  const minY = Math.min(...rects.map((rect) => rect.y));  const maxX = Math.max(...rects.map((rect) => rect.x + rect.width));  const maxY = Math.max(...rects.map((rect) => rect.y + rect.height));  return {    x: minX,    y: minY,    width: maxX - minX,    height: maxY - minY,  };}

这里用的是另一种包围盒子的表达,所以多了一层转换。8SE28资讯网——每日最新资讯28at.com

interface IRect = {  x: number;  y: number;  width: number;  height: number;}type IBox = IRect

计算向量夹角

通过旋转控制点旋转图形时,需要通过向量的点积公式来计算移动的夹角,去更新图形的旋转角度。8SE28资讯网——每日最新资讯28at.com

8SE28资讯网——每日最新资讯28at.com

计算 [x - cx, y - cy] 和 [0, -1] 两个向量夹角的算法实现:8SE28资讯网——每日最新资讯28at.com

/** * 求向量到右侧轴(x正半轴)的夹角 * 范围在 [0, Math.PI * 2) */export function calcVectorRadian(cx: number, cy: number, x: number, y: number) {  const a = [x - cx, y - cy];  const b = [0, -1];  const dotProduct = a[0] * b[0] + a[1] * b[1];  const d =    Math.sqrt(a[0] * a[0] + a[1] * a[1]) * Math.sqrt(b[0] * b[0] + b[1] * b[1]);  let radian = Math.acos(dotProduct / d);  if (x < cx) {    radian = Math.PI * 2 - radian;  }  return radian;}

结尾

做图形编辑器,经常要和几何算法打交道,各种相交判断、居中计算、光标缩放、找最近的参照线等等。8SE28资讯网——每日最新资讯28at.com

这对算法能力有一定要求的,建议多去刷刷 leetcode。此外就是多画图分析。8SE28资讯网——每日最新资讯28at.com

在开发中,我们还要自己去分析需求,结合图形编辑器的具体实现,抽离出算法问题,并配合合适的数据结构,去解题。解法可能一次不是最优解, 但我们可以慢慢迭代,慢慢优化的。8SE28资讯网——每日最新资讯28at.com

虽然有点耗脑细胞,但最后把难题解决,还是非常有成就感。8SE28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-5160-0.html图形编辑器开发:一些会用到的简单几何算法

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: VasDolly服务端打渠道包教程

下一篇: Python Web开发的必备技能,你掌握了吗?

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • 对标苹果的灵动岛 华为带来实况窗功能

    对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • Rust中的高吞吐量流处理

    Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • K8S | Service服务发现

    K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 一个注解实现接口幂等,这样才优雅!

    一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 2023年,我眼中的字节跳动

    2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的&ldquo;头腾
  • Temu起诉SHEIN,跨境电商战事升级

    Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein&ldquo;利用市场支配力量强迫服装厂商与之签订独家
  • “又被陈思诚骗了”

    “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    据 DIGITIMES 消息,英伟达 AI GPU 出货逐季飙升,接下来 AMD MI 300 系列将在第 4 季底量产。而半导体业内人士表示,近日传出 AMD 的 AI 芯片将转单给
Top