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

當(dāng)前位置:首頁 > 科技  > 軟件

學(xué)到了!Figma 原來是這樣表示矩形的

來源: 責(zé)編: 時間:2024-02-06 10:11:29 397觀看
導(dǎo)讀大家好,我是前端西瓜哥。今天我們來研究一下 Figma 是如何表示圖形的,這里以矩形為切入點進行研究。明白最簡單的矩形的表示后,研究其他的圖形就可以舉一反三。矩形的一般表達如果讓我設(shè)計一個矩形圖形的物理屬性,我會怎

Lwa28資訊網(wǎng)——每日最新資訊28at.com

大家好,我是前端西瓜哥。Lwa28資訊網(wǎng)——每日最新資訊28at.com

今天我們來研究一下 Figma 是如何表示圖形的,這里以矩形為切入點進行研究。Lwa28資訊網(wǎng)——每日最新資訊28at.com

明白最簡單的矩形的表示后,研究其他的圖形就可以舉一反三。Lwa28資訊網(wǎng)——每日最新資訊28at.com

矩形的一般表達

如果讓我設(shè)計一個矩形圖形的物理屬性,我會怎么設(shè)計?Lwa28資訊網(wǎng)——每日最新資訊28at.com

我張口就來:x、y、width、height、rotation。Lwa28資訊網(wǎng)——每日最新資訊28at.com

對一些簡單的圖形編輯操作,這些屬性基本上是夠用的,比如白板工具,如果你不考慮或者不希望圖形可以翻轉(zhuǎn)(flip) 的話。Lwa28資訊網(wǎng)——每日最新資訊28at.com

Figma 需要考慮翻轉(zhuǎn)的情況的,此外還有斜切的情況。Lwa28資訊網(wǎng)——每日最新資訊28at.com

翻轉(zhuǎn)的場景:Lwa28資訊網(wǎng)——每日最新資訊28at.com

Lwa28資訊網(wǎng)——每日最新資訊28at.com

還有斜切的場景,在選中多個圖形然后縮放時有發(fā)生。Lwa28資訊網(wǎng)——每日最新資訊28at.com

Lwa28資訊網(wǎng)——每日最新資訊28at.com

這些表達光靠上面的幾個屬性是不夠的,我們看看 Figma為了表達這些效果,是怎么去設(shè)計矩形的。Lwa28資訊網(wǎng)——每日最新資訊28at.com

Figma 矩形物理屬性

與物理信息相關(guān)的屬性如下:Lwa28資訊網(wǎng)——每日最新資訊28at.com

{  "size": {    "x": 100,    "y": 100  },  "transform": {    "m00": 1,    "m01": 3,    "m02": 5,    "m10": 2,    "m11": 4,    "m12": 6  },  // 省略其他無關(guān)屬性}

沒有位置屬性,這個屬性默認是 (0, 0),實際它轉(zhuǎn)移到 transform 的矩陣的位移子矩陣上了。Lwa28資訊網(wǎng)——每日最新資訊28at.com

size 表示寬高,但屬性名用的是 x(寬) 和 y(高),理論上 width 和 height 語義更好,這樣應(yīng)該是用了矢量類型。Lwa28資訊網(wǎng)——每日最新資訊28at.com

size 表示寬高,理論上 width 和 height 語義更好,這樣應(yīng)該是用了平面矢量類型的結(jié)構(gòu)體,所以是 x 和 y。Lwa28資訊網(wǎng)——每日最新資訊28at.com

transform 表示一個 3x3 的變換矩陣。Lwa28資訊網(wǎng)——每日最新資訊28at.com

m00 | m01 | m02m10 | m11 | m12 0  |  0  |  1

上面的 transform 屬性的值所對應(yīng)的矩陣為:Lwa28資訊網(wǎng)——每日最新資訊28at.com

1 | 3 | 52 | 4 | 60 | 0 | 1

屬性面板

再看看這些屬性對應(yīng)的右側(cè)屬性面板。Lwa28資訊網(wǎng)——每日最新資訊28at.com

Lwa28資訊網(wǎng)——每日最新資訊28at.com

x、y 分別是 5 和 6,它是 (0, 0) 進行 transform 后的結(jié)果,這個直接對應(yīng) transform.m02 和 tansfrom.m12。Lwa28資訊網(wǎng)——每日最新資訊28at.com

import { Matrix } from "pixi.js";const matrix = new Matrix(1, 2, 3, 4, 5, 6);const topLeft = matrix.apply({ x: 0, y: 0 }); // { x: 5, y: 6 }// 或直接點const topLeft = { x: 5, y: 6 }

這里引入了 pixi.js 的 matrix 類,該類使用列向量方式進行表達。Lwa28資訊網(wǎng)——每日最新資訊28at.com

文末有 demo 源碼以及線上 demo,可打開控制臺查看結(jié)果驗證正確性。Lwa28資訊網(wǎng)——每日最新資訊28at.com

然后這里的 width 和 height,是 223.61 和 500, 怎么來的?Lwa28資訊網(wǎng)——每日最新資訊28at.com

它們對應(yīng)的是矩形的兩條邊變形后的長度,如下:Lwa28資訊網(wǎng)——每日最新資訊28at.com

Lwa28資訊網(wǎng)——每日最新資訊28at.com

uiWidth 為 (0, 0) 和 (width, 0)  進行矩陣變換后坐標點之間的距離。Lwa28資訊網(wǎng)——每日最新資訊28at.com

const distance = (p1, p2) => {  const a = p1.x - p2.x;  const b = p1.y - p2.y;  return Math.sqrt(a * a + b * b);};const matrix = new Matrix(1, 2, 3, 4, 5, 6);const topLeft = { x: 5, y: 6 }const topRight = matrix.apply({ x: 100, y: 0 });distance(topRight, topLeft); // 223.60679774997897

最后計算出 223.60679774997897,四舍五入得到 223.61。Lwa28資訊網(wǎng)——每日最新資訊28at.com

高度計算同理。Lwa28資訊網(wǎng)——每日最新資訊28at.com

uiHeight 為 (0, 0) 和 (0, height)  進行矩陣變換后坐標點之間的距離。Lwa28資訊網(wǎng)——每日最新資訊28at.com

const matrix = new Matrix(1, 2, 3, 4, 5, 6);const topLeft = { x: 5, y: 6 }const bottomLeft = matrix.apply({ x: 0, y: 100 });distance(bottomLeft, topLeft); // 500

旋轉(zhuǎn)角度

最后是旋轉(zhuǎn)角度,它是寬度對應(yīng)的矩形邊向量,逆時針旋轉(zhuǎn) 90 度的向量所對應(yīng)的角度。Lwa28資訊網(wǎng)——每日最新資訊28at.com

Lwa28資訊網(wǎng)——每日最新資訊28at.com

先計算寬邊向量,然后逆時針旋轉(zhuǎn) 90 度得到旋轉(zhuǎn)向量,最后計算旋轉(zhuǎn)向量對應(yīng)的角度。Lwa28資訊網(wǎng)——每日最新資訊28at.com

const wSideVec = { x: topRight.x - topLeft.x, y: topRight.y - topLeft.y };// 逆時針旋轉(zhuǎn) 90 度,得到旋轉(zhuǎn)向量const rotationMatrix = new Matrix(0, -1, 1, 0, 0, 0);const rotationVec = rotationMatrix.apply(wSideVec);const rad = calcVectorRadian(rotationVec);const deg = rad2Deg(rad); //

這里用了幾個工具函數(shù)。Lwa28資訊網(wǎng)——每日最新資訊28at.com

// 計算和 (0, -1) 的夾角const calcVectorRadian = (vec) => {  const a = [vec.x, vec.y];  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 rad = Math.acos(dotProduct / d);  if (vec.x > 0) {    // 如果 x > 0, 則 rad 轉(zhuǎn)為 (-PI, 0) 之間的值    rad = -rad;  }  return rad;}// 弧度轉(zhuǎn)角度const rad2Deg = (rad) => (rad * 180) / Math.PI;

Figma 的角度表示比較別扭。Lwa28資訊網(wǎng)——每日最新資訊28at.com

特征為:基準角度朝上,對應(yīng)向量為 (0, -1),角度方向為逆時針,角度范圍限定為 (-180, 180],計算向量角度時要注意這個特征進行調(diào)整。Lwa28資訊網(wǎng)——每日最新資訊28at.com

Lwa28資訊網(wǎng)——每日最新資訊28at.com

完整代碼實現(xiàn)

線上 demo:Lwa28資訊網(wǎng)——每日最新資訊28at.com

https://codepen.io/F-star/pen/WNPVWwQ?editors=0012。Lwa28資訊網(wǎng)——每日最新資訊28at.com

代碼實現(xiàn):Lwa28資訊網(wǎng)——每日最新資訊28at.com

import { Matrix } from "pixi.js";// 計算和 (0, -1) 的夾角const calcVectorRadian = (vec) => {  const a = [vec.x, vec.y];  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 rad = Math.acos(dotProduct / d);  if (vec.x > 0) {    // 如果 x > 0, 則 rad 為 (-PI, 0) 之間的值    rad = -rad;  }  return rad;}// 弧度轉(zhuǎn)角度const rad2Deg = (rad) => (rad * 180) / Math.PI;const distance = (p1, p2) => {  const a = p1.x - p2.x;  const b = p1.y - p2.y;  return Math.sqrt(a * a + b * b);};const getAttrs = (size, transform) => {  const width = size.x;  const height = size.y;  const matrix = new Matrix(    transform.m00, // 1    transform.m10, // 2    transform.m01, // 3    transform.m11, // 4    transform.m02, // 5    transform.m12 // 6  );  const topLeft = { x: transform.m02, y: transform.m12 };  console.log("x:", topLeft.x)  console.log("y:", topLeft.y)  const topRight = matrix.apply({ x: width, y: 0 });  console.log("width:", distance(topRight, topLeft)); // 223.60679774997897  const bottomLeft = matrix.apply({ x: 0, y: height });  console.log("height:", distance(bottomLeft, topLeft)); // 500  const wSideVec = { x: topRight.x - topLeft.x, y: topRight.y - topLeft.y };  // 逆時針旋轉(zhuǎn) 90 度,得到旋轉(zhuǎn)向量  const rotationMatrix = new Matrix(0, -1, 1, 0, 0, 0);  const rotationVec = rotationMatrix.apply(wSideVec);  const rad = calcVectorRadian(rotationVec);  const deg = rad2Deg(rad);  console.log("rotation:", deg); // -63.43494882292201};getAttrs(  // 寬高  { x: 100, y: 100 },  // 變換矩陣  {    m00: 1,    m01: 3,    m02: 5,    m10: 2,    m11: 4,    m12: 6,  });

運行一下,結(jié)果和屬性面板一致。Lwa28資訊網(wǎng)——每日最新資訊28at.com

Lwa28資訊網(wǎng)——每日最新資訊28at.com

結(jié)尾

Figma 只用寬高和變換矩陣來表達矩形,在數(shù)據(jù)層可以用精簡的數(shù)據(jù)表達豐富的變形,此外在渲染的時候也能將矩陣運算交給 GPU 進行并行運算,是不錯的做法。Lwa28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-74664-0.html學(xué)到了!Figma 原來是這樣表示矩形的

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

上一篇: 接手外包團隊開發(fā)的微服務(wù)項目,我感覺我的頭快要裂開了

下一篇: .NET輕量級ORM框架Dapper.NET的高級應(yīng)用實例詳解

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
韩日欧美一区二区| 欧美午夜精彩| 久久国产精品亚洲va麻豆| 欧美一区二区三区啪啪| 久久久人成影片一区二区三区观看| 久久精品视频在线免费观看| 麻豆91精品| 欧美日韩精品一区二区三区四区| 国产精品免费电影| 国产一区二区欧美日韩| 亚洲国产精品第一区二区三区| 日韩午夜在线电影| 久久精品久久综合| 欧美激情第六页| 欧美亚洲第一页| 精品成人在线视频| 一区二区三区四区五区精品| 久久国产精品一区二区三区| 欧美极品一区二区三区| 国产欧美一区二区精品秋霞影院| 亚洲国产精品女人久久久| 亚洲视频欧洲视频| 久久人91精品久久久久久不卡| 欧美日韩精品综合在线| 国产一区二区三区四区| 99精品欧美一区二区三区| 久久激情婷婷| 国产精品二区在线| 在线看片日韩| 亚洲欧美另类久久久精品2019| 女女同性女同一区二区三区91| 国产精品羞羞答答xxdd| 亚洲精品视频免费观看| 久久国产精品99国产| 欧美日韩一区二区免费视频| 在线观看成人小视频| 亚洲欧美日韩一区在线| 欧美精品久久99| 激情综合色综合久久| 午夜欧美不卡精品aaaaa| 欧美裸体一区二区三区| 国产综合网站| 亚洲欧美一区二区三区在线| 欧美美女bbbb| 亚洲福利视频一区| 久久精品国产亚洲一区二区三区 | 欧美在线free| 欧美日韩在线免费视频| 在线精品在线| 欧美一区二区三区免费观看视频| 欧美日韩在线观看一区二区三区| 精品999日本| 欧美在线三区| 国产精品你懂的在线| 亚洲免费av观看| 欧美不卡视频一区发布| 黄色成人av| 久久本道综合色狠狠五月| 国产精品久久久免费| 夜夜嗨av一区二区三区| 欧美精品尤物在线| 亚洲国产精品一区二区www| 久久精品人人做人人爽电影蜜月| 国产精品日本一区二区| 亚洲少妇最新在线视频| 欧美日韩精品是欧美日韩精品| 最新69国产成人精品视频免费| 久久尤物视频| 樱桃成人精品视频在线播放| 久久精品日产第一区二区| 国产一区99| 久久国产天堂福利天堂| 国产视频在线观看一区二区三区| 亚洲欧美日本日韩| 国产精品乱人伦中文| 亚洲视频碰碰| 国产精品99免费看| 亚洲一区二区免费| 亚洲欧洲精品一区| 欧美在线一二三| 国产午夜精品福利| 欧美在线三区| 国产资源精品在线观看| 久久精品国产2020观看福利| 国产一区二区你懂的| 久久久精品欧美丰满| 一区福利视频| 欧美a级一区| 亚洲精品免费看| 欧美日韩国产成人精品| 99热精品在线观看| 欧美午夜精品电影| 午夜精品一区二区三区四区| 国产视频久久久久| 久久久久久久久一区二区| 精品动漫一区二区| 欧美va亚洲va香蕉在线| 亚洲精品免费在线观看| 欧美日韩另类丝袜其他| 亚洲一区中文| 国产偷国产偷精品高清尤物| 久久免费午夜影院| 亚洲国产精品免费| 欧美日韩国产大片| 亚洲综合精品四区| 国产一区二区0| 美女免费视频一区| 日韩西西人体444www| 国产精品高潮呻吟| 久久成人精品一区二区三区| 在线播放豆国产99亚洲| 欧美精品成人在线| 亚洲一区二区三区激情| 国产亚洲二区| 欧美chengren| 亚洲视频一区二区| 国产亚洲精品资源在线26u| 麻豆9191精品国产| 一本到12不卡视频在线dvd| 国产精品网站一区| 久久人人爽人人| 亚洲精品自在在线观看| 国产精品久久久| 久久国产日韩欧美| 亚洲国产综合91精品麻豆| 欧美色精品天天在线观看视频 | 午夜视频一区二区| 精品电影在线观看| 欧美日韩免费在线观看| 欧美一级免费视频| 亚洲激情黄色| 国产精品永久在线| 欧美激情第1页| 欧美一区二区成人6969| 亚洲人成亚洲人成在线观看图片| 国产精品av免费在线观看| 久久久精品一区| 一本色道久久99精品综合 | 国产亚洲成人一区| 欧美日韩第一区| 久久精品在线播放| 一区二区三区精品久久久| 国内自拍一区| 欧美午夜www高清视频| 久久久久久一区二区三区| 在线视频一区观看| 亚洲国产女人aaa毛片在线| 国产精品久久久久久久浪潮网站 | 亚洲国产精品精华液网站| 国产精品久99| 欧美1区免费| 欧美一区二区视频97| 99re6热只有精品免费观看| 狠狠噜噜久久| 国产精品一区二区三区久久久| 欧美成在线视频| 欧美伊人久久久久久午夜久久久久 | 国产精品黄色| 欧美成在线视频| 久久久久国产精品一区三寸| 亚洲午夜日本在线观看| 亚洲激情av在线| 黄色成人在线观看| 国产精品推荐精品| 欧美日韩国产综合视频在线观看 | 欧美一区二区啪啪| av成人免费在线观看| 在线看国产一区| 国产亚洲精品久久飘花| 国产精品久久久久影院亚瑟| 欧美精品午夜视频| 久久亚洲一区二区| 欧美一区影院| 亚洲制服av| 一区二区三区精品| 亚洲欧洲三级电影| 在线精品国精品国产尤物884a| 国产精品一区久久久| 欧美视频在线免费| 欧美极品在线视频| 免费成人黄色片| 久久久久久久久岛国免费| 欧美亚洲日本一区| 亚洲制服少妇| 亚洲特级毛片| 在线综合亚洲| 一区二区三区四区国产精品| 日韩一区二区高清| 亚洲精品无人区| 亚洲人成毛片在线播放| 亚洲国产成人av| 在线观看亚洲| 亚洲第一区在线观看| 一区二区在线视频| 国产在线拍偷自揄拍精品| 国产精品羞羞答答xxdd| 国产精品久久久免费| 欧美小视频在线| 国产精品九色蝌蚪自拍| 国产精品成人一区二区艾草| 国产精品成人免费精品自在线观看| 欧美日韩一区在线观看视频| 欧美精品麻豆| 欧美日韩另类丝袜其他|