javascript - 在 Javascript 中绘制多条三 Angular 形线

标签 javascript canvas

我想用普通 JS 在 HTML Canvas 上绘制 3 条三 Angular 形。 我将 Canvas 分为 1/8*cw (canvas widht) 宽列和 1/8*ch (canvas hight) 高行。我知道 2/81/4 相同,但在我完成我的代码之前,我想保持这样。这就是为什么我用看到的数字计算的原因。我将图片分成三行三 Angular 形,每行中的三 Angular 形数量不断增加。为此,我选择了嵌套循环来解决整个问题。但由于某种原因,它不起作用,最后一个三 Angular 形不存在。

var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');

var cw = canvas.width;
var ch = canvas.height;
var k = 1;
var x = 5 / 8 * cw;
var y = -1 / 8 * ch;

for (var i = 0; i < 3; i++) {
  context.beginPath();
  context.moveTo(x -= 1 / 8 * cw, y += 2 / 8 * ch);
  for (var j = 0; j < k; j++) {
    context.moveTo(x += j * (2 / 8 * cw), y);
    context.lineTo(x - 1 / 8 * cw, y + 2 / 8 * ch);
    context.lineTo(x + 1 / 8 * cw, y + 2 / 8 * ch);
    context.closePath();
    if (y === 1 / 8 * ch) {
      context.fillStyle = 'rgb(255, 77, 77)';
    } else if (y === 3 / 8 * ch) {
      context.fillStyle = 'rgb(0, 179, 60)';
    } else {
      context.fillStyle = 'rgb(0, 153, 153)';
    }
    context.fill();
    console.log('i: ' + i + ' j: ' + j + ' k: ' + k);
  }
  k += 1;
}
<canvas id="myCanvas" height="300" width="450" style="border: 1px solid black"></canvas>

最佳答案

这段代码很难阅读,也很难调试。将像 x += ... 这样的改变值的方程放在参数中是不好的做法,您应该不惜一切代价避免它。这是您的代码失败的主要原因。

这是您的固定密码:https://jsfiddle.net/9oqmx3cL/你将不得不比较发生了什么变化。

我知道您没有要求进行代码审查,不过,您可能最好通读下面这段重写的代码并获取一些提示。当然,它只以一种颜色绘制。如果您将颜色作为参数传递给基于行变量为 0、1、2 的三 Angular 形函数,那么该任务添加起来非常简单,无需一些复杂的公式,如 if (y === 3/8 * ch ) {...} 做同样的事情。当您开始添加第 4、5 行时,公式逻辑变得更加困惑。

var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');

var cw = canvas.width;
var ch = canvas.height;


var maxRows = 3;

var width  = 1 / 8 * ch;
var height = 1 / 8 * ch;

var yPos = 0;

var halfTriangleWidth = width / 2;
var middleOfCanvasX   = cw / 2;

for (var row = 0; row < maxRows; row++) {
    var xPos = middleOfCanvasX - (row * halfTriangleWidth);
    for (var col = 0; col <= row; col++) {
       plotTriangle(context, xPos, yPos, width, height);
       xPos += width;
    }
    yPos += height;
}

function plotTriangle(context, x, y, w, h) {
  context.beginPath();
  context.fillStyle = 'rgb(0, 153, 153)';

  context.moveTo(x, y);
  context.lineTo(x + w / 2, y + h);
  context.lineTo(x - w / 2, y + h);
  context.closePath();  
  context.fill();
}

关于javascript - 在 Javascript 中绘制多条三 Angular 形线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57939364/

相关文章:

javascript - 向 Chart.js 添加水印/ Logo

javascript - 如何在不重新加载的情况下重新启动 Canvas

javascript - 如何更改 Canvas 文本的字体大小

javascript - 如何动态地用右 CSS 属性替换左 CSS 属性(在 .css 文件中设置)?

javascript - 在 Javascript 中播种随机数生成器

javascript - 当包含 JQuery 时,Python 抛出 KeyError

javascript - 使用 javascript/jquery 动态调整 Canvas 窗口的大小?

javascript - 通过数组中每个 JSON 对象中的值从 JSON 数组中删除重复项

javascript - 如何通过 Ajax 检索帖子 id?

html - 为 HTML5 Canvas 上的透明圆弧修改渐变的透明度