iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0

Path是Canvas中用來繪製「多邊形」的方法。

比如下面兩個函數分別可以畫一個三角形和五芒星:


void drawTriangle(Canvas canvas, Paint paint) {
  Path path = Path();
  path.moveTo(50, 50); // top vertex
  path.lineTo(100, 150); // bottom right vertex
  path.lineTo(0, 150); // bottom left vertex
  path.close(); // back to top vertex
  canvas.drawPath(path, paint);
}

void drawStar(Canvas canvas, Paint paint) {
  double radius = 50;
  double centerX = 100;
  double centerY = 100;

  Path path = Path();
  for (int i = 0; i < 5; i++) {
    double innerRadius = radius * (i % 2 == 0 ? 1 : 0.38);
    double angle = i * 2 * pi / 5 - pi / 2;
    path.lineTo(centerX + innerRadius * cos(angle), centerY + innerRadius * sin(angle));
  }
  path.close();
  canvas.drawPath(path, paint);
}

Path的邏輯應該不難懂,就是設定起點後再依序輸入每個點,最後一個點會跟起點形成一個頭尾相連的閉環線段,進一步形成任意形狀。(但結束的方式有點奇妙,close指令似乎不是必須的,但基本上建議使用一下。)

以前,沒有OpenGL這些函數以前,軟體工程師如果要做3D繪圖,多數時候都是在跟Path打交道。


但Path最大、最有「戰略價值」的用途還不是做多邊形繪圖,而是做「裁切」。


  Path trianglePath = Path();
  trianglePath.moveTo(50, 50); // top vertex
  trianglePath.lineTo(100, 150); // bottom right vertex
  trianglePath.lineTo(0, 150); // bottom left vertex
  trianglePath.close(); // back to top vertex

  // Clip the canvas to the triangle path
  canvas.clipPath(trianglePath);

這樣做就會將Canvas上Path外的部分切除。

將圖形做圓邊裁切的方式就是這樣。可以想像這使用量有多大嗎?


上一篇
多種碰撞條件設定...
下一篇
(週末) Canvas.clip的例子
系列文
用Flutter Flame做遊戲!Live!26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言