Javascript画布。修复了与转换无关的线宽

时间:2016-03-16 14:51:19

标签: javascript canvas html5-canvas

我试图在简单的(x,y)平面上绘制图形。

我正在使用canvas变换来转换我的坐标系。

我正在寻找一种方法来绘制线宽'作为固定的像素宽度,与x / y比例无关。

问题是当x / y很大时,沿x或y的线宽消失或变形,因为线宽相对于x和y比例缩放。

参见示例:

var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
var y_scale=10
ctx.transform(1, 0, 0, 1/y_scale, 0, 0);
ctx.lineWidth = 10;
ctx.strokeRect(20, 20, 80, 100*y_scale);

有没有办法固定宽度而不依赖于转换?

当然我可以做我自己的转换矩阵,但我宁愿不做。

2 个答案:

答案 0 :(得分:3)

同样的问题:html5 canvas prevent linewidth scaling

解决方案:

  1. 应用转化
  2. 定义路径
  3. 恢复转型
  4. 中风路径
  5. 代码:

    var y_scale=10;
    
    ctx.beginPath();
    ctx.save(); //save context
    ctx.transform(1, 0, 0, 1 / y_scale, 0, 0);
    ctx.rect(20, 20, 80, 100 * y_scale); // define rect
    ctx.restore(); //restore context 
    
    ctx.lineWidth = 10;
    ctx.stroke(); //stroke path
    

    参见示例:https://jsfiddle.net/aj3sn7yv/2/

答案 1 :(得分:0)

您可以扩展您的点序列,而不是缩放上下文 - 无需完整的矩阵解决方案。这样你只是改变了“路径”而不是渲染结果。

var scale = 10;
var newPoints = scalePoints(points, scale);  // scale or inverse: 1/scale

... plot new points here at the line-width you wish

// example function
function scalePoints(points, scale) {
    var newPoints = [];
    points.forEach(function(p) { newPoints.push(p * scale) });
    return newPoints
}

根据需要进行修改。