Agora que criamos nosso ambiente em canvas, podemos entrar nos detalhadas de como desenhar no canvas. No decorrer final isto artigo, ela terá aprendido a quadro retângulos, triângulos, linhas, arcos e curvas, forneceu familiaridade alcançar algumas das formas básicas. Trabalhar alcançar caminhos (shapes) é essencial ~ por desenhar objetos na tela e veremos gostar de isso isso pode ser feito.

Você está assistindo: Como colocar setas em fotos no celular


*
Antes que possamos começar a desenhar, precisamos falar sobre naquela grade de tela alternativa espaço de coordenadas. Ministérios modelo HTML na página anteriormente tinha um elemento canvas de 150 pixels de largo e 150 pixels de altura. À direita, ela verá naquela canvas abranger a grade padrão sobreposta. Coloquial 1 unir na grade corresponde a um pixel na tela. Der origem isto grade isso é posicionada no borda superior esquerdo (coordenadas (0,0)). Tudo os grupo são por em conectar a esta origem. Assim, naquela posição do borda superior esquerdo dá quadrado azul, se tornar-se x pixels são de pixels da deixou e y a partir dá topo (coordenadas (x,y)). Adicionar tarde incluído tutorial vamos ver gostar de podemos traduzir naquela origem para uma localização diferente, girar naquela grade e até mesmo escaloná-la. Através enquanto malos ficar com o padrão.


Diferente a partir de SVG , ministérios suporta espetáculo formas primitivas: retângulos. Todas as outras forma são criada a partir da associação de um ou adicionando caminhos (paths), jardim de pontos conectados através uma linha. Felizmente, temos uma placas de funções de elaboração que faz possíveiscriar forma muito complexas.

Primeiramente vamos assistir o retângulo. Aqui está listadas três funções para quadro retângulos pelo canvas:

fillRect(x, y, width, height) Desenha um retângulo preenchido. StrokeRect(x, y, width, height) Desenha a borda do retângulo. ClearRect(x, y, width, height) Limpa um retângulo específico, tornando-o completamente transparente.

Cada umas a partir de funções receber os preferência parâmetros. X e ydeterminam naquela posição enquanto canvas (em conectar a origem) no canto superior esquerdo a partir de retângulo. Emprego width(largura) e emprego height (altura)definem emprego tamanho do retângulo.

Abaixo isto é listadoa função draw() da ao lado anterior, apesar utilizando as três funções.


function draw() var canvas = document.getElementById("canvas"); if (canvas.getContext) var ctx = canvas.getContext("2d"); ctx.fillRect(25, 25, 100, 100); ctx.clearRect(45, 45, 60, 60); ctx.strokeRect(50, 50, 50, 50);
O resultados desse exemplo excluir mostrado abaixo.

ScreenshotLive sample
*

A funçãofillRect()desenha um compridas quadrado negra de 100 pixels. Der funçãoclearRect()por seus vez apaga um quadrado de 60x60 pixels naquela partir do centro, por fim, a funçãostrokeRect()é chamada telefónica para cria uma borda de50x50 pixelsem volta do quadrado apagado.

Posteriormente veremos duas alternativas à funçãoclearRect(), nós demasiado aprenderemos como alterar a cores e ministérios estilo das linhasnas camadas renderizadas.

Ao contraditório das funções de paths que veremos na próximo seção, todas as três funções de retângulo desenham imediatamente durante canvas.


Para cria uma piso usando caminhos (regiões ou paths) excluir necessárioalguns passos extras. Primeiro, cria-se a região de desenho. Depois usa-se comandos de conto de fadas para esboço, projeto nesta região. Pela fim,você limitaa região (path). Uma virado que naquela região de construir está criada, você ele pode traçar ou preencher o estrada para o que seja renderizado. Aqui estão as função utilizadas ao isso:

beginPath() criar um novo path. Uma rotação criado, presente comandos de construir são direcionados do path presente para a ereção de um new path durante canvas. Método de Caminhos (Path) método para manipuliar diferentes paths para objetos. ClosePath() finaliza o course para futuros comandos de desenho, fazendo alcançar que voltem a ser direcionados ~ por contexto. Stroke() Desenha uma borda na camada. Fill() Desenha uma forma sólida por de preenchimento.

O primeiro passo para cria um caminho é ligar o beginPath().Internamente, caminhos são armazenados como uma lista de sub-caminhos (linhas, arcos, etc.) que coletivo formam uma formato (shape). Sempre que isto método é chamado, a cúrio é redefinida e podemos começar a quadro novas formas.


Nota: no decorrer o caminho atual está vazio, então como imediatamente após chamar beginPath(), alternativa em uma tela recém-criada, o primeiro comandada de ereção de caminho é invariavelmente tratado gostar um moveTo(), independentemente dá que naquela seja realmente. Por aqueles razão, você maior parte do tempo sempre importar precisar definir especificamente deles posição inicial após redefinir um caminho.

A segunda etapa é ligar os métodos que sim com certeza especificam os caminhos a serem desenhados. Vamos ver naquela em breve.

ministérios terceiro, e um passo opcional, é ligar closePath(). Naquela método faça os esforços fechar der forma desenhando uma fileira reta do ponto atual para ministérios início. Se der forma (shape) já adquirindo fechada alternativa existe apenas um um ponto na lista, isso é função que faz nada.


Nota: quando você incêndio fill(), tudo de as formas abrir são fecho automaticamente, assim você que precisa ligar closePath(). Naquela não acontece enquanto você ligar stroke().

function draw() var canvas = document.getElementById("canvas"); if (canvas.getContext) var ctx = canvas.getContext("2d"); ctx.beginPath(); ctx.moveTo(75,50); ctx.lineTo(100,75); ctx.lineTo(100,25); ctx.fill();
O resultado se parece alcançar isso:

ScreenshotLive sample
*


Uma efeito muito útil, eu imploro seu perdão na verdade não desenha nada, contudo torna-se parte da cúrio de caminhos descrição acima, denominações a efeito moveTo(). Você tendência pode introduzir melhor isso como se ser o levantar uma caneta alternativamente lápis de um ponto em um pedaço de departamento e colocá-lo durante próximo ponto.

moveTo(x, y) Move a caneta (pen) para as coordenadas especificadas pela x e y.

Quando o canvas excluir inicializado ou beginPath() excluir chamado, você normalmente vai querer usar a função moveTo() para assume o ponto inicial noutras lugar. Poderíamos também alavancada moveTo() para desenhar caminhos não conectados. Dê ns olhada enquanto rosto sorridente abaixo. Mim marquei os lugar, colocar onde mim usei o método moveTo() (as contorno vermelhas).

Caso queira tentar pendência isso, você pode usa o snippet de código abaixo. Basta colá-lo na função draw() que vimos anteriormente.


function draw() var canvas = document.getElementById("canvas"); if (canvas.getContext) var ctx = canvas.getContext("2d"); ctx.beginPath(); ctx.arc(75, 75, 50, 0, Math.PI * 2, true); // bairro exterior ctx.moveTo(110, 75); ctx.arc(75, 75, 35, 0, Math.PI, false); // oralmente (sentido horário) ctx.moveTo(65, 65); ctx.arc(60, 65, 5, 0, Math.PI * 2, true); // olho esquerdo ctx.moveTo(95, 65); ctx.arc(90, 65, 5, 0, Math.PI * 2, true); // Olho correto ctx.stroke();
O resultado aparece como:

ScreenshotLive sample
*

Se você algum gosta de ver linhas conectadas, você ele pode fazer remover as linhas que chamam a efeito moveTo().


Para quadro linhas retas, use o métodolineTo().

lineTo(x, y) Desenha ns linha a partir de ponto atual a até ~ a posição especificada através dos x e y.

Esse caminho recebe dois argumentos, x e y, eu imploro seu perdão são as coordenadas do dotes final da linha. O dotes inicial excluir dependente de caminhos antes desenhados, onde o apontar final a partir de caminho anteriormente é o ponto inicial para ministérios seguinte, e portanto por diante. O apontar inicial até pode ser mudado usando o método moveTo(). ministérios exemplo debaixo desenha dois triângulos, um preenchidas e um delineado.


function draw() var canvas = document.getElementById("canvas"); if (canvas.getContext) var ctx = canvas.getContext("2d"); // fill triangle ctx.beginPath(); ctx.moveTo(25,25); ctx.lineTo(105,25); ctx.lineTo(25,105); ctx.fill(); // Stroked triangle ctx.beginPath(); ctx.moveTo(125,125); ctx.lineTo(125,45); ctx.lineTo(45,125); ctx.closePath(); ctx.stroke();
Isso começar chamando o método beginPath() para iniciar um novo shape path. Em seguida, usamos o método moveTo() para realocar o ponto inicial para naquela posição desejada. Em breve abaixo, dois linhas, que conjunto os dois lados são de triângulo, elas desenhadas.

ScreenshotLive sample
*

Você notará der diferença adentraram o triângulo preenchidas (filled) e que prenchido (stroked). Disto ocorre, gostar mencionado acima, lá as para moldar são automático fechadas quando um caminho é preenchido, mas algum quando são que preenchidos. Se deixássemos de lado de fora o closePath() ao os triângulos algum preenchidos, apenas um duas atual teriam sólido desenhadas, não um triângulo completo.


Para esboço, projeto arcos, nós usamos os métodos arc() ou arcTo().

arc(x, y, radius, startAngle, endAngle, anticlockwise) Desenha um arco centralizado na localização (x, y) alcançar um feixe r iniciando emstartAngle e fechamento emendAngle apontando na direção indicada pelo sentido anti-horário (padronizando para emprego sentido horário). ArcTo(x1, y1, x2, y2, radius) Desenha um arco alcançar os apontar de direção e raio, conectados ~ por ponto anterior por uma linha reta.

Vamos dar uma olhada mais detalhada para o maneira arc, eu imploro seu perdão tem six parâmetros: x e y são as coordenadas do central do bairro em que o arco deve ser desenhado. Radius excluir o raio. Os parâmetros startAngle e endAngle definem os pontos inicial e final do reverência em radianos, ao longo da curva do círculo. Isto são medidos der partir são de eixo x. O parâmetro anticlockwise excluir um valor Booleano que, enquanto verdadeiro, desenha o reverência no sentido anti-horário; circunstancias contrário, o arco é quadro no sentido horário.


Nota: Os ângulos na função arc são medidos em radianos, não em graus. Para conversão graus em radianos tu pode alavancada a seguinte expressão JavaScript: radians = (Math.PI/180)*degrees.


O exemplo a seguir é um pouco adicionar complexo do que os que vimos anteriormente. Naquela desenha 12 arcos diferentes, todos abranger diferentes ângulo e preenchimentos.

Os dois laços for são ao iterar através dos das linhas e colunas de arcos. Ao cada arco, é criado um novo estrada chamando beginPath(). No código, cada um são de parâmetros porque o o reverência estão em 1 variável somente para demonstração, então você que precisa fazer isso na vida real.

As coordenada x e y preciso ser o suficiente claras. Emprego parâmetros radius e startAngle elas fixos. O endAngle começar em 180 graus (metade de um círculo) na primeira aquecer e aumenta gradualmente em 90 graus, culminando em um círculo dispor na última coluna.

A manipulação dá parâmetro clockwise faz abranger que naquela primeira e terceira linhas sejam desenhadas como arcos no sentido horário, e a segunda e quarta-feira linhas como arcos no sentido anti-horário. Finalmente, a instrução if faz com que naquela metade superior dos arcos algum sejam preenchidos e a metade inferior a partir de arcos sejam.


function draw() var canvas = document.getElementById("canvas"); if (canvas.getContext) var ctx = canvas.getContext("2d"); for(var i=0;i4;i++) for(var j=0;j3;j++) ctx.beginPath(); var x = 25+j*50; // coordenada x var y = 25+i*50; // coordenada y var radius = 20; // raio do arco var startAngle = 0; // ponto inicial no área var endAngle = Math.PI+(Math.PI*j)/2; // dotes final no distrito var anticlockwise = i%2==0 ? false : true; // horário alternativamente anti-horário ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise); if (i>1) ctx.fill(); else ctx.stroke();

ScreenshotLive sample
*


O depois tipo de caminhos acessível são together Curvas de Bézier, acessível nasvariedades cubícas e quadráticas. Eles são de um modo geral usadas porque o desenhar complexo formas orgânicas.

quadraticCurveTo(cp1x, cp1y, x, y) Desenha uma curva de Bézier quadrática da posição presente indicada pelo cursor, até a posição final especificada por x e y, usar o direção de apontar guiados através cp1x e cp1y. BezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) (en-US) Desenha uma curva de Bézier cúbica começar da posição presente indicada cabelo cursor, até ~ a posição último especificada por x e y, usado o ao controle de pontos guiados através dos (cp1x, cp1y) e (cp2x, cp2y).

*
A diferença entre estes métodos isso pode ser descrita de formato melhor usando a imagem à direita. Uma curva quadrática de Bézier sim um dotes inicial e último (pontos azuis) e somente um dotes de ao controle (indicado pelo dotes vermelho) devido a que ns curva cúbica de Bézier utiliza dois névoa de controles.

Os parâmetros x e y em ambas os métodos são as coordenadas do apontar final. Cp1x e cp1y eles são as coordenadas do primeiro ponto de controle, e cp2x e cp2y eles são as coordenadas do segundo apontar de controle.

Usando curvas deBézier quadráticas e cúbicas pode ser algo mais bastante desafiador, porque ~ por contrário de um programas de desenho vetorial, como o Adobe Illustrator, algum temos achados visuais imediatos sobre emprego que estamos fazendo. A torna bastante difícil quadro formas complexas. Durante exemplo a seguir, mallos desenhar papel formas orgânicas simples, contudo se ela tiver tempo e, acerca tudo, paciência, forma muito adicionando complexas podem ser criadas.

Não tenho nada muito dificuldades nestes exemplos. Em ambos os caso vemos uma sequência de curvas existência desenhadas, resultando durante fim, em uma forma (shape) completa.

Curvas de Bézier Quadráticas

Este exemplo usa múltiplas curvas de Bézier quadráticas para renderizar um borba de fala.


function draw() var canvas = document.getElementById("canvas"); if (canvas.getContext) var ctx = canvas.getContext("2d"); // instância de curvas de Bézier quadráticas ctx.beginPath(); ctx.moveTo(75,25); ctx.quadraticCurveTo(25,25,25,62.5); ctx.quadraticCurveTo(25,100,50,100); ctx.quadraticCurveTo(50,120,30,125); ctx.quadraticCurveTo(60,120,65,100); ctx.quadraticCurveTo(125,100,125,62.5); ctx.quadraticCurveTo(125,25,75,25); ctx.stroke();

ScreenshotLive sample
*

Curvas de Bézier Cúbicas

Este por exemplo desenha um cardíaco usando curvas de Bézier cúbicas.


function draw() var canvas = document.getElementById("canvas"); if (canvas.getContext) var ctx = canvas.getContext("2d"); // por exemplo de curvas de Bézier cúbicas ctx.beginPath(); ctx.moveTo(75,40); ctx.bezierCurveTo(75,37,70,25,50,25); ctx.bezierCurveTo(20,25,20,62.5,20,62.5); ctx.bezierCurveTo(20,80,40,102,75,120); ctx.bezierCurveTo(110,102,130,80,130,62.5); ctx.bezierCurveTo(130,62.5,130,25,100,25); ctx.bezierCurveTo(85,25,75,37,75,40); ctx.fill();

ScreenshotLive sample
*


Além a partir de três método que vimos em Desenhando retângulos, que desenham para moldar retangulares viver no canvas, há demasiado o método rect(), eu imploro seu perdão adiciona uma formato retangular der um estrada (path) actuais aberto.

rect(x, y, width, height)

Desenha um retângulo cujo borda superior esquerdo é especificado através dos (x, y) com base em uma largura (width) e uma altura (height).

Quando aquela método denominada executado, o maneira moveTo() é automático chamado abranger os parâmetros (0,0). Em de outros palavras, a posição atual do cursor é automaticamente redefinida para as coordenada padrões.


Até agora, em por exemplo sobre isso página adquirindo usada só um modelo de efetua de caminho (path) para cada forma (shape). No entanto, que há nenhuma delimitando para emprego número ou tipos de caminhos que você pode alavancada para cria um shape. Então, neste por exemplo final, vamos combinar todas as função de estrada para pendência um ajustar de boneca de jogo muito conhecido.


function draw() var canvas = document.getElementById("canvas"); if (canvas.getContext) var ctx = canvas.getContext("2d"); roundedRect(ctx,12,12,150,150,15); roundedRect(ctx,19,19,150,150,9); roundedRect(ctx,53,53,49,33,10); roundedRect(ctx,53,119,49,16,6); roundedRect(ctx,135,53,49,33,10); roundedRect(ctx,135,119,25,49,10); ctx.beginPath(); ctx.arc(37,37,13,Math.PI/7,-Math.PI/7,false); ctx.lineTo(31,37); ctx.fill(); for(var i=0;i8;i++) ctx.fillRect(51+i*16,35,4,4); for(i=0;i6;i++) ctx.fillRect(115,51+i*16,4,4); for(i=0;i8;i++) ctx.fillRect(51+i*16,99,4,4); ctx.beginPath(); ctx.moveTo(83,116); ctx.lineTo(83,102); ctx.bezierCurveTo(83,94,89,88,97,88); ctx.bezierCurveTo(105,88,111,94,111,102); ctx.lineTo(111,116); ctx.lineTo(106.333,111.333); ctx.lineTo(101.666,116); ctx.lineTo(97,111.333); ctx.lineTo(92.333,116); ctx.lineTo(87.666,111.333); ctx.lineTo(83,116); ctx.fill(); ctx.fillStyle = "white"; ctx.beginPath(); ctx.moveTo(91,96); ctx.bezierCurveTo(88,96,87,99,87,101); ctx.bezierCurveTo(87,103,88,106,91,106); ctx.bezierCurveTo(94,106,95,103,95,101); ctx.bezierCurveTo(95,99,94,96,91,96); ctx.moveTo(103,96); ctx.bezierCurveTo(100,96,99,99,99,101); ctx.bezierCurveTo(99,103,100,106,103,106); ctx.bezierCurveTo(106,106,107,103,107,101); ctx.bezierCurveTo(107,99,106,96,103,96); ctx.fill(); ctx.fillStyle = "black"; ctx.beginPath(); ctx.arc(101,102,2,0,Math.PI*2,true); ctx.fill(); ctx.beginPath(); ctx.arc(89,102,2,0,Math.PI*2,true); ctx.fill(); // Uma efetua útil para quadro um retângulo alcançar cantos arredondados.function roundedRect(ctx,x,y,width,height,radius) ctx.beginPath(); ctx.moveTo(x,y+radius); ctx.lineTo(x,y+height-radius); ctx.quadraticCurveTo(x,y+height,x+radius,y+height); ctx.lineTo(x+width-radius,y+height); ctx.quadraticCurveTo(x+width,y+height,x+width,y+height-radius); ctx.lineTo(x+width,y+radius); ctx.quadraticCurveTo(x+width,y,x+width-radius,y); ctx.lineTo(x+radius,y); ctx.quadraticCurveTo(x,y,x,y+radius); ctx.stroke();
O achados é:

ScreenshotLive sample
*

Não vamos argumentativo isso em detalhes, uma giradas que denominada realmente grandemente simples. Together coisas mais importantes der serem observadas são emprego uso da propriedade fillStyle no definição de papel de construir e ministérios uso de uma efeito auxiliar (neste circunstâncias roundedRect()). Usando função auxiliares para constroem um elaboração frequentemente capaz muito útil, além de reduzir a cardeais de senha que você precisa, boa como a sua complexidade.

Vamos deu-se uma novo olhada em fillStyle, em mais detalhes, mais adiante nisso tutorial. Aqui, tudo emprego que estamos faço é somente usando-o para alterar sucessivamente a cor de preenchimento a partir de caminhos (paths) de cor preta (padrão) para branca.


Como vimos no decorrer último exemplo, pode ~ ~ uma série de paths e comandos de desenho para quadro objetos em sua tela. Para simplificar o senha e para melhorar o desempenho, o sujeito Path2D, disponível em versão recentes são de navegadores, permite armazenar em cache ou gravar esses comandos de desenho. Alcançar ele, amigo pode constroem seus paths rapidamente. Mouros ver como podemos constroem um assunto de Path2D:

Path2D() (en-US)

O construtor de Path2D() parte traseira um sujeito Path2D instanciado recentemente, opcionalmente pela de um outro assunto Path2D como argumento (cria ns cópia) ou, opcionalmente, alcançar uma string que representam dados de paths em SVG.


new Path2D(); // sujeito vazio de Path2Dnew Path2D(path); // cópia de outro sujeito de Path2Dnew Path2D(d); // assunto criado das paths em SVG
Todos os métodos de caminho (path methods) gostar de moveTo, rect, arc ou quadraticCurveTo, etc., o que temos de saber acima, estão disponíveis em Path2D.

A API Path2D até adiciona uma método de associado caminhos usar o caminho addPath. Isso capaz útil no decorrer você deseja crio objetos alcançar vários componentes, pela exemplo.

Path2D.addPath(path <, transform>) (en-US) Adiciona um route para ministérios path atualmente através de uma quartel general de converter opcional.

Neste exemplo, estamos produzir um retângulo e um círculo. Ambos são armazenados gostar de um sujeito de Path2D, de caminho que eles ~ ~ disponíveis ao uso posterior. Alcançar a novo API Path2D, vários método foram atualizado como, pela exemplo, opcionalmente usa um sujeito Path2D bastante do course atual. Aqui, os métodosstroke efill elas usados, ​​com um argumento de path, para desenhar ambos os objetos na tela, pela exemplo.


function draw() var canvas = document.getElementById("canvas"); if (canvas.getContext) var ctx = canvas.getContext("2d"); var rectangle = novo Path2D(); rectangle.rect(10, 10, 50, 50); var 1 = novo Path2D(); circle.moveTo(125, 35); circle.arc(100, 35, 25, 0, 2 * Math.PI); ctx.stroke(rectangle); ctx.fill(circle);

ScreenshotLive sample
*


Outro recurso monumental da novo API de Path2D denominações a usar de dados de path em SVG para inicializar caminhos (paths) enquanto canvas. Isso permite que você crie dados de paths que possam ser utilizados tanto no SVG gostar no canvas.

Ver mais: Como Calcular Preço De Envio Pelo Correio? Simular Preço Do Percurso

O caminho se moverá para o dotes (M10 10) e então se moverá horizontalmente 80 pontos certas (h 80), mais tarde 80 atrações para baixa (v 80), então 80 atrações para a esquerda (h -80) e, pela fim, volta porque o o começo (z). Você ele pode ver aquela exemplo na página são de construtor são de Path2D.


Last modified:
Oct 14, 2021, through MDN contributors

Change your languageSelect your wanted language português (doBrasil)DeutschEnglish (US)EspañolFrançais日本語한국어PolskiРусский中文 (简体)正體中文 (繁體) mudança language