亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在畫布中繪制線箭頭而不旋轉

在畫布中繪制線箭頭而不旋轉

泛舟湖上清波郎朗 2023-10-10 16:36:05
在 html 畫布中繪制箭頭的大多數代碼都涉及旋轉畫布上下文并繪制線條。我的用例是使用三角學繪制它們而不旋轉畫布。或者你稱之為矢量算法?感謝幫助。這就是我所擁有的(忘記了大部分代碼是從哪里得到的)。根據最后兩個布爾參數 arrowStart 和 arrowEnd 在開始和結束處繪制 2 個箭頭。drawLineArrowhead: function(context, arrowStart, arrowEnd) {        // Place start end points here.        var x1 = 0;        var y1 = 0;        var x2 = 0;        var y2 = 0;        var distanceFromLine = 6;        var arrowLength = 9;        var dx = x2 - x1;        var dy = y2 - y1;        var angle = Math.atan2(dy, dx);        var length = Math.sqrt(dx * dx + dy * dy);        context.translate(x1, y1);        context.rotate(angle);        context.beginPath();        context.moveTo(0, 0);        context.lineTo(length, 0);        if (arrowStart) {            context.moveTo(arrowLength, -distanceFromLine);            context.lineTo(0, 0);            context.lineTo(arrowLength, distanceFromLine);        }        if (arrowEnd) {            context.moveTo(length - arrowLength, -distanceFromLine);            context.lineTo(length, 0);            context.lineTo(length - arrowLength, distanceFromLine);        }        context.stroke();        context.setTransform(1, 0, 0, 1, 0, 0);    },
查看完整描述

1 回答

?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

請參閱下面的代碼,只是一些三角學知識。


canvas = document.getElementById("canvas");

ctx = canvas.getContext("2d");

ctx.lineCap = "round";

ctx.lineWidth = 5;


function drawLineArrowhead(p1, p2, startSize, endSize) {

  ctx.beginPath()

  ctx.moveTo(p1.x, p1.y);

  ctx.lineTo(p2.x, p2.y);

  

  if (startSize > 0) {

    lineAngle = Math.atan2(p2.y - p1.y, p2.x - p1.x);

    delta = Math.PI/6  

    for (i=0; i<2; i++) {

      ctx.moveTo(p1.x, p1.y);

      x = p1.x + startSize * Math.cos(lineAngle + delta)

      y = p1.y + startSize * Math.sin(lineAngle + delta)

      ctx.lineTo(x, y);

      delta *= -1

    }

  }

  if (endSize > 0) {

    lineAngle = Math.atan2(p1.y - p2.y, p1.x - p2.x);

    delta = Math.PI/6  

    for (i=0; i<2; i++) {

      ctx.moveTo(p2.x, p2.y);

      x = p2.x + endSize * Math.cos(lineAngle + delta)

      y = p2.y + endSize * Math.sin(lineAngle + delta)

      ctx.lineTo(x, y);

      delta *= -1

    }

  }

  ctx.stroke();

}


drawLineArrowhead({x:10, y:10}, {x:100, y:20}, 0, 30)

drawLineArrowhead({x:20, y:25}, {x:140, y:120}, 20, 20)

drawLineArrowhead({x:140, y:20}, {x:80, y:50} , 20, 0)


drawLineArrowhead({x:150, y:20}, {x:150, y:90}, 20, 5)

drawLineArrowhead({x:180, y:90}, {x:180, y:20}, 20, 5)


drawLineArrowhead({x:200, y:10}, {x:200, y:140}, 10, 10)

drawLineArrowhead({x:220, y:140}, {x:220, y:10}, 10, 20)

<canvas id="canvas">

如果運行它,您應該會看到一些示例。
drawLineArrowhead4 個參數,(p1, p2, startSize, endSize) 前兩個是線條的起點和終點,最后兩個是箭頭大小,只是為了讓最終用戶控制末端的箭頭有多大,如果我們想要的話刪除它們我們設置為0。

查看完整回答
反對 回復 2023-10-10
  • 1 回答
  • 0 關注
  • 109 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號