Я рисую много 1px линий на элементе HTML5 canvas в моем коде.Код чертежа выглядит примерно так: переменная transform
в этом случае задается с помощью d3-zoom .instructions.f32
- массив Float32Array, содержащий координаты, которые я использую для рисования линий.
context.setTransform(
transform.k,
0,
0,
transform.k,
transform.x,
transform.y
);
context.lineWidth = 1 / transform.k;
context.beginPath();
for (let i = from; i < to; ++i) {
let v1 = instructions.f32[i * 4 + 1];
let v2 = instructions.f32[i * 4 + 2];
// execute some moveTo/lineTo commands using v1 and v2 as coordinates
}
context.stroke();
Одна проблема с этим кодом заключается в том, что линии размером 1 пиксель размыты, потому что я рисую за границами пикселей.Я пытался адаптировать код для привязки линий к ближайшим пикселям, как показано ниже:
let v1 = (Math.round(instructions.f32[i * 4 + 1] * transform.k) + 0.5) / transform.k;
let v2 = (Math.round(instructions.f32[i * 4 + 2] * transform.k) + 0.5) / transform.k;
Но это все равно приводит к размытым линиям, как на следующем изображении (снимок экрана увеличенного изображения):
Если бы у меня не было никакого набора преобразований, насколько я понимаю, мне просто пришлось бы округлить координаты до ближайшего пикселя и добавить 0,5, чтобы получитьчеткие линии.Но я не уверен, как этого добиться, когда весь холст преобразуется, и я не рисую в окончательной системе координат.Поскольку мои попытки исправить это до сих пор не увенчались успехом, похоже, я что-то здесь упускаю или совершаю какую-то другую ошибку в пути.
Как рисовать четкие линии в 1 пиксель на холсте при преобразовании всего моегохолст с помощью setTransform?Как именно мне нужно округлить координаты, чтобы привязать результирующие строки к пикселям?