国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價值的文章主要介紹了圖形編輯器開發(fā):一些會用到的簡單幾何算法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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

開發(fā)圖形編輯器,你會經(jīng)常要解決一些算法問題。本文盤點一些我開發(fā)圖形編輯器時遇到的簡單幾何算法問題。

矩形碰撞檢測

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

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

常見使用場景:

  1. 使用選擇工具框選圖形(框選策略除了相交,還可以用相交或其他方案);
  2. 遍歷圖形,通過判斷視口矩形和圖形包圍盒的矩形碰撞,剔除掉視口外的圖形渲染操作,提高性能。
export function isRectIntersect2(rect1: IBox2, rect2: IBox2) {
  return (
    rect1.minX <= rect2.maxX &&
    rect1.maxX >= rect2.minX &&
    rect1.minY <= rect2.maxY &&
    rect1.maxY >= rect2.minY
  );
}

關(guān)于 IBox2 為包圍盒的接口簽名:

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

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

矩形包含檢測

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

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

常見使用場景:

  1. 使用選擇工具框選圖形(這次用的是包含策略);
function isRectContain2(rect1: IBox2, rect2: IBox2) {
  return (
    rect1.minX <= rect2.minX &&
    rect1.minY <= rect2.minY &&
    rect1.maxX >= rect2.maxX &&
    rect1.maxY >= rect2.maxY
  );
}

計算旋轉(zhuǎn)后坐標

對圖形旋轉(zhuǎn),是一個非常基礎(chǔ)的功能。計算旋轉(zhuǎn)后的點是很常見的需求。

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

常見使用場景:

  1. 計算包圍盒旋轉(zhuǎn)后的坐標,繪制縮放控制點;
  2. 計算光標位置是否落在一個旋轉(zhuǎn)的矩形上,因為旋轉(zhuǎn)的矩形并不是一個正交的矩形,計算出來后判斷有點復雜。所以通常我們會將光標給予矩形的中點反過來旋轉(zhuǎn)一下,然后判斷點是否在矩形中。
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,
  };
}

點是否在矩形中

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-UFGSUYIJ-1689474500245)(https://fe-watermelon.oss-cn-shenzhen.aliyuncs.com/%E9%80%89%E4%B8%AD.gif)]

常見使用場景:

  1. 用于實現(xiàn)圖形拾取,判斷矩形圖形或包圍盒是否在光標位置上。
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
  );
}

多個矩形組成的大矩形

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

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

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

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

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

type IBox = IRect

計算向量夾角

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

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-I7Jpoyx9-1689474500245)(https://fe-watermelon.oss-cn-shenzhen.aliyuncs.com/%E6%97%8B%E8%BD%AC.gif)]

計算 [x - cx, y - cy][0, -1] 兩個向量夾角的算法實現(xiàn):

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

結(jié)尾

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

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

在開發(fā)中,我們還要自己去分析需求,結(jié)合圖形編輯器的具體實現(xiàn),抽離出算法問題,并配合合適的數(shù)據(jù)結(jié)構(gòu),去解題。解法可能一次不是最優(yōu)解, 但我們可以慢慢迭代,慢慢優(yōu)化的。

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

我是前端西瓜哥,歡迎關(guān)注我,學習更多圖形編輯器知識。文章來源地址http://www.zghlxwxcb.cn/news/detail-574957.html

到了這里,關(guān)于圖形編輯器開發(fā):一些會用到的簡單幾何算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • C#時間軸曲線圖形編輯器開發(fā)2-核心功能實現(xiàn)

    C#時間軸曲線圖形編輯器開發(fā)2-核心功能實現(xiàn)

    目錄 三、關(guān)鍵幀編輯 1、新建Winform工程 (1)界面布局 ?(2)全局變量 2、關(guān)鍵幀添加和刪除 (1)鼠標在曲線上識別 (2)鍵盤按鍵按下捕捉 (3)關(guān)鍵幀添加、刪除 ?(4)修改關(guān)鍵幀值 3、曲線插值 (1)三次樣條插值 (2)工程代碼下載鏈接 四、曲線數(shù)據(jù)導出和讀取 1、數(shù)

    2024年02月15日
    瀏覽(32)
  • 圖形編輯器開發(fā):最基礎(chǔ)但卻復雜的選擇工具

    圖形編輯器開發(fā):最基礎(chǔ)但卻復雜的選擇工具

    大家好,我是前端西瓜哥。 對于一個圖形設(shè)計軟件,它最基礎(chǔ)的工具是什么? 選擇工具 。 但這個選擇工具,卻是相當?shù)膹碗s。這次我來和各位,細說細說選擇工具的一些彎彎道道。 我正在開發(fā)的圖形設(shè)計工具的: https://github.com/F-star/suika 線上體驗: https://blog.fstars.wang/ap

    2024年02月09日
    瀏覽(19)
  • Java中規(guī)模軟件開發(fā)實訓——簡單的文本編輯器(代碼注釋詳解)

    Java中規(guī)模軟件開發(fā)實訓——簡單的文本編輯器(代碼注釋詳解)

    ? 博主: 命運之光 ?? 專欄: Python星辰秘典 ?? 專欄: web開發(fā)(html css js) ?? 專欄: Java經(jīng)典程序設(shè)計 ?? 博主的其他文章: 點擊進入博主的主頁 前言: 在現(xiàn)代社會中,計算器是我們生活中不可或缺的工具之一。它們可以輕松地進行各種數(shù)值計算,從簡單的加減乘除

    2024年02月13日
    瀏覽(25)
  • 圖形編輯器:歷史記錄設(shè)計

    圖形編輯器:歷史記錄設(shè)計

    大家好,我是前端西瓜哥。今天講一下圖形編輯器如何實現(xiàn)歷史記錄,做到撤銷重做。 其實就是版本號的更替。每個版本保存一個狀態(tài)。 要記錄圖形編輯器的歷史記錄,支持撤銷重做功能,需要兩個棧: 撤銷(undo)棧和重做(redo)棧 。 每當用戶進行一個操作(比如移動一

    2024年02月01日
    瀏覽(31)
  • [Android] Android Studio 找不到一些包,編輯器顯示紅色

    [Android] Android Studio 找不到一些包,編輯器顯示紅色

    此前寫了一個項目里面用了 這個庫,在本地一段時間,因為其他業(yè)務影響就沒有編寫。今天突發(fā)奇想加點東西,發(fā)現(xiàn)—— 原本完好的項目,通過Android studio打開之后,org.apache.commons引入有問題,大概率應該是gradle導入的問題,但是又不知道怎么解決。 compile的時候應該是沒問

    2024年02月16日
    瀏覽(19)
  • Unity快手上手【熟悉unity編輯器,C#腳本控制組件一些屬性之類的】

    首先了解unity相關(guān)概述,快速認識unity編輯器,然后抓住重點的學:游戲?qū)ο蟆⒔M件|C#腳本、預制體、UI ? 學習過程你會發(fā)現(xiàn),其實Unity中主要是用c#進行開發(fā)。 因為在這個過程中,無非就是,對游戲?qū)ο笸ㄟ^掛載的C#腳本,修改一下組件的一些屬性,控制一下激活之類的操作

    2023年04月13日
    瀏覽(36)
  • 本地組策略編輯器找不到怎么解決?| 解決windows home 版本隱藏本地組策略編輯器的問題 | 簡單的介紹本地組策略編輯器

    本地組策略編輯器找不到怎么解決?| 解決windows home 版本隱藏本地組策略編輯器的問題 | 簡單的介紹本地組策略編輯器

    一般的 Windows 非家庭系統(tǒng)中,本地組策略編輯器不會被隱藏,但在某些特定情況下,可能會受到限制或不可用。如果你無法訪問本地組策略編輯器,并且認為應該可以訪問,請確保你擁有管理員權(quán)限,并檢查是否有任何系統(tǒng)或安全策略的限制。 如果你使用的Win11 home版本 ,無

    2024年02月11日
    瀏覽(29)
  • 使用Plist編輯器——簡單入門指南

    使用Plist編輯器——簡單入門指南

    本指南將介紹如何使用Plist編輯器。您將學習如何打開、編輯和保存plist文件,并了解plist文件的基本結(jié)構(gòu)和用途。跟隨這個簡單的入門指南,您將掌握如何使用Plist編輯器輕松管理您的plist文件。 plist文件是一種常見的配置文件格式,用于存儲應用程序或系統(tǒng)的設(shè)置信息,如鍵

    2024年02月16日
    瀏覽(23)
  • 簡單了解 vim 編輯器最基礎(chǔ)的操作

    簡單了解 vim 編輯器最基礎(chǔ)的操作

    vim 這個是 Linux 上自帶的一個文本編輯器,使用 vim 就可以更靈活的對文件進行編輯了(雖然和記事本的定位差不多,實際上vim的使用要復雜很多) 語法:vim 文件名 示例:打開一個空白 test.txt 普通文件 運行結(jié)果: vim 包含很多快捷鍵,快捷鍵的畫風和其他的軟件截然不同,其

    2024年03月14日
    瀏覽(25)
  • Linux編輯器:vim的簡單介紹及使用

    Linux編輯器:vim的簡單介紹及使用

    ? 目錄 1.什么是vim? 2.vim的基本概念 3.vim 的基本操作 4. 各模式下的命令集 4.1 正常模式命令集? 4.2 末行模式命令集 5.補充 5.1?vim支持多文件編輯 5.2 vim 的配置 1.vim 配置原理 2. 常用簡單配置選項: 3. 使用插件 Vim 是從 vi 發(fā)展出來的一個 文本編輯器 ,即對文本進行增刪改查。

    2024年02月05日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包