Как визуализировать красный цвет на половину пикселя?
Используя цвет фона и интерполяцию с цветом переднего плана на основе процентного соотношения, насколько передний план перекрывает фон.Теперь, когда вы пытаетесь «удалить» это, вы делаете то же самое с цветом фона.
Математически цвет пикселя такой:
var afterRender = interpolate(background, forground, percentage);
var afterDelete = interpolate(afterRender, background, percentage);
Давайте разберем несколько чисел: (быстрый и грязный пример)
const update = () => {
var bgColor = +bg.value.replace(/^#?/, "0x");
bg.style.backgroundColor = toColor(bgColor);
var fgColor = +fg.value.replace(/^#?/, "0x");
fg.style.backgroundColor = toColor(fgColor);
var percentage = overlap.value / 100;
var afterRenderColor = interpolate(bgColor, fgColor, percentage);
afterRender.textContent = afterRender.style.background = toColor(afterRenderColor);
// now trying to erase this by overwriting with the background-color
var afterDeleteColor = interpolate(afterRenderColor, bgColor, percentage);
afterDelete.textContent = afterDelete.style.background = toColor(afterDeleteColor);
}
const toColor = v => "#" + v.toString(16).padStart(6, 0).toUpperCase();
const interpolate = (a, b, t) => ((a&0xFF0000) * (1-t) + (b&0xFF0000) * t) & 0xFF0000
| ((a&0x00FF00) * (1-t) + (b&0x00FF00) * t) & 0x00FF00
| ((a&0x0000FF) * (1-t) + (b&0x0000FF) * t) & 0x0000FF;
[bg, fg, overlap].forEach(input => input.onchange = input.oninput = update);
update();
#bg,
#fg,
#afterRender,
#afterDelete {
border: 1px solid black;
padding: 20px;
}
<label>Background: <input id="bg" type="text" pattern="/#?[0-9a-f]{6}/" value="#FFFFFF"/></label>
<br>
<label>Foreground: <input id="fg" type="text" pattern="/#?[0-9a-f]{6}/" value="#FF0000"/></label>
<br>
<label>"half a pixel" of overlap: <input id="overlap" type="range" min="0" max="100" value="50"></label>
more or less ;)
<br>
<br>
Color after rendering "half a pixel" of the foreground over the background:
<div id="afterRender"></div>
<br>
Color after trying to erase that by rendering "half a pixel" of the background-color over that:
<div id="afterDelete"></div>