精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

圖形編輯器開發:一些會用到的簡單幾何算法

開發 后端
開發圖形編輯器,你會經常要解決一些算法問題。本文盤點一些我開發圖形編輯器時常用到的簡單幾何算法。

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

開發圖形編輯器,你會經常要解決一些算法問題。本文盤點一些我開發圖形編輯器時常用到的簡單幾何算法。

矩形碰撞檢測

判斷兩個矩形是否發生碰撞(或者說相交),即兩個矩形有重合的區域。

常見使用場景:

使用選擇工具框選圖形(框選策略除了相交,還可以用相交或其他方案)。

遍歷圖形,通過判斷視口矩形和圖形包圍盒的矩形碰撞,剔除掉視口外的圖形渲染操作,提高性能。

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 為包圍盒的接口簽名:

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

矩形包含檢測

該算法用于判斷矩形 1 是否包含矩形 2。

常見使用場景:

使用選擇工具框選圖形(這次用的是包含策略);

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

計算旋轉后坐標

對圖形旋轉,是一個非常基礎的功能。計算旋轉后的點是很常見的需求。

常見使用場景:

  • 計算包圍盒旋轉后的坐標,繪制縮放控制點。
  • 計算光標位置是否落在一個旋轉的矩形上,因為旋轉的矩形并不是一個正交的矩形,計算出來后判斷有點復雜。所以通常我們會將光標給予矩形的中點反過來旋轉一下,然后判斷點是否在矩形中。

用到三角函數算法。

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,
  };
}

點是否在矩形中

常見使用場景:

用于實現圖形拾取,判斷矩形圖形或包圍盒是否在光標位置上。

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
  );
}

多個矩形組成的大矩形

選中多個矩形時,要計算它們組成的大矩形,然后繪制出大選中框。

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,
  };
}

這里用的是另一種包圍盒子的表達,所以多了一層轉換。

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

type IBox = IRect

計算向量夾角

通過旋轉控制點旋轉圖形時,需要通過向量的點積公式來計算移動的夾角,去更新圖形的旋轉角度。

計算 [x - cx, y - cy] 和 [0, -1] 兩個向量夾角的算法實現:

/**
 * 求向量到右側軸(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;
}

結尾

做圖形編輯器,經常要和幾何算法打交道,各種相交判斷、居中計算、光標縮放、找最近的參照線等等。

這對算法能力有一定要求的,建議多去刷刷 leetcode。此外就是多畫圖分析。

在開發中,我們還要自己去分析需求,結合圖形編輯器的具體實現,抽離出算法問題,并配合合適的數據結構,去解題。解法可能一次不是最優解, 但我們可以慢慢迭代,慢慢優化的。

雖然有點耗腦細胞,但最后把難題解決,還是非常有成就感。

責任編輯:姜華 來源: 前端西瓜哥
相關推薦

2022-08-28 23:51:04

編輯器vim代碼

2023-10-19 10:12:34

圖形編輯器開發縮放圖形

2023-09-26 07:39:21

2009-12-02 16:02:58

VS2010編輯器

2023-09-07 08:24:35

圖形編輯器開發繪制圖形工具

2023-08-31 11:32:57

圖形編輯器contain

2023-10-08 08:11:40

圖形編輯器快捷鍵操作

2024-01-08 08:30:05

光標圖形編輯器開發游標

2023-09-11 09:02:31

圖形編輯器模塊間的通信

2023-04-07 08:02:30

圖形編輯器對齊功能

2023-01-18 08:30:40

圖形編輯器元素

2023-02-01 09:21:59

圖形編輯器標尺

2023-10-10 16:04:30

圖形編輯器格式轉換

2023-08-28 08:10:50

Hex圖形編輯器

2018-06-29 10:52:07

PythonIDE編輯器

2023-06-12 08:22:56

圖形編輯器工具

2023-07-07 13:56:01

圖形編輯器畫布縮放

2024-01-03 08:43:17

圖形編輯器旋轉控制點縮放控制點

2023-04-10 08:45:44

圖形編輯器排列移動功能

2023-07-31 08:46:07

圖形編輯器圖形自動對齊
點贊
收藏

51CTO技術棧公眾號

一区二区日本视频| 日韩av不卡一区| 亚洲一区中文在线| 久久影院理伦片| 中文字幕视频在线播放| 综合精品一区| 亚洲乱码av中文一区二区| 天天色综合社区| 97久久人人超碰caoprom| 国产欧美日本一区视频| 91成人伦理在线电影| 99久久精品国产亚洲| 久久精品久久久| 国产手机视频精品| 日本一区二区三区在线免费观看| 国产精品高颜值在线观看| 国产精品国产精品国产专区不片| 国产青春久久久国产毛片| 中文字幕你懂的| 99伊人成综合| 欧美激情视频三区| 国产三级av在线播放| 一本一道久久a久久| 欧美性受极品xxxx喷水| 国产特级淫片高清视频| aa在线视频| 日本一区二区三区四区在线视频 | 波多野结衣家庭主妇| 欧美精品1区| 久久精品国产69国产精品亚洲| 西西大胆午夜视频| 久久天堂久久| 欧美精品在线观看播放| 午夜在线观看av| 校园春色亚洲| 黄色精品一区二区| 妞干网视频在线观看| 国产中文字幕在线视频| 97超碰欧美中文字幕| 7777精品久久久大香线蕉小说| 久久久999久久久| 亚欧美中日韩视频| 97在线免费观看视频| 国产无遮挡aaa片爽爽| 国产精品porn| 色综合久综合久久综合久鬼88 | 日本77777| 午夜无码国产理论在线| 日韩欧美成人区| 蜜臀av色欲a片无码精品一区 | 91wwwcom在线观看| 日本三级中文字幕| 国产精品v亚洲精品v日韩精品| 久久九九亚洲综合| 国产高清视频免费在线观看| 日韩国产专区| www.亚洲天堂| 999精品在线视频| 香蕉精品视频在线观看| 欧美精品一二区| 欧美交换国产一区内射| 国产在线不卡| 91av在线不卡| 日本一本在线观看| 蜜臀av一区二区三区| 国产精品伦子伦免费视频| 中文字幕第2页| 麻豆精品蜜桃视频网站| 91免费电影网站| 精品国产伦一区二区三区| 国产成人精品网址| 黄色99视频| 视频污在线观看| 久久天天做天天爱综合色| 日韩欧美精品一区二区| 日本三级在线视频| 一区二区三区四区精品在线视频 | 欧美一级高清片| 高清中文字幕mv的电影| 日韩高清一级| 色哟哟入口国产精品| 91日韩中文字幕| 日韩一区二区免费看| 国产99久久精品一区二区永久免费| 99re热视频| 国产一区二区电影| 久久精品国产综合精品| 欧洲不卡av| 午夜精品视频一区| 国产又大又黄又猛| 大奶一区二区三区| 国产香蕉精品视频一区二区三区| 综合五月激情网| 中文国产一区| 成人免费网站在线| 视频一区二区在线播放| 亚洲欧洲日产国产综合网| av在线播放亚洲| 欧美久久久网站| 日韩电影网在线| 97人妻人人揉人人躁人人| 欧美在线1区| 日韩美女视频免费看| a天堂中文在线观看| 久久嫩草精品久久久久| 亚洲美女搞黄| 蜜臀久久精品| 日韩欧美中文字幕公布| av电影网站在线观看| 黄色综合网站| 91人成网站www| 国产中文字幕在线| 精品久久久久久亚洲精品| av在线免费看片| 国产91一区| 992tv成人免费影院| av 一区二区三区| 日本一二三不卡| 日韩人妻精品无码一区二区三区| 久久99成人| 自拍亚洲一区欧美另类| www.国产一区二区| 高潮精品一区videoshd| 一区在线电影| 91成人在线| 亚洲色图在线观看| 久久一区二区三区视频| 成人午夜激情影院| 日韩专区第三页| 精品国产一区二区三区2021| 日韩中文字幕视频| 中文在线字幕av| 国产日韩欧美电影| 女性隐私黄www网站视频| 国产伦乱精品| 国内精品小视频在线观看| 国产99视频在线| 亚洲视频狠狠干| 日本高清一区二区视频| 日韩久久视频| 国产人妖伪娘一区91| yjizz视频网站在线播放| 91成人在线精品| 久久精品国产亚洲av久| 老司机亚洲精品| 欧美日韩在线观看一区| 在线观看特色大片免费视频| 日韩黄色高清视频| 亚洲第一在线播放| 久久久影视传媒| 国产日韩一区二区在线观看| 蜜桃视频欧美| 国产成人啪精品视频免费网| 国产福利在线视频| 欧美日韩在线播放一区| www.4hu95.com四虎| 麻豆极品一区二区三区| gogogo免费高清日本写真| 亚洲精品66| 欧美成人小视频| 国精品人妻无码一区二区三区喝尿 | 欧美色图片你懂的| 国产三级精品三级观看| 国产在线精品视频| 成年人深夜视频| 美国成人xxx| 国产精品草莓在线免费观看| 亚洲欧美视频一区二区| 91精品在线免费观看| 免费在线观看av网址| 91免费视频观看| 一区二区三区入口| 欧美69视频| 精品视频第一区| 韩国精品主播一区二区在线观看| 在线播放精品一区二区三区| 在线观看免费黄色小视频| 亚洲精品成人精品456| 三级视频网站在线观看| 视频一区中文字幕国产| 手机福利在线视频| 给我免费播放日韩视频| 日韩av免费在线播放| 二区在线播放| 日韩电影视频免费| 97国产精品久久久| 亚洲成人1区2区| 女女互磨互喷水高潮les呻吟| 极品少妇xxxx精品少妇偷拍| 精品丰满人妻无套内射| 色乱码一区二区三区网站| av一区二区三区在线观看| 性欧美18~19sex高清播放| 最近2019中文字幕mv免费看| 成人午夜福利视频| 欧美性三三影院| 久久精品视频8| 国产精品美日韩| 欧美做受高潮中文字幕| 视频一区二区三区中文字幕| 国产在线观看欧美| 欧洲激情视频| 九色一区二区| 欧美经典一区| 国产精品久久久久久中文字| 欧美黑人猛交的在线视频| 在线亚洲男人天堂| 日韩a在线观看| 欧美成人一区二区三区在线观看| 久久精品国产亚洲av麻豆蜜芽| 亚洲激情图片qvod| 五月婷婷婷婷婷| 久久综合久色欧美综合狠狠| 性生交大片免费看l| 蜜臂av日日欢夜夜爽一区| 国产97在线 | 亚洲| 91精品99| 亚洲精品视频一二三| 婷婷精品视频| 风间由美一区二区三区| 国产精品一区三区在线观看| 国产精彩精品视频| 在线手机中文字幕| 久久久久久综合网天天| 亚洲综合影视| 日韩视频一区在线| 999国产在线视频| 亚洲欧洲xxxx| 牛牛热在线视频| 亚洲精品国精品久久99热一| 亚洲精品福利网站| 欧美mv和日韩mv的网站| 国产乱人乱偷精品视频a人人澡| 91福利在线导航| 亚洲色成人www永久网站| 岛国av在线不卡| 黄色片免费观看视频| 亚洲成人www| 黄色小说在线观看视频| 亚洲一二三四久久| 久久网免费视频| 亚洲一区二区在线视频| 毛片a片免费观看| 一区二区三区日韩精品| 欧美另类视频在线观看| 一区二区三区美女| 青青草原免费观看| 一区二区三区四区国产精品| 久久国产免费观看| 亚洲国产中文字幕| 亚洲天堂日韩av| 欧美色播在线播放| 日韩精品一区不卡| 在线一区二区三区做爰视频网站| 天天爱天天做天天爽| 欧美视频一区在线观看| 91tv国产成人福利| 91精品国产黑色紧身裤美女| 国内毛片毛片毛片毛片| 精品99一区二区| 欧美日韩视频精品二区| 一区二区亚洲欧洲国产日韩| 色老头视频在线观看| 欧美老女人xx| 韩日毛片在线观看| 国产精品扒开腿做爽爽爽的视频| 日韩精品一页| www日韩av| 丝袜av一区| 亚洲高清视频在线观看| 亚洲国产精品成人| 日韩精品在线视频免费观看| 国产亚洲毛片| 日日躁夜夜躁aaaabbbb| 国产99一区视频免费| 北岛玲一区二区| 国产精品嫩草影院av蜜臀| 国产盗摄一区二区三区在线| 亚洲国产精品人人做人人爽| 亚洲不卡在线视频| 777欧美精品| 你懂的网站在线| 国产一区二区三区网站| 在线看女人毛片| 日韩av免费在线观看| 久久久精品区| 欧美日韩精品免费看| 91精品国产91久久久久久密臀| 777av视频| 久久精品国产亚洲aⅴ| 成人免费看片载| 国产精品视频在线看| 国产一级特黄a高潮片| 在线观看免费一区| 成人午夜精品福利免费| 中文字幕亚洲字幕| 国产夫妻在线| 91视频国产精品| 久久成人高清| 免费人成在线观看视频播放| 日韩电影免费一区| 亚洲无人区码一码二码三码| 国产精品亲子乱子伦xxxx裸| 日本在线视频免费观看| 欧美日韩一级黄| 日本一本草久在线中文| 久久这里只有精品视频首页| 香蕉视频亚洲一级| 国产欧美综合精品一区二区| 91精品国产自产在线观看永久∴ | 岛国精品一区二区| 日日操免费视频| 狠狠躁18三区二区一区| 性网爆门事件集合av| 色悠悠久久88| 伊伊综合在线| 国产亚洲情侣一区二区无| 亚洲国产精品综合久久久| 少妇激情一区二区三区| 97精品国产露脸对白| 精品深夜av无码一区二区老年| 欧美老女人第四色| 国产高清视频在线| 秋霞成人午夜鲁丝一区二区三区| 88久久精品| 日韩精品第1页| 国内成+人亚洲+欧美+综合在线| 国产传媒国产传媒| 欧美午夜精品在线| 五月婷婷丁香花| 午夜欧美不卡精品aaaaa| 中文字幕日韩在线| 欧美激情亚洲天堂| 国产一区不卡精品| 性欧美疯狂猛交69hd| 欧美日韩性生活| 91porn在线观看| 亚洲欧洲日本mm| 自拍视频一区二区三区| 视频在线观看91| a天堂中文字幕| 色菇凉天天综合网| 国产在线视频资源| 国产福利视频一区二区| 精品久久影视| 婷婷丁香激情网| 中文字幕一区二区三区四区不卡| 中文字幕一区2区3区| 日韩中文字幕国产精品| 亚洲国产综合在线观看| 欧美一级黄色录像片| 国产九九视频一区二区三区| 中文字幕五月天| 亚洲精品一区在线观看| gogo高清午夜人体在线| 精品国产一区二区三区麻豆免费观看完整版 | 日本大胆人体视频| 国产成人精品免费视频网站| 久久免费公开视频| 亚洲黄色在线观看| 成人软件在线观看| 先锋影音一区二区三区| 久久se精品一区精品二区| 青青草原在线免费观看| 亚洲第一天堂无码专区| 香蕉久久免费电影| 成年人免费观看的视频| 国产风韵犹存在线视精品| 日本老熟俱乐部h0930| 亚洲国产精品网站| 日本肉肉一区| 麻豆视频传媒入口| 成人av电影在线| 日本熟妇一区二区| 亚洲第一偷拍网| 久久av日韩| 2022中文字幕| 久久久久久免费网| 国产精品一区二区人人爽| 91精品国产99| 日韩av在线播放网址| 亚洲熟女一区二区三区| 色一区在线观看| 麻豆影院在线| 久久精品国产精品国产精品污| 免费亚洲电影在线| 国产无遮挡裸体免费视频| 在线电影中文日韩| 亚洲一区电影| 在线观看的毛片| 亚洲电影中文字幕在线观看| 国产区视频在线播放| 91精品久久久久久蜜桃| 久久亚洲美女| 久久免费视频6| 中文字幕欧美精品日韩中文字幕| 天堂久久av| 国产精品一区二区小说| 午夜电影网一区| 国精产品一区|