context.Scale() with non-aspect ratio preserving parameters screws effective lineWith
- by rrenaud
I am trying to apply some natural transformations whereby the x axis is remapped to some very small domain, like from 0 to 1, whereas y is remapped to some small, but substantially larger domain, like 0 to 30. This way, drawing code can be nice and clean and only care about the model space. However, if I apply a scale, then lines are also scaled, which means that horizontal lines become extremely fat relative to vertical ones. Here is some sample code. When natural_height is much less than natural_height, the picture doesn't look as intended.
I want the picture to look like this, which is what happens with a scale that preserves aspect ratio. rftgstats.c om/canvas_good.png
However, with a non-aspect ratio preserving scale, the results look like this. rftgstats.c om/canvas_bad.png
<html><head><title>Busted example</title></head>
<body>
<canvas id=example height=300 width=300>
<script>
var canvas = document.getElementById('example');
var ctx = canvas.getContext('2d');
var natural_width = 10;
var natural_height = 50;
ctx.scale(canvas.width / natural_width, canvas.height / natural_height);
var numLines = 20;
ctx.beginPath();
for (var i = 0; i < numLines; ++i) {
ctx.moveTo(natural_width / 2, natural_height / 2);
var angle = 2 * Math.PI * i / numLines;
// yay for screen size independent draw calls.
ctx.lineTo(natural_width / 2 + natural_width * Math.cos(angle),
natural_height / 2 + natural_height * Math.sin(angle));
}
ctx.stroke();
ctx.closePath();
</script>
</body>
</html>