ÐомпозиÑÐ¸Ñ Ð¸ обÑезка
Ðо вÑеÑ
наÑиÑ
пÑедÑдÑÑиÑ
пÑимеÑаÑ
, ÑигÑÑÑ Ð²Ñегда бÑли наÑиÑÐ¾Ð²Ð°Ð½Ñ Ð¾Ð´Ð½Ð° повеÑÑ
дÑÑгой. ÐÑо более Ñем доÑÑаÑоÑно Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑинÑÑва ÑиÑÑаÑий, но ÑÑо огÑаниÑÐ¸Ð²Ð°ÐµÑ Ð¿Ð¾ÑÑдок, в коÑоÑом поÑÑÑÐ¾ÐµÐ½Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð·Ð¸ÑионнÑе ÑоÑмÑ. Ðднако, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ измениÑÑ ÑÑо поведение, ÑÑÑановив ÑвойÑÑво globalCompositeOperation. ÐÑоме Ñого, ÑвойÑÑва clip позволÑÐµÑ ÑкÑÑÑÑ Ð½ÐµÐ¶ÐµÐ»Ð°ÑелÑнÑе ÑаÑÑи ÑоÑмÑ.
globalCompositeOperation
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ не ÑолÑко ÑиÑоваÑÑ Ð½Ð¾Ð²Ñе ÑигÑÑÑ Ð·Ð° ÑÑÑеÑÑвÑÑÑие ÑоÑмÑ, но Ð¼Ñ Ñакже можем иÑполÑзоваÑÑ ÐµÐ³Ð¾, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð¼Ð°ÑкиÑоваÑÑ Ð¾Ð¿ÑеделÑннÑе ÑÑаÑÑки, оÑиÑÑиÑÑ ÑÐ°Ð·Ð´ÐµÐ»Ñ Ð¾Ñ Ñ
олÑÑа (не огÑаниÑиваеÑÑÑ Ð¿ÑÑмоÑголÑниками, какclearRect() method does) и дÑÑгое.
globalCompositeOperation = type-
ÐÑо задаÑÑ Ð¢Ð¸Ð¿ опеÑаÑии композиÑии Ð´Ð»Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñи ÑазÑабоÑке новÑÑ ÑоÑм, где Тип ÑвлÑеÑÑÑ ÑÑÑокой, иденÑиÑиÑиÑÑÑÑей, какие из двенадÑаÑи опеÑаÑий композиÑинг в иÑполÑзовании.
См. пÑимеÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½Ð¾Ð²ÐºÐ¸ кода из ÑледÑÑÑÐ¸Ñ Ð¿ÑимеÑов.
ÐбÑезка конÑÑÑов
ÐÑÑеÑÑннÑй конÑÑÑ Ð¿Ð¾Ñ
ож на обÑÑнÑÑ ÑоÑÐ¼Ñ Ñ
олÑÑа, но он дейÑÑвÑÐµÑ ÐºÐ°Ðº маÑка, ÑÑÐ¾Ð±Ñ ÑкÑÑÑÑ Ð½ÐµÐ¶ÐµÐ»Ð°ÑелÑнÑе ÑаÑÑи ÑигÑÑ. ÐÑо визÑализиÑÑеÑÑÑ Ð½Ð° изобÑажении ÑпÑава. ФоÑма кÑаÑной Ð·Ð²ÐµÐ·Ð´Ñ - наÑа оÑпÑавоÑÐ½Ð°Ñ Ð´Ð¾Ñожка. ÐÑе, ÑÑо вÑÑ
Ð¾Ð´Ð¸Ñ Ð·Ð° пÑÐµÐ´ÐµÐ»Ñ ÑÑого пÑÑи, не бÑÐ´ÐµÑ Ð½Ð°ÑиÑовано на Ñ
олÑÑе.
ÐÑли Ð¼Ñ ÑÑавниваем оÑÑеÑÑннÑй конÑÑÑ Ñо ÑвойÑÑвом globalCompositeOperation на изобÑажении, Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼ два Ñежима композиÑинга, коÑоÑÑе доÑÑигаÑÑ Ð±Ð¾Ð»ÐµÐµ или менее Ñого же ÑÑÑекÑа в иÑÑ
одном и иÑÑ
одном ÑоÑÑоÑнии. Ðаиболее важнÑе ÑазлиÑÐ¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸ заклÑÑаÑÑÑÑ Ð² Ñом, ÑÑо оÑÑеÑение конÑÑÑа ÑакÑиÑеÑки никогда не обÑаÑаеÑÑÑ Ðº Ñ
олÑÑÑ Ð¸ конÑÑÑ Ð¾Ð±Ñезки никогда не влиÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ новÑÑ
ÑоÑм. ÐÑо Ð´ÐµÐ»Ð°ÐµÑ Ð¾Ð±ÑÐµÐ·ÐºÑ ÐºÐ¾Ð½ÑÑÑа идеалÑнÑм Ð´Ð»Ñ ÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÑколÑкиÑ
ÑигÑÑ Ð² огÑаниÑенной облаÑÑи.
Рглаве о ÑиÑовании ÑоÑм, Ñ Ð½Ð°Ð·Ð²Ð°Ð» ÑолÑко stroke() и fill() меÑодÑ, но еÑÑÑ ÑÑеÑий ÑпоÑоб можно иÑполÑзоваÑÑ Ñ ÐºÐ¾Ð½ÑÑÑами, Ñак назÑваемÑй clip().
clip()-
ÐÑеобÑазÑÐµÑ ÑекÑÑий вÑÑÑÑаиваемÑй конÑÑÑ Ð² оÑÑеÑÑннÑй конÑÑÑ.
ÐÑполÑзÑйÑе clip() вмеÑÑо closePath() Ð´Ð»Ñ Ð·Ð°ÐºÑÑÑÐ¸Ñ ÐºÐ¾Ð½ÑÑÑа и его пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² оÑÑеÑÑннÑй конÑÑÑ Ð²Ð¼ÐµÑÑо ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÑÑÑего или обÑамлÑÑÑего конÑÑÑа.
Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÐ»ÐµÐ¼ÐµÐ½Ñ <canvas> иÑполÑзÑÐµÑ Ð¾ÑÑеÑÑннÑй конÑÑÑ, коÑоÑÑй в ÑоÑноÑÑи ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ð¿Ð¾ ÑазмеÑÑ Ñ ÑазмеÑом Ñамого Ñ
олÑÑа. ÐÑо ознаÑаеÑ, ÑÑо никакого оÑÑеÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¿ÑоÑÑÑ Ð½Ðµ пÑоизойдÑÑ.
ÐÑÐ¸Ð¼ÐµÑ Ð¾Ð±Ñезки
Ð ÑÑом пÑимеÑе Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ ÐºÑÑговÑÑ Ð¾Ð±ÑÐµÐ·ÐºÑ ÐºÐ¾Ð½ÑÑÑа, ÑÑÐ¾Ð±Ñ Ð¾Ð³ÑаниÑиÑÑ ÑиÑование набоÑа ÑлÑÑайнÑÑ Ð·Ð²Ñзд опÑеделÑнной облаÑÑÑÑ.
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
ctx.fillRect(0, 0, 150, 150);
ctx.translate(75, 75);
// Create a circular clipping path
ctx.beginPath();
ctx.arc(0, 0, 60, 0, Math.PI * 2, true);
ctx.clip();
// draw background
var lingrad = ctx.createLinearGradient(0, -75, 0, 75);
lingrad.addColorStop(0, "#232256");
lingrad.addColorStop(1, "#143778");
ctx.fillStyle = lingrad;
ctx.fillRect(-75, -75, 150, 150);
// draw stars
for (var j = 1; j < 50; j++) {
ctx.save();
ctx.fillStyle = "#fff";
ctx.translate(
75 - Math.floor(Math.random() * 150),
75 - Math.floor(Math.random() * 150),
);
drawStar(ctx, Math.floor(Math.random() * 4) + 2);
ctx.restore();
}
}
function drawStar(ctx, r) {
ctx.save();
ctx.beginPath();
ctx.moveTo(r, 0);
for (var i = 0; i < 9; i++) {
ctx.rotate(Math.PI / 5);
if (i % 2 === 0) {
ctx.lineTo((r / 0.525731) * 0.200811, 0);
} else {
ctx.lineTo(r, 0);
}
}
ctx.closePath();
ctx.fill();
ctx.restore();
}
РпеÑвÑÑ
неÑколÑкиÑ
ÑÑÑокаÑ
кода Ð¼Ñ ÑиÑÑем ÑÑÑнÑй пÑÑмоÑголÑник ÑазмеÑом Ñ Ñ
олÑÑом в каÑеÑÑве Ñона, а заÑем пеÑеводим наÑало кооÑÐ´Ð¸Ð½Ð°Ñ Ð² ÑенÑÑ. ÐаÑем Ð¼Ñ ÑоздаÑм кÑÑговой обÑÑавоÑнÑй конÑÑÑ, ÑиÑÑÑ Ð´ÑÐ³Ñ Ð¸ вÑзÑваÑÑий clip(). ÐбÑезаннÑе конÑÑÑÑ Ñакже ÑвлÑÑÑÑÑ ÑаÑÑÑÑ ÑоÑÑоÑÐ½Ð¸Ñ ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ñ
олÑÑа. ÐÑли Ð±Ñ Ð¼Ñ Ñ
оÑели ÑоÑ
ÑаниÑÑ Ð¸ÑÑ
однÑй обÑÑавоÑнÑй конÑÑÑ, Ð¼Ñ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ ÑоÑ
ÑаниÑÑ ÑоÑÑоÑние Ñ
олÑÑа пеÑед Ñозданием нового.
ÐÑе, ÑÑо наÑиÑовано поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾ÑÑеÑÑнного конÑÑÑа, поÑвиÑÑÑ ÑолÑко внÑÑÑи ÑÑого пÑÑи. ÐÑ Ð¼Ð¾Ð¶ÐµÑе видеÑÑ ÑÑо ÑÑÑко в линейном гÑадиенÑе, коÑоÑÑй наÑиÑован далее. ÐоÑле ÑÑого набиÑаеÑÑÑ Ð½Ð°Ð±Ð¾Ñ Ð¸Ð· 50 ÑлÑÑайно ÑаÑположеннÑÑ
и маÑÑÑабиÑованнÑÑ
звÑзд, иÑполÑзÑÑ drawStar(). Снова Ð·Ð²ÐµÐ·Ð´Ñ Ð¿Ð¾ÑвлÑÑÑÑÑ ÑолÑко в пÑеделаÑ
опÑеделÑнного обÑÑавоÑного конÑÑÑа.