Transformations
Ранее в ÑÑом ÑÑоке Ð¼Ñ Ñзнали о ÑеÑке Ñ Ð¾Ð»ÑÑа и кооÑдинаÑном пÑоÑÑÑанÑÑве. Ðо ÑÐ¸Ñ Ð¿Ð¾Ñ Ð¼Ñ Ð¸ÑполÑзовали ÑолÑко ÑеÑÐºÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ изменили ÑÐ°Ð·Ð¼ÐµÑ Ð²Ñего Ñ Ð¾Ð»ÑÑа Ð´Ð»Ñ Ð½Ð°ÑÐ¸Ñ Ð½Ñжд. ÐÑи пÑеобÑазованиÑÑ ÑÑÑеÑÑвÑÑÑ Ð±Ð¾Ð»ÐµÐµ моÑнÑе ÑпоÑÐ¾Ð±Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ÑÑ Ð¾Ð´Ð½ÑÑ ÐºÐ¾Ð¾ÑÐ´Ð¸Ð½Ð°Ñ Ð² ÑазлиÑнÑе положение, повоÑÐ¾Ñ ÑеÑки и даже маÑÑÑабиÑование.
Ð¡Ð¾Ñ Ñанение и воÑÑÑановление ÑоÑÑоÑниÑ
ÐÑежде Ñем пеÑейÑи к меÑодам пÑеобÑазованиÑ, давайÑе ÑаÑÑмоÑÑим два дÑÑÐ³Ð¸Ñ Ð¼ÐµÑода, коÑоÑÑе Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñ, когда Ð²Ñ Ð½Ð°ÑинаеÑе ÑоздаваÑÑ Ð²Ñе более ÑложнÑе ÑиÑÑнки.
save()-
Ð¡Ð¾Ñ ÑанÑÐµÑ Ð²Ñе ÑоÑÑоÑние Ñ Ð¾Ð»ÑÑа.
restore()-
ÐоÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ñледнее ÑÐ¾Ñ ÑанÑнное ÑоÑÑоÑние Ñ Ð¾Ð»ÑÑа.
СоÑÑоÑние Ñ
олÑÑа ÑоÑ
ÑанÑеÑÑÑ Ð² ÑÑеке. ÐаждÑй Ñаз, когда вÑзÑваеÑÑÑ Ð¼ÐµÑод save(), ÑекÑÑее ÑоÑÑоÑние оÑÑиÑовки запиÑÑваеÑÑÑ Ð² ÑÑек. СоÑÑоÑние оÑÑиÑовки ÑодеÑжиÑ:
- ТÑанÑÑоÑмаÑии, коÑоÑÑе бÑли пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ñ (напÑимеÑ,
translate,rotateandscaleâ Ñм. ниже). - ТекÑÑее знаÑение ÑледÑÑÑиÑ
аÑÑибÑÑов:
strokeStyle,fillStyle,globalAlpha,lineWidth,lineCap,lineJoin,miterLimit,lineDashOffset,shadowOffsetX,shadowOffsetY,shadowBlur,shadowColor,globalCompositeOperation,font,textAlign,textBaseline,direction,imageSmoothingEnabled. - ТекÑÑее знаÑение гÑÐ°Ð½Ð¸Ñ Ð²ÑÑезанного Ñ Ð¾Ð»ÑÑа (clipping path), коÑоÑÑе бÑдÑÑ ÑаÑÑмаÑÑиваÑÑÑÑ Ð² ÑледÑÑÑем Ñазделе.
ÐÑ Ð¼Ð¾Ð¶ÐµÑе вÑзÑваÑÑ Ð¼ÐµÑод save() ÑÑолÑко Ñаз, ÑколÑко заÑ
оÑиÑе. Ð Ñо же вÑемÑ, пÑи вÑзове меÑода restore() поÑледнее ÑоÑ
ÑанÑнное ÑоÑÑоÑние бÑÐ´ÐµÑ ÑÑиÑано из ÑÑека, и вÑе ÑоÑ
ÑанÑннÑе наÑÑÑойки бÑдÑÑ Ð²Ð¾ÑÑÑановленÑ.
ÐÑÐ¸Ð¼ÐµÑ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸ воÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑоÑÑоÑÐ½Ð¸Ñ Ñ Ð¾Ð»ÑÑа
ÐдеÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾, как ÑÑнкÑиониÑÑÐµÑ ÑÐ¾Ñ Ñанение в ÑÑек ÑоÑÑоÑÐ½Ð¸Ñ Ð¾ÑÑиÑовки на пÑимеÑе поÑледоваÑелÑной оÑÑиÑовки набоÑа пÑÑмоÑголÑников.
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
ctx.fillRect(0, 0, 150, 150); // ÑиÑÑем пÑÑмоÑголÑник Ñ Ð½Ð°ÑÑÑойками по ÑмолÑаниÑ
ctx.save(); // ÑоÑ
ÑанÑем ÑоÑÑоÑние
ctx.fillStyle = "#09F"; // вноÑим Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² наÑÑÑойки
ctx.fillRect(15, 15, 120, 120); // ÑиÑÑем пÑÑмоÑголÑник Ñ Ð½Ð¾Ð²Ñми наÑÑÑойками
ctx.save(); // ÑоÑ
ÑанÑем ÑоÑÑоÑние
ctx.fillStyle = "#FFF"; // вноÑим Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² наÑÑÑойки
ctx.globalAlpha = 0.5;
ctx.fillRect(30, 30, 90, 90); // ÑиÑÑем пÑÑмоÑголÑник Ñ Ð½Ð¾Ð²Ñми наÑÑÑойками
ctx.restore(); // возвÑаÑаемÑÑ Ðº пÑедÑдÑÑим наÑÑÑойкам
ctx.fillRect(45, 45, 60, 60); // ÑиÑÑем пÑÑмоÑголÑник Ñ Ð²Ð¾ÑÑÑановленнÑми наÑÑÑойками
ctx.restore(); // возвÑаÑаемÑÑ Ðº наÑалÑнÑм наÑÑÑойкам
ctx.fillRect(60, 60, 30, 30); // ÑиÑÑем пÑÑмоÑголÑник Ñ Ð¸Ð·Ð½Ð°ÑалÑнÑми наÑÑÑойками
}
СнаÑала ÑиÑÑеÑÑÑ Ð±Ð¾Ð»ÑÑой пÑÑмоÑголÑник Ñ Ð½Ð°ÑÑÑойками по ÑмолÑаниÑ. ÐаÑем Ð¼Ñ ÑÐ¾Ñ ÑанÑем ÑоÑÑоÑние Ñ Ð¾Ð»ÑÑа, поÑле Ñего изменÑем ÑÐ²ÐµÑ Ð·Ð°Ð»Ð¸Ð²ÐºÐ¸. ÐаÑем ÑиÑÑем вÑоÑой Ñиний пÑÑмоÑголÑник менÑÑего ÑазмеÑа и опÑÑÑ ÑÐ¾Ñ ÑанÑем ÑоÑÑоÑние. Снова изменÑем какие-Ñо наÑÑÑойки и ÑиÑÑем ÑÑеÑий полÑпÑозÑаÑнÑй белÑй пÑÑмоÑголÑник.
Ðо ÑиÑ
Ð¿Ð¾Ñ Ð½Ð°Ñи дейÑÑÐ²Ð¸Ñ Ð½Ð¸Ñем не оÑлиÑалиÑÑ Ð¾Ñ ÑеÑ
, ÑÑо Ð¼Ñ Ð´ÐµÐ»Ð°Ð»Ð¸ в пÑедÑдÑÑем Ñазделе. Ðднако, как ÑолÑко Ð¼Ñ Ñделали пеÑвÑй вÑзов restore(), поÑледнее ÑоÑ
ÑанÑнное ÑоÑÑоÑние оÑÑиÑовки бÑло воÑÑÑановлено из ÑÑека, веÑнÑв вÑе ÑоÑ
ÑанÑннÑе наÑÑÑойки. ÐÑли Ð±Ñ Ð¼Ñ Ð½Ðµ ÑоÑ
Ñанили пÑедÑдÑÑее ÑоÑÑоÑние, иÑполÑзÑÑ save(), нам Ð±Ñ Ð¿ÑиÑлоÑÑ Ð¼ÐµÐ½ÑÑÑ ÑÐ²ÐµÑ Ð·Ð°Ð»Ð¸Ð²ÐºÐ¸ и наÑÑÑойки пÑозÑаÑноÑÑи вÑÑÑнÑÑ Ð´Ð»Ñ Ð²Ð¾Ð·Ð²ÑаÑа к пÑедÑдÑÑÐµÐ¼Ñ ÑоÑÑоÑниÑ. ÐÐ»Ñ ÐºÐ°ÐºÐ¸Ñ
-нибÑÐ´Ñ Ð´Ð²ÑÑ
пÑоÑÑÑÑ
ÑвойÑÑв ÑÑо, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ, ÑделаÑÑ Ð½Ðµ Ñак Ñложно. Ðо еÑли ÑакиÑ
ÑвойÑÑв гоÑаздо болÑÑе, ÑÑо ÑÑеваÑо оÑÐµÐ½Ñ Ð±ÑÑÑÑÑм ÑазÑаÑÑанием кода.
Ðогда вÑоÑой вÑзов restore() Ñделан, изнаÑалÑное ÑоÑÑоÑние (Ñо Ñамое, коÑоÑое бÑло Ñделано пеÑед пеÑвÑм вÑзовом save) воÑÑÑанавливаеÑÑÑ Ð¸ поÑледний наÑиÑованнÑй пÑÑмоÑголÑник Ð²Ð½Ð¾Ð²Ñ ÑÑановиÑÑÑ ÑÑÑнÑм.
ТÑанÑлÑÑÐ¸Ñ (ÑмеÑение)
ÐеÑвÑй меÑод Ð´Ð»Ñ ÑÑанÑÑоÑмиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñ
олÑÑа translate(). Ðн иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÐµÑемеÑÐµÐ½Ð¸Ñ Ñ
олÑÑа в лÑбÑÑ ÑоÑÐºÑ Ð½Ð°Ñей ÑеÑки.
translate(x, y)-
ÐеÑемеÑение Ñ Ð¾Ð»ÑÑа на ÑеÑке.
xиy- ÑмеÑение по гоÑизонÑали и веÑÑикали ÑооÑвеÑÑÑвенно.
ÐеплоÑ
Ð°Ñ Ð¸Ð´ÐµÑ - ÑоÑ
ÑанÑÑÑ canvas state пеÑед иÑполÑзованием лÑбÑÑ
ÑÑанÑÑоÑмаÑий. ÐбÑÑно Ñдобнее иÑполÑзоваÑÑ Ð¼ÐµÑод restore, Ñем вÑполнÑÑÑ Ð¾Ð±ÑаÑнÑе пÑеобÑазованиÑ, ÑÑÐ¾Ð±Ñ Ð²ÐµÑнÑÑÑÑÑ Ðº наÑалÑÐ½Ð¾Ð¼Ñ ÑоÑÑоÑниÑ. ÐÑоме Ñого, еÑли Ð²Ñ Ð²ÑполнÑеÑе пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð½ÑÑÑи Ñикла не иÑполÑзÑÑ save и restore, Ð²Ñ ÑиÑкÑеÑе поÑеÑÑÑÑ ÑаÑÑÑ ÑиÑÑнка, поÑÐ¾Ð¼Ñ ÑÑо он бÑл наÑиÑован за пÑеделами кÑÐ°Ñ Ñ
олÑÑа.
ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ translate
ÐÑÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑиÑÑÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑе пÑеимÑÑеÑÑва пÑи иÑполÑзовании ÑмеÑÐµÐ½Ð¸Ñ Ñ
олÑÑа. Ðез иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÑода translate() вÑе пÑÑмоÑголÑники бÑдÑÑ Ð¾ÑÑиÑÐ¾Ð²Ð°Ð½Ñ Ð² одинаковой позиÑии (0,0). ÐеÑод translate() даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑазмеÑÐµÐ½Ð¸Ñ Ð¿ÑÑмоÑголÑника в лÑбой позиÑии без Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов ÑÑнкÑии fillRect(). ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð´Ð°ÑÑ Ð½ÐµÐºÐ¾ÑоÑое ÑпÑоÑение Ð´Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð¸ иÑполÑзованиÑ.
ÐнÑÑÑи ÑÑнкÑии draw() Ð¼Ñ Ð²ÑзÑваем fillRect() девÑÑÑ Ñаз, иÑполÑзÑÑ Ð´Ð²Ð° Ñикла for. ÐаждÑй Ñаз Ð¼Ñ ÑоÑ
ÑанÑем ÑоÑÑоÑние Ñ
олÑÑа, ÑмеÑаем его, ÑиÑÑем пÑÑмоÑголÑник, а заÑем воÑÑÑанавливаем иÑÑ
одное ÑоÑÑоÑние. ÐамеÑÑÑе, ÑÑо fillRect() вÑегда иÑполÑзÑÐµÑ Ð¾Ð´Ð½Ð¸ и Ñе же паÑамеÑÑÑ, а изменение позиÑии ÑигÑÑÑ Ð¾ÑÑÑеÑÑвлÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ translate().
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
ctx.save();
ctx.fillStyle = "rgb(" + 51 * i + ", " + (255 - 51 * i) + ", 255)";
ctx.translate(10 + j * 50, 10 + i * 50);
ctx.fillRect(0, 0, 25, 25);
ctx.restore();
}
}
}
ÐовоÑоÑ
ÐÑоÑой меÑод ÑÑанÑÑоÑмаÑии rotate(). Ðн иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ð¾ÑоÑа наÑего Ñ
олÑÑа.
rotate(angle)-
ÐовоÑаÑÐ¸Ð²Ð°ÐµÑ Ð½Ð°Ñ Ñ Ð¾Ð»ÑÑ Ð¿Ð¾ ÑаÑовой ÑÑÑелке вокÑÑг наÑалÑной ÑоÑки на Ñгол
anglев ÑÐ°Ð´Ð¸Ð°Ð½Ð°Ñ .
ЦенÑÑ Ð¿Ð¾Ð²Ð¾ÑоÑа - вÑегда наÑало кооÑдинаÑ. ÐÐ»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¾ÑÐ´Ð¸Ð½Ð°Ñ ÑенÑÑа Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑмеÑÑиÑÑ Ñ
олÑÑ, иÑполÑзÑÑ Ð¼ÐµÑод translate().
ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ rotate
Ð ÑÑом пÑимеÑе Ð¼Ñ ÑнаÑала иÑполÑзÑем rotate() Ð´Ð»Ñ Ð¿Ð¾Ð²Ð¾ÑоÑа пÑÑмоÑголÑника оÑноÑиÑелÑно наÑала кооÑдинаÑ, а заÑем, иÑполÑзÑÑ translate() ÑовмеÑÑно Ñ rotate() повоÑаÑиваем пÑÑмоÑголÑник оÑноÑиÑелÑно его ÑенÑÑа.
ÐÑимеÑание:
Ð£Ð³Ð»Ñ Ð¸Ð·Ð¼ÐµÑÑÑÑÑÑ Ð² ÑадианаÑ
, а не в гÑадÑÑаÑ
. ÐÐ»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ Ð¸ÑполÑзÑйÑе ÑледÑÑÑÑÑ ÑоÑмÑлÑ: radians = (Math.PI/180)*degrees.
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
// left rectangles, rotate from canvas origin
ctx.save();
// blue rect
ctx.fillStyle = "#0095DD";
ctx.fillRect(30, 30, 100, 100);
ctx.rotate((Math.PI / 180) * 25);
// grey rect
ctx.fillStyle = "#4D4E53";
ctx.fillRect(30, 30, 100, 100);
ctx.restore();
// right rectangles, rotate from rectangle center
// draw blue rect
ctx.fillStyle = "#0095DD";
ctx.fillRect(150, 30, 100, 100);
ctx.translate(200, 80); // translate to rectangle center
// x = x + 0.5 * width
// y = y + 0.5 * height
ctx.rotate((Math.PI / 180) * 25); // rotate
ctx.translate(-200, -80); // translate back
// draw grey rect
ctx.fillStyle = "#4D4E53";
ctx.fillRect(150, 30, 100, 100);
}
ÐÐ»Ñ Ð¿Ð¾Ð²Ð¾ÑоÑа пÑÑмоÑголÑника оÑноÑиÑелÑно его ÑенÑÑа Ð¼Ñ ÑнаÑала ÑмеÑаем наÑало кооÑдинаÑ, вÑполнÑем повоÑоÑ, а заÑем вÑполнÑем обÑаÑное ÑмеÑение к ÑоÑке 0,0, и Ð½Ð°ÐºÐ¾Ð½ÐµÑ ÑиÑÑем пÑÑмоÑголÑник.
ÐаÑÑÑабиÑование
СледÑÑÑий меÑод ÑÑанÑÑоÑмаÑии Ñ Ð¾Ð»ÑÑа - scaling. Ðн иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑаÑÑÑжениÑ, ÑжаÑÐ¸Ñ Ð¸ оÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¾ÑдинаÑной ÑеÑки. Ðн Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð¾ÑÑиÑовки ÑаÑÑÑнÑÑÑÑ Ð¸Ð»Ð¸ ÑжаÑÑÑ Ð¿Ð¾ оÑÑм ÑигÑÑ Ð¸ изобÑажений.
scale(x, y)-
ÐаÑÑÑабиÑÑÐµÑ ÐºÐ¾Ð¾ÑдинаÑнÑÑ ÑеÑÐºÑ Ñ Ð¾Ð»ÑÑа по гоÑизонÑали и веÑÑикали. Ðба паÑамеÑÑа - веÑеÑÑвеннÑе ÑиÑла. ÐнаÑÐµÐ½Ð¸Ñ Ð¼ÐµÐ½ÑÑе 1.0 ÑменÑÑаÑÑ, а болÑÑе 1.0 ÑвелиÑиваÑÑ Ð¼Ð°ÑÑÑаб ÑеÑки. ÐнаÑение 1.0 не изменÑÐµÑ ÐµÐ³Ð¾.
ÐÑполÑзÑÑ Ð¾ÑÑиÑаÑелÑнÑе знаÑÐµÐ½Ð¸Ñ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе зеÑкалÑно оÑÑазиÑÑ Ð½Ð°Ð¿Ñавление оÑей. ÐапÑимеÑ, иÑполÑзÑÑ translate(0,canvas.height); scale(1,-1); Ð²Ñ Ð¿Ð¾Ð»ÑÑиÑе Ñ
оÑоÑо извеÑÑнÑÑ Ð´ÐµÐºÐ°ÑÑÐ¾Ð²Ñ ÑиÑÑÐµÐ¼Ñ ÐºÐ¾Ð¾ÑÐ´Ð¸Ð½Ð°Ñ Ñ Ð½Ð°Ñалом в нижнем левом ÑглÑ.
Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÐµÐ´Ð¸Ð½Ð¸Ñа кооÑдинаÑной ÑеÑки ÑоÑно ÑооÑвеÑÑÑвÑÐµÑ Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¿Ð¸ÐºÑелÑ. ÐÑли же вÑ, напÑимеÑ, зададиÑе маÑÑÑабнÑй коÑÑÑиÑÐ¸ÐµÐ½Ñ 0.5, Ñо единиÑа ÑеÑки бÑÐ´ÐµÑ Ñавна половине пикÑелÑ, и наÑиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑигÑÑа бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð² два Ñаза менÑÑе оÑигинала. ÐаобоÑоÑ, еÑли задаÑÑ Ð¼Ð°ÑÑÑабнÑй коÑÑÑиÑÐ¸ÐµÐ½Ñ 2.0, единиÑа ÑеÑки бÑÐ´ÐµÑ ÑооÑвеÑÑÑвоваÑÑ Ð´Ð²Ñм пикÑелÑм, а наÑиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑигÑÑа ÑÑÐ°Ð½ÐµÑ Ð² два Ñаза болÑÑе.
ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ scale
Ð ÑÑом пÑимеÑе Ð¼Ñ Ð½Ð°ÑиÑÑем пÑÑмоÑголÑники, иÑполÑзÑÑ ÑазнÑе маÑÑÑабнÑе коÑÑÑиÑиенÑÑ.
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
// ÑиÑÑем маÑÑÑабиÑованнÑй пÑÑмоÑголÑник.
ctx.save();
ctx.scale(10, 3);
ctx.fillRect(1, 10, 10, 10);
ctx.restore();
// ÑазмеÑаем ÑекÑÑ, оÑÑажÑннÑй по гоÑизонÑали
ctx.scale(-1, 1);
ctx.font = "48px serif";
ctx.fillText("MDN", -135, 120);
}
ÐаÑÑиÑное пÑеобÑазование
РзаклÑÑении ÑаÑÑмоÑÑим меÑод, коÑоÑÑй вÑзÑÐ²Ð°ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑооÑвеÑÑÑвии Ñ Ð¼Ð°ÑÑиÑей пÑеобÑазованиÑ.
transform(a, b, c, d, e, f)-
ÐакладÑÐ²Ð°ÐµÑ Ð¼Ð°ÑÑиÑÑ Ð¿ÑеобÑазованиÑ, заданнÑÑ Ð¿Ð°ÑамеÑÑами, на ÑекÑÑÑÑ Ð¼Ð°ÑÑиÑÑ. ÐаÑÑиÑа пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð´Ð°ÑÑÑÑ ÑледÑÑÑим обÑазом:
If any of the arguments are
Infinitythe transformation matrix must be marked as infinite instead of the method throwing an exception.
ÐаÑамеÑÑÑ ÑÑнкÑии:
a (m11)-
Horizontal scaling.
b (m12)-
Horizontal skewing.
c (m21)-
Vertical skewing.
d (m22)-
Vertical scaling.
e (dx)-
Horizontal moving.
f (dy)-
Vertical moving.
setTransform(a, b, c, d, e, f)-
СбÑаÑÑÐ²Ð°ÐµÑ ÑекÑÑÑÑ Ð¼Ð°ÑÑиÑÑ Ð¿ÑеобÑазованиÑ, а заÑем вÑзÑваеÑ
transform()в ÑооÑвеÑÑÑвии Ñ Ð°ÑгÑменÑами. resetTransform()-
СбÑаÑÑÐ²Ð°ÐµÑ ÑекÑÑÑÑ Ð¼Ð°ÑÑиÑÑ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ðº знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ. ÐналогиÑно вÑзовÑ
ctx.setTransform(1, 0, 0, 1, 0, 0);
ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ transform и setTransform
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
var sin = Math.sin(Math.PI / 6);
var cos = Math.cos(Math.PI / 6);
ctx.translate(100, 100);
var c = 0;
for (var i = 0; i <= 12; i++) {
c = Math.floor((255 / 12) * i);
ctx.fillStyle = "rgb(" + c + ", " + c + ", " + c + ")";
ctx.fillRect(0, 0, 100, 10);
ctx.transform(cos, sin, -sin, cos, 0, 0);
}
ctx.setTransform(-1, 0, 0, 1, 100, 100);
ctx.fillStyle = "rgba(255, 128, 255, 0.5)";
ctx.fillRect(0, 50, 100, 100);
}