日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-08-09 23:03:01 423觀看
導讀大家好,我是前端西瓜哥。開發圖形編輯器,你會經常要解決一些算法問題。本文盤點一些我開發圖形編輯器時常用到的簡單幾何算法。矩形碰撞檢測判斷兩個矩形是否發生碰撞(或者說相交),即兩個矩形有重合的區域。常見使用場景:使

CQ128資訊網——每日最新資訊28at.com

大家好,我是前端西瓜哥。CQ128資訊網——每日最新資訊28at.com

開發圖形編輯器,你會經常要解決一些算法問題。本文盤點一些我開發圖形編輯器時常用到的簡單幾何算法。CQ128資訊網——每日最新資訊28at.com

矩形碰撞檢測

判斷兩個矩形是否發生碰撞(或者說相交),即兩個矩形有重合的區域。CQ128資訊網——每日最新資訊28at.com

CQ128資訊網——每日最新資訊28at.com

常見使用場景:CQ128資訊網——每日最新資訊28at.com

使用選擇工具框選圖形(框選策略除了相交,還可以用相交或其他方案)。CQ128資訊網——每日最新資訊28at.com

遍歷圖形,通過判斷視口矩形和圖形包圍盒的矩形碰撞,剔除掉視口外的圖形渲染操作,提高性能。CQ128資訊網——每日最新資訊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 為包圍盒的接口簽名:CQ128資訊網——每日最新資訊28at.com

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

CQ128資訊網——每日最新資訊28at.com

矩形包含檢測

該算法用于判斷矩形 1 是否包含矩形 2。CQ128資訊網——每日最新資訊28at.com

CQ128資訊網——每日最新資訊28at.com

常見使用場景:CQ128資訊網——每日最新資訊28at.com

使用選擇工具框選圖形(這次用的是包含策略);CQ128資訊網——每日最新資訊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  );}

計算旋轉后坐標

對圖形旋轉,是一個非常基礎的功能。計算旋轉后的點是很常見的需求。CQ128資訊網——每日最新資訊28at.com

CQ128資訊網——每日最新資訊28at.com

常見使用場景:CQ128資訊網——每日最新資訊28at.com

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

用到三角函數算法。CQ128資訊網——每日最新資訊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,  };}

點是否在矩形中

CQ128資訊網——每日最新資訊28at.com

常見使用場景:CQ128資訊網——每日最新資訊28at.com

用于實現圖形拾取,判斷矩形圖形或包圍盒是否在光標位置上。CQ128資訊網——每日最新資訊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  );}

多個矩形組成的大矩形

選中多個矩形時,要計算它們組成的大矩形,然后繪制出大選中框。CQ128資訊網——每日最新資訊28at.com

CQ128資訊網——每日最新資訊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,  };}

這里用的是另一種包圍盒子的表達,所以多了一層轉換。CQ128資訊網——每日最新資訊28at.com

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

計算向量夾角

通過旋轉控制點旋轉圖形時,需要通過向量的點積公式來計算移動的夾角,去更新圖形的旋轉角度。CQ128資訊網——每日最新資訊28at.com

CQ128資訊網——每日最新資訊28at.com

計算 [x - cx, y - cy] 和 [0, -1] 兩個向量夾角的算法實現:CQ128資訊網——每日最新資訊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;}

結尾

做圖形編輯器,經常要和幾何算法打交道,各種相交判斷、居中計算、光標縮放、找最近的參照線等等。CQ128資訊網——每日最新資訊28at.com

這對算法能力有一定要求的,建議多去刷刷 leetcode。此外就是多畫圖分析。CQ128資訊網——每日最新資訊28at.com

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

雖然有點耗腦細胞,但最后把難題解決,還是非常有成就感。CQ128資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-5160-0.html圖形編輯器開發:一些會用到的簡單幾何算法

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

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

下一篇: Python Web開發的必備技能,你掌握了嗎?

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久久久免费视频| 最新中文字幕一区二区三区| 欧美成人午夜| 欧美精品乱码久久久久久按摩| 欧美精品一区二区久久婷婷| 国产精品v片在线观看不卡| 国产精品久久久久久久久免费桃花| 国产精一区二区三区| 黄色成人av| 亚洲精品一二三区| 亚洲欧美国产一区二区三区| 久久精品网址| 欧美成人免费视频| 国产精品久久久久久户外露出| 国产日韩精品综合网站| 亚洲国产天堂网精品网站| 在线亚洲+欧美+日本专区| 亚洲欧美不卡| 免费亚洲网站| 国产精品久久久久久久久久免费看| 国内精品久久久久久影视8 | 欧美日韩国产黄| 国产精品免费一区二区三区观看| 精品动漫3d一区二区三区| 夜夜精品视频| 久久久久这里只有精品| 欧美日韩一区二区高清| 国产一区二区三区高清| 亚洲美女色禁图| 欧美一区二区三区免费大片| 欧美国产日韩一二三区| 国产欧美韩国高清| 亚洲精品一区二区三区樱花| 欧美在线视频二区| 欧美日韩免费在线视频| 国内视频一区| 亚洲一区二区三区精品动漫| 美女脱光内衣内裤视频久久影院| 国产精品久久久久久亚洲毛片| 亚洲高清在线观看| 先锋影音网一区二区| 欧美日本乱大交xxxxx| 精品福利电影| 欧美一级专区免费大片| 欧美日韩在线一区二区三区| 亚洲第一页在线| 欧美淫片网站| 国产精品家庭影院| 日韩一区二区免费看| 老色鬼久久亚洲一区二区 | 精品成人在线观看| 亚洲欧美在线一区二区| 欧美精品一区二区三区蜜桃| 在线成人激情黄色| 欧美一区亚洲一区| 国产精品高潮呻吟久久| 亚洲欧洲精品一区二区| 久久久综合免费视频| 国产欧美日韩视频在线观看| 亚洲天堂av电影| 欧美精选午夜久久久乱码6080| 伊人久久综合97精品| 欧美在线一区二区| 国产精品嫩草99av在线| 亚洲视频一起| 麻豆成人综合网| 国产在线国偷精品产拍免费yy| 亚洲一区免费看| 国产精品vvv| 一本一本久久| 欧美日韩国产综合一区二区| 亚洲精选一区| 欧美激情亚洲一区| 亚洲国产欧美在线| 国产精品视屏| 亚洲一区在线视频| 国产精品av一区二区| 一本久久精品一区二区| 欧美久久久久久久久久| 亚洲日韩欧美视频一区| 欧美国产综合视频| 在线播放视频一区| 久久久久久欧美| 一区二区三区在线视频免费观看| 久久av红桃一区二区小说| 国产伦精品一区二区三区四区免费| 亚洲午夜一区二区| 国产精品成人一区二区三区吃奶| 99在线|亚洲一区二区| 欧美日韩黄色大片| 亚洲天堂免费观看| 国产精品一区二区三区四区| 亚洲欧美制服中文字幕| 国产精品一香蕉国产线看观看 | 国产一区二区在线免费观看| 欧美一区二区在线观看| 国产视频一区在线观看一区免费| 欧美一区二区在线免费观看| 国产亚洲免费的视频看| 久久久久成人精品| 在线观看一区| 欧美激情按摩在线| 一区二区三区欧美亚洲| 国产精品视频男人的天堂| 欧美一区二区播放| 精品不卡一区| 欧美成人精品激情在线观看| 亚洲美女精品久久| 国产精品久久久久aaaa樱花 | 欧美岛国激情| 一区二区免费在线视频| 国产精品美女| 久久精品视频在线看| 亚洲福利在线观看| 欧美久色视频| 午夜精品福利在线观看| 韩日午夜在线资源一区二区| 你懂的国产精品| 在线中文字幕日韩| 国产一区二区精品久久99| 蘑菇福利视频一区播放| 一区二区三区高清在线观看| 国产精品综合视频| 另类成人小视频在线| 一本久久综合亚洲鲁鲁| 国产日韩在线视频| 男人插女人欧美| 亚洲综合色视频| 在线电影一区| 国产精品v欧美精品v日韩| 久久久无码精品亚洲日韩按摩| 亚洲精品美女久久久久| 国产精品任我爽爆在线播放| 久久视频在线看| 亚洲色图在线视频| 韩国一区二区在线观看| 欧美日韩国产精品一区| 久久成人18免费网站| 亚洲精品一区二区三区婷婷月| 国产情侣一区| 欧美另类videos死尸| 香蕉视频成人在线观看| 亚洲日本在线观看| 国产午夜精品久久久| 欧美国产视频日韩| 欧美一级成年大片在线观看| 亚洲人被黑人高潮完整版| 国产伦精品一区二区三| 欧美黑人国产人伦爽爽爽| 欧美一级片久久久久久久| 亚洲精品乱码久久久久久久久 | aa亚洲婷婷| 精品动漫3d一区二区三区| 欧美色视频在线| 久久亚洲精品一区二区| 亚洲一区欧美二区| 亚洲激情精品| 国产亚洲制服色| 欧美日韩一区在线| 欧美成人免费在线视频| 欧美在线亚洲| 亚洲图片在线观看| 亚洲区在线播放| 狠狠色噜噜狠狠色综合久| 国产精品ⅴa在线观看h| 欧美寡妇偷汉性猛交| 久久精品视频免费| 亚洲一区日韩在线| 亚洲美女av网站| 在线日韩av片| 国产香蕉97碰碰久久人人| 国产精品成人观看视频免费 | 最新国产精品拍自在线播放| 国产视频一区在线观看| 欧美性色aⅴ视频一区日韩精品| 欧美成人a视频| 久久久久久久久久码影片| 亚洲综合精品自拍| 正在播放欧美视频| 日韩视频在线观看一区二区| 亚洲第一精品夜夜躁人人躁 | 一区二区三区欧美激情| 91久久国产精品91久久性色| 一区二区三区在线视频播放| 国产欧美韩国高清| 国产精品久久久久一区二区三区共 | 韩国av一区二区| 国产女同一区二区| 国产精品区一区| 欧美亚日韩国产aⅴ精品中极品| 欧美韩国日本一区| 欧美11—12娇小xxxx| 久久亚洲一区二区| 久久视频国产精品免费视频在线| 久久av一区| 欧美在线免费观看| 欧美一区二区视频观看视频| 性欧美暴力猛交另类hd| 午夜精品福利视频| 欧美一区观看| 久久精品视频免费播放| 久久九九免费视频| 久久影视精品| 嫩草国产精品入口|