掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
大家好,我是前端西瓜哥。這次來簡單說說實現(xiàn)圖形編輯器對齊功能的思路。

十余年的沙縣網(wǎng)站建設經(jīng)驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調(diào)整沙縣建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)公司從事“沙縣網(wǎng)站設計”,“沙縣網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
實現(xiàn)圖形編輯器的對齊功能。
編輯器 github 地址:
https://github.com/F-star/suika
線上體驗:
https://blog.fstars.wang/app/suika/
原理不復雜。
首先要指定多個圖形,不能只有一個。因為一個的話是沒有參照物的,只能自己參照自己,位移距離為 0。
先求出每個圖形的 AABB 包圍盒。
AABB(axis-aligned bounding box)指的是 軸對齊包圍盒。指的是包圍圖形的矩形,但 4 條邊平行于坐標軸。
如下圖,最外層的就是 AABB 包圍盒。
里面帶有旋轉(zhuǎn)角度的是 OBB 包圍盒子,oriented bounding box (OBB)。優(yōu)點是能更緊密的包裹圖形,但帶了旋轉(zhuǎn),在判斷碰撞時要額外進行處理。
AABB 我用下面結(jié)構(gòu)表示:
interface IBox2 {
minX: number;
minY: number;
maxX: number;
maxY: number;
}計算好全部 AABB 包圍盒后,再計算這些包圍盒共同組成的大包圍盒,我暫且稱其為 mixedBBox。這個大包圍盒會作為對齊的參照。
首先是 左對齊。
其實就是讓所有圖形的 AABB 包圍盒的左邊和 mixedBBox 的左側(cè)對齊。
for (let i = 0; i < elements.length; i++) {
const el = elements[i];
const dx = mixedBBox.minX - bBoxes[i].minX;
el.x += dx;
}水平對齊,指的是將多個圖形的 x 坐標往中間靠攏。
讓所有圖形的包圍盒的中心的垂直中線和 mixedBBox 的中心垂直中線對齊。
const centerX = mixedBBox.minX / 2 + mixedBBox.maxX / 2;
for (let i = 0; i < elements.length; i++) {
const el = elements[i];
const dx = centerX - (bBoxes[i].minX / 2 + bBoxes[i].maxX / 2);
el.x += dx;
}
所有圖形的包圍盒和 mixedBBox 右側(cè)對齊:
for (let i = 0; i < elements.length; i++) {
const el = elements[i];
const dx = mixedBBox.maxX - bBoxes[i].maxX;
el.x += dx;
}for (let i = 0; i < elements.length; i++) {
const el = elements[i];
const dy = mixedBBox.minY - bBoxes[i].minY;
el.y += dy;
}for (let i = 0; i < elements.length; i++) {
const el = elements[i];
dy = centerY - (bBoxes[i].minY / 2 + bBoxes[i].maxY / 2);
el.y += dy;
}底對齊:
for (let i = 0; i < elements.length; i++) {
const el = elements[i];
const dy = mixedBBox.maxY - bBoxes[i].maxY;
el.y += dy;
}另外,如果圖形編輯器還有一個舞臺,也可以選中單個圖形,讓這個圖形讓舞臺的盒作為 mixedBBox 進行對齊。
開發(fā)一款圖形工具,會遇到很多有趣的簡單幾何算法小知識,解決后挺有成就感的。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流