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

學到了!Figma 原來是這樣表示矩形的

開發 前端
Figma 只用寬高和變換矩陣來表達矩形,在數據層可以用精簡的數據表達豐富的變形,此外在渲染的時候也能將矩陣運算交給 GPU 進行并行運算,是不錯的做法。

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

今天我們來研究一下 Figma 是如何表示圖形的,這里以矩形為切入點進行研究。

明白最簡單的矩形的表示后,研究其他的圖形就可以舉一反三。

矩形的一般表達

如果讓我設計一個矩形圖形的物理屬性,我會怎么設計?

我張口就來:x、y、width、height、rotation。

對一些簡單的圖形編輯操作,這些屬性基本上是夠用的,比如白板工具,如果你不考慮或者不希望圖形可以翻轉(flip) 的話。

Figma 需要考慮翻轉的情況的,此外還有斜切的情況。

翻轉的場景:

還有斜切的場景,在選中多個圖形然后縮放時有發生。

這些表達光靠上面的幾個屬性是不夠的,我們看看 Figma為了表達這些效果,是怎么去設計矩形的。

Figma 矩形物理屬性

與物理信息相關的屬性如下:

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

沒有位置屬性,這個屬性默認是 (0, 0),實際它轉移到 transform 的矩陣的位移子矩陣上了。

size 表示寬高,但屬性名用的是 x(寬) 和 y(高),理論上 width 和 height 語義更好,這樣應該是用了矢量類型。

size 表示寬高,理論上 width 和 height 語義更好,這樣應該是用了平面矢量類型的結構體,所以是 x 和 y。

transform 表示一個 3x3 的變換矩陣。

m00 | m01 | m02
m10 | m11 | m12
 0  |  0  |  1

上面的 transform 屬性的值所對應的矩陣為:

1 | 3 | 5
2 | 4 | 6
0 | 0 | 1

屬性面板

再看看這些屬性對應的右側屬性面板。

x、y 分別是 5 和 6,它是 (0, 0) 進行 transform 后的結果,這個直接對應 transform.m02 和 tansfrom.m12。

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 類,該類使用列向量方式進行表達。

文末有 demo 源碼以及線上 demo,可打開控制臺查看結果驗證正確性。

然后這里的 width 和 height,是 223.61 和 500, 怎么來的?

它們對應的是矩形的兩條邊變形后的長度,如下:

uiWidth 為 (0, 0) 和 (width, 0)  進行矩陣變換后坐標點之間的距離。

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。

高度計算同理。

uiHeight 為 (0, 0) 和 (0, height)  進行矩陣變換后坐標點之間的距離。

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

旋轉角度

最后是旋轉角度,它是寬度對應的矩形邊向量,逆時針旋轉 90 度的向量所對應的角度。

先計算寬邊向量,然后逆時針旋轉 90 度得到旋轉向量,最后計算旋轉向量對應的角度。

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

這里用了幾個工具函數。

// 計算和 (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;
}

// 弧度轉角度
const rad2Deg = (rad) => (rad * 180) / Math.PI;

Figma 的角度表示比較別扭。

特征為:基準角度朝上,對應向量為 (0, -1),角度方向為逆時針,角度范圍限定為 (-180, 180],計算向量角度時要注意這個特征進行調整。

完整代碼實現

線上 demo:

https://codepen.io/F-star/pen/WNPVWwQ?editors=0012。

代碼實現:

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

// 弧度轉角度
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 };
  // 逆時針旋轉 90 度,得到旋轉向量
  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,
  }
);

運行一下,結果和屬性面板一致。

結尾

Figma 只用寬高和變換矩陣來表達矩形,在數據層可以用精簡的數據表達豐富的變形,此外在渲染的時候也能將矩陣運算交給 GPU 進行并行運算,是不錯的做法。

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

2024-04-30 08:22:51

Figma圖形編輯變換矩陣

2022-12-14 07:32:40

InnoDBMySQL引擎

2022-05-05 08:55:12

工業物聯網IIoT

2023-05-22 15:58:11

2018-04-02 15:13:21

網絡

2023-02-15 08:17:38

2025-02-17 09:22:16

MySQLSQL語句

2020-05-26 08:52:36

Java JVM多態

2020-11-24 06:20:02

Linux日志文件系統

2016-10-12 08:54:24

2021-08-17 07:00:00

雙重檢查鎖Nacos

2017-11-02 13:05:12

PC3D NAND內存

2014-07-21 10:32:52

蘋果公司實習

2020-03-23 08:30:12

程序員男友感受

2015-03-25 09:55:34

程序員程序員修補BUG真正原因

2018-10-26 10:41:19

2017-05-09 15:39:33

ensorFlow機器人機器學習

2022-07-13 10:37:59

服務器故障優化

2017-06-06 15:13:07

2011-05-25 09:58:46

C#
點贊
收藏

51CTO技術棧公眾號

成人晚上爱看视频| 国产美女精品久久| 日韩免费一二三区| 色香欲www7777综合网| 国产精品77777| 亚洲色图狂野欧美| 国产精品二区在线| 大黑人交xxx极品hd| 成人免费高清| 欧美日韩在线二区| 欧美日韩国产精品一区| 99九九视频| 国产成人精品视频免费| 网友自拍亚洲| 91网页版在线| 欧美精品videosex极品1| 亚洲视频第二页| 国产精品免费观看| 免费日韩视频| 日韩av在线免费看| 亚洲 欧美 综合 另类 中字| 国产女无套免费视频| 久久要要av| 精品视频1区2区3区| 日韩精品久久久| 在线观看日本网站| 久久成人福利| 精品国产91久久久| 国产在线精品一区二区三区| 久久久久噜噜噜亚洲熟女综合| 精品久久在线| 国产精品色眯眯| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 亚洲第一区在线观看| 在线视频不卡一区二区| 一区二区视频免费| 欧美肥老太太性生活| 亚洲第一页中文字幕| 亚洲怡红院在线| 老司机在线永久免费观看| 久久激情网站| 夜夜嗨av色综合久久久综合网| 日韩亚洲在线视频| av电影在线网| 狠狠久久亚洲欧美| 欧美激情啊啊啊| 亚洲熟女乱综合一区二区三区| 欧美xxxhd| 国产日本欧美一区二区| 国产欧美日韩中文| 精品一区在线观看视频| 影音先锋欧美激情| 精品日本高清在线播放| 亚洲午夜精品久久| 国产特级黄色片| 日本欧美一区二区| 欧美成在线视频| 日韩精品xxx| 黄频免费在线观看| 欧美激情在线一区二区| 玛丽玛丽电影原版免费观看1977 | 91精品精品| 精品久久五月天| 免费男同深夜夜行网站| 涩涩视频网站在线观看| 亚瑟在线精品视频| 日韩免费中文专区| 第一视频专区在线| 亚洲国产精品激情在线观看| 亚洲精品欧美日韩| 国产一级做a爱片久久毛片a| 日韩1区在线| 亚洲缚视频在线观看| 中国xxxx性xxxx产国| 日本在线视频一区二区| 一级精品视频在线观看宜春院 | 国产香蕉精品| 欧美羞羞免费网站| 丰满少妇大力进入| 免费观看成年在线视频网站| 黄色日韩网站视频| 亚洲xxxxx电影| 亚洲男女视频在线观看| 免费高清在线一区| 久久久久久有精品国产| 日本少妇全体裸体洗澡| 久久亚洲国产| 美乳少妇欧美精品| 天堂网一区二区三区| 91欧美日韩| 久久99精品久久久久久噜噜| 色一情一交一乱一区二区三区| 日韩中文字幕在线一区| 欧美三级视频在线| 亚洲三级在线观看视频| 欧美片网站免费| 欧美亚洲国产一区在线观看网站 | 精品国产123| 91欧美视频在线| 免费观看亚洲天堂| 亚洲国模精品一区| 免费人成视频在线播放| 91福利精品在线观看| 日韩欧美高清在线视频| 国产乱淫av片杨贵妃| 厕沟全景美女厕沟精品| 亚洲国产成人91porn| 成年人三级视频| 1024免费在线视频| 亚洲二区在线观看| 国产理论在线播放| 2019年精品视频自拍| 91麻豆精品国产无毒不卡在线观看 | 免费成人av电影| 亚洲欧美日韩中文字幕一区二区三区| 日韩一区二区电影在线观看| 91最新在线视频| 成人欧美一区二区三区在线播放| 三区精品视频观看| 国产免费av高清在线| 一区二区三区四区乱视频| 三级在线免费观看| 中文av资源在线| 色哟哟在线观看一区二区三区| 日韩a在线播放| 欲香欲色天天天综合和网| 天天色天天操综合| 992kp免费看片| 色妞ww精品视频7777| 伊人久久综合97精品| 精品成人免费视频| 国产精品77777| 小说区视频区图片区| 超碰电影在线播放| 欧美色视频在线| 好吊一区二区三区视频| 欧美午夜影院| 性欧美xxxx视频在线观看| a v视频在线观看| 国产麻豆日韩欧美久久| 俄罗斯精品一区二区| 午夜激情在线观看| 亚洲午夜电影在线| 久久人妻精品白浆国产| 国产精品久久久久久久久久白浆| 久久精品国产99国产精品澳门| 一区视频免费观看| 开心九九激情九九欧美日韩精美视频电影 | 久久av最新网址| 国新精品乱码一区二区三区18| 亚洲大尺度视频| 成人美女在线视频| 国产91porn| 99视频有精品高清视频| 精品国产一区二区三区久久久蜜月| 四虎影视一区二区| 亚洲小说区图片区| 欧美一性一乱一交一视频| 国产情侣呻吟对白高潮| 国产乱子伦一区二区三区国色天香| 日韩精品久久一区| 日韩av免费| 中文字幕精品av| 久久久久久久久久久久久久久久久| 激情五月婷婷综合网| 在线国产99| 成人在线啊v| 精品在线小视频| 26uuu成人网| 免费在线亚洲欧美| 麻豆蜜桃91| 久久久久久久性潮| 久久这里有精品视频| 亚洲天堂视频网站| 国产乱色国产精品免费视频| 少妇一晚三次一区二区三区| xx欧美xxx| 中文字幕亚洲综合| av网站在线免费看| 国产精品乱码一区二区三区软件 | 国产成人免费视频网站| 国产天堂视频在线观看| 露出调教综合另类| 国产97人人超碰caoprom| 国产成人精品免费看视频| 一区二区不卡在线视频 午夜欧美不卡在| 爱情岛论坛亚洲自拍| 亚洲精品裸体| 99精品国产高清在线观看| 激情av在线| 91麻豆精品国产自产在线| 国产性70yerg老太| 久久亚洲影视婷婷| 男人天堂手机在线视频| 任你躁在线精品免费| 欧美精品激情blacked18| 婷婷五月综合久久中文字幕| 亚洲精品乱码久久久久久| 国产+高潮+白浆+无码| 午夜激情一区| 亚洲精品欧美日韩| 在线免费av资源| 按摩亚洲人久久| 夜夜狠狠擅视频| 国产精品久久久久久久久果冻传媒 | 欧美偷拍视频| 午夜电影一区二区三区| 快灬快灬一下爽蜜桃在线观看| 亚洲欧美激情诱惑| 国产精品12p| 一道在线中文一区二区三区| 91精品国产高清| 国模人体一区二区| 欧美亚洲尤物久久| 日韩美女一级片| 亚洲欧洲日韩女同| 中文字幕国产专区| 国产·精品毛片| 人人妻人人澡人人爽欧美一区双 | 91在线视频在线观看| 亚洲男人的天堂av| 又黄又爽又色的视频| 久久亚洲精品伦理| 台湾成人av| 欧美成人一区在线观看| 亚洲一区二区三区香蕉 | 久久精品免费一区二区三区| 你懂的视频在线一区二区| 在线综合色站| 成人欧美在线视频| a视频在线免费看| 一本一本久久a久久精品综合小说| 婷婷丁香花五月天| 日韩美一区二区三区| 日本少妇bbwbbw精品| √…a在线天堂一区| 九九九视频在线观看| 久久亚洲二区三区| av2014天堂网| 不卡一区中文字幕| 黄色一级大片在线观看| 国产美女诱惑一区二区| 日韩精品电影网站| 亚洲三级网址| 欧美高清视频一区二区三区在线观看| 精品3atv在线视频| 欧美在线xxx| 深夜在线视频| 欧美一级视频一区二区| 成年男女免费视频网站不卡| 久久久久久国产精品| 亚洲www色| 国产午夜精品全部视频在线播放| 97超碰人人草| 午夜精品国产更新| 国产精品1234区| 亚洲韩国精品一区| 国产一级淫片免费| 亚洲五码中文字幕| 亚洲国产精品午夜在线观看| 亚洲一卡二卡三卡四卡五卡| 国产精品二区一区二区aⅴ| 亚洲成人免费观看| 亚洲高清毛片一区二区| 岛国av一区二区| 日本中文字幕久久| 在线日韩av片| 国产一级做a爰片在线看免费| 亚洲欧美日韩中文播放 | 国内精品一区视频| 日韩久久免费av| 高清乱码毛片入口| 日韩经典中文字幕| 韩国三级在线观看久| 最近更新的2019中文字幕| 少妇激情av一区二区| 国产亚洲精品久久久久久777| 日本免费在线视频| 欧美大码xxxx| 欧美巨大丰满猛性社交| 国产精品第2页| 黄色在线网站噜噜噜| 欧美主播福利视频| 懂色av一区| 国产91精品不卡视频| 国产精品黄色片| 亚洲综合色av| 日韩影视高清在线观看| av在线不卡观看| 加勒比久久高清| 日韩欧美电影一区二区| 亚洲国产精品久久久久蝴蝶传媒| 丰满的少妇愉情hd高清果冻传媒 | 手机看片福利日韩| 国产精品一区二区x88av| 国产三级视频网站| 成人a区在线观看| 国产美女免费无遮挡| 亚洲欧洲综合另类在线| 欧美日韩精品区| 8x8x8国产精品| 日本成人一区| 欧美裸身视频免费观看| 老司机成人影院| 亚洲精品欧美日韩| 精品国产精品久久一区免费式 | 免费毛片视频网站| 亚洲欧美日韩国产综合| 五月天激情国产综合婷婷婷| 欧美精品欧美精品系列| 一区二区三区免费在线| 精品福利av导航| 青青青青在线| 欧美中文字幕视频| 深夜激情久久| 亚洲永久一区二区三区在线| 国产精品免费看| 先锋资源在线视频| 国产精品免费av| 7799精品视频天天看| 精品国产一区二区三区忘忧草| 永久免费av片在线观看全网站| 91精品国产亚洲| h视频久久久| 国产一区二区三区免费不卡| 亚洲天天综合| 老子影院午夜伦不卡大全| 奇米亚洲午夜久久精品| 亚洲色图14p| 亚洲成av人片在www色猫咪| 99精品人妻无码专区在线视频区| 亚洲人成网站在线播| 高清在线视频不卡| 亚洲一区二区三区777| 日韩电影在线视频| 欧美精品无码一区二区三区| 美女网站一区二区| 日韩一级av毛片| 日韩欧美精品在线观看| 婷婷在线观看视频| 精品视频久久久| 黑人玩欧美人三根一起进| 91色琪琪电影亚洲精品久久| 日韩精品一区二区三区中文| 99精品视频网站| 久久99精品久久久久| 国产成人av片| 久久久激情视频| 日本黄色录像视频| 亚洲国产一区二区三区| www视频在线| 亚洲日韩欧美视频一区| 中文在线8资源库| 久久久久久国产精品一区| 久久影视一区| 欧美美女一级片| 99免费精品在线| 永久av免费网站| 91精品一区二区三区在线观看| 18+视频在线观看| 成人免费91在线看| 国产综合亚洲精品一区二| 91人人澡人人爽人人精品| 国产成人午夜精品影院观看视频| 欧美成人一区二区三区高清| 欧美午夜电影在线| 精品无人乱码| 国产精品三级网站| 玖玖玖免费嫩草在线影院一区| 精品国偷自产一区二区三区| 91在线精品一区二区| 日韩成人毛片视频| 日韩欧美色综合| 密臀av在线播放| 欧美日韩大片一区二区三区 | 日韩女优人人人人射在线视频| 精品美女久久| 欧美精品 - 色网| 亚洲国产精品久久久久秋霞影院 | 久久久777精品电影网影网| 一区二区三区www污污污网站| 色综合天天综合网国产成人网 | 吉吉日韩欧美| 亚洲欧洲精品在线| 国产亚洲激情| 国产真人做爰视频免费| 五月综合激情网| 国产51人人成人人人人爽色哟哟| 成人福利免费观看| 影音国产精品| 久久视频精品在线观看| 日韩一区二区免费视频| 午夜小视频在线| 91免费在线观看网站| 国产精品久久久久无码av| 精品久久久久久无码国产| 中文字幕日本不卡| 天堂中文网在线| 成人黄色大片在线免费观看| 国产一区二区三区的电影|