创建两端带有圆圈的动态线条,线条的宽度、高度和旋转参数-javascript

g52tjvyc  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(200)

我需要帮助创建一个函数来创建x数量的线条,线条两端都有圆圈,使用参数来定义线条的旋转Angular 、宽度、高度和颜色,并填充线条之间的空间,其特点是使手臂和肩膀的旋转Angular 达到最大和最小。
这是我需要做的一个示例图像,人物模型的图像在png中很好,我只需要创建动态线。

这是我目前掌握的代码:

function drawLine(deg,width,height,canvasId,color){
  const canvas = document.getElementById(canvasId);
const ctx = canvas.getContext('2d');

ctx.rotate(deg);
ctx.fillStyle = color;
ctx.fillRect(0, 0, width, height);
ctx.setTransform(1, 0, 0, 1, 0, 0);
}
drawLine(0,200,3,'canvas','red')
drawLine(120,200,3,'canvas1','blue')
canvas{
  position: absolute;
}
<canvas id="canvas"></canvas>
<canvas id="canvas1"></canvas>

非常感谢

lmvvr0a8

lmvvr0a81#

根据这张图片,我假设180度是0的参考点。从那里出来的任何东西都是我们开始计算度的地方。如果是这种情况,您需要运行一个函数,计算180度的实线与该点的其他两条线之间的Angular 。
你总共需要四分。从所有参照的起点(本例中为点B)开始,将使用另一个点(点D)将Angular 参照设置为0度。我们将从这条线测量接下来的两个Angular 。
pointa和pointc可以根据需要进行调整,然后我们计算pointd/pointb向量的Angular 。我们可以使用 Math.atan2 要计算ba和bc的Angular ,请从bd移开。

let angle1 = Math.atan2(distBC_x * distBD_y - distBC_y * distBD_x, distBC_x * distBD_x + distBC_y * distBD_y);

在这段代码中,我更改了行的颜色,以便更容易看到是什么。你也不需要画红线。这是静态的,因此需要创建限制和动态方法来更改Angular 。
更改pointa和pointc的x值以更改最小值和最大值。请记住,我必须为您设置限制才能切换它们。

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
canvas.width = 500;
canvas.height = 500;
//change pointA and pointC x value. 
//pointA sould be your Min
//PointC should be your Max
let pointA = {x: 200, y: 250};
let pointB = {x: 250, y: 100}; //common point
let pointC = {x: 120, y: 250};
//only used to set reference to 0 at 180 degrees
let pointD = {x: pointB.x, y: pointB.y + 150};

//creating our vectors length
let distBA_x = pointB.x - pointA.x;
let distBA_y = pointB.y - pointA.y;

let distBC_x = pointB.x - pointC.x;
let distBC_y = pointB.y - pointC.y;

let distBD_x = pointB.x - pointD.x;
let distBD_y = pointB.y - pointD.y;

//calculate angle between pink and purple
let angle1 = Math.atan2(distBC_x * distBD_y - distBC_y * distBD_x, distBC_x * distBD_x + distBC_y * distBD_y);
if(angle1 < 0) {angle1 = angle1 * -1;}
let degree_angle1 = angle1 * (180 / Math.PI);

//calculate angle between purple and red
let angle2 = Math.atan2(distBA_x * distBD_y - distBA_y * distBD_x, distBA_x * distBD_x + distBA_y * distBD_y);
if(angle2 < 0) {angle2 = angle2 * -1;}
let degree_angle2 = angle2 * (180 / Math.PI);

function draw() {
  ctx.textStyle = 'black';
  ctx.font = '20px Arial';
  ctx.fillText('Max = '+ degree_angle1, 100, 20);
  ctx.fillText('Min = '+ degree_angle2, 100, 50);

  //Lines
  ctx.strokeStyle = 'purple';
  ctx.lineWidth = 3;
  ctx.beginPath();
  ctx.moveTo(pointA.x, pointA.y); 
  ctx.lineTo(pointB.x, pointB.y);
  ctx.stroke();

  ctx.strokeStyle = 'red';
  ctx.beginPath();
  ctx.moveTo(pointB.x, pointB.y); 
  ctx.lineTo(pointC.x, pointC.y);
  ctx.stroke();

  ctx.strokeStyle = 'pink';
  ctx.beginPath();
  ctx.moveTo(pointB.x, pointB.y); 
  ctx.lineTo(pointD.x, pointD.y);
  ctx.stroke();

  //Points
  ctx.fillStyle = 'purple';
  ctx.beginPath();
  ctx.arc(pointB.x, pointB.y, 5, 0, Math.PI*2);
  ctx.fill();
  ctx.closePath();

  ctx.beginPath();
  ctx.arc(pointA.x, pointA.y, 5, 0, Math.PI*2);
  ctx.fill();
  ctx.closePath();

  ctx.beginPath();
  ctx.arc(pointC.x, pointC.y, 5, 0, Math.PI*2);
  ctx.fill();
  ctx.closePath();

  //Fill
  ctx.fillStyle = 'rgba(113, 0, 158, 0.3)'
  ctx.beginPath();
  ctx.moveTo(pointA.x, pointA.y);
  ctx.lineTo(pointB.x, pointB.y);
  ctx.lineTo(pointC.x, pointC.y);
  ctx.fill();
  ctx.closePath();

}
draw()
<canvas id='canvas'></canvas>

相关问题