Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
Conversão por Varrimento
Conversão vectorial ? matricial
Representação Vectorial
Representação Matricial
2
Rasterização de Primitivas? Rasterização - converter de uma definição
geométrica para pixels (matricial)? Rasterizar ≡ escolher pixels
Operação muito frequente? Operação muito frequente? Deve ser eficiente!!!
? Isto implica:? Utilizar aritmética de inteiros? Utilizar métodos incrementais? Utilizar somas no lugar de multiplicações
3
Conversão por varrimento do ponto
? A conversão por varrimento do ponto envolve a iluminação do pixel que o contémcontém? Ex. Os pontos em coordenadas
P1(2.5, 1.2) e P2(2.8, 1.5) seriam ambos representados pelo pixel (2,1)
? Em geral P(x, y) ? P(int(x), int(y))
4
Conversão por varrimento do segmento de recta
?? O problemaO problema
5
Conversão por varrimento do segmento de recta
?? O problemaO problema
6
Conversão por varrimento do segmento de recta
?? Método do DecliveMétodo do Declive(Direct Scan Conversion)
? Um segmento de recta pode ser definido por dois
(x2,y2)
y=mx+b
b (x1,y1)
Um segmento de recta pode ser definido por dois pontos extremos e uma equação:
? Pontos ? (x1, y1) e (x2, y2)
? Equação ? y = m*x + b (1)? onde m = ∆∆∆∆y/∆∆∆∆x,? b = ao valor que y toma quando a recta intersecta o eixo do
y. O valor de b pode ser calculado por b = y1 – m*x1
Podemos determinar os valores de y incrementando o valor de x de x1 a x2
7
Conversão por varrimento do segmento de recta
?? Método do DecliveMétodo do Declive ((versão versão 0< m <10< m <1)*)*void Line1(int x1, int y1, int x2, int y2, int color){
float m = (y2-y1)/(x2-x1);float b = y1 - m*x1;float y;int x;
* Se m > 1, inverte-se x e y.
int x;
PutPixel(x1,y1,color);
for (x=x1+1; x<=x2; x++){
y = m*x + b;PutPixel(x,ROUND(y), color);
}}
(x1,y1)
(x2,y2)
y=mx+bb
(3,2)
(9,4)
y=(1/3)x+11
3
(3,2)
4
(4,2.33)
5
2 (4,2)
(5,3)
(5,2.66)
32
Exemplo
Calcula-se m e b 1a iteração 2a iteração 3a iteração 8
Conversão por varrimento do segmento de recta
?? Método do Declive (cont...)Método do Declive (cont...)Problemas:
? Segmentos de recta verticais.? 2 operações de ponto flutuante por pixel
Por que trabalhar em float se os pixels são inteiros???? Por que trabalhar em float se os pixels são inteiros???
void Line1(int x1, int y1, int x2, int y2, int color){
float m = (y2-y1)/(x2-x1);float b = y1 - m*x1;float y;int x;
PutPixel(x1,y1,color);
for (x=x1+1; x<=x2; x++){
y = m*x + b;PutPixel(x,ROUND(y), color);
}} 9
Conversão por varrimento do segmento de recta
?? Simple DDA Simple DDA ((Digital Differential Analyzer)Digital Differential Analyzer)? Este algoritmo utiliza o seguinte igualdade:
m*(x+1) + b = (m*x +b) + m = y + m
Então se 0 < m < 1 então podemos considerar que? Então se 0 < m < 1 então podemos considerar que∆x=1 e
xk+1 = xk +1; yk+1 = yk + m (2)? Para segmentos com m > 1 devemos inverter os
valores de x e y. Neste caso podemos assumir que∆y=1 e então da equação ∆x=∆y/m obtemos que∆x=1/m e finalmente podemos calcular
yk+1 = yk +1; xk+1 = xk + 1/m (3)10
Conversão por varrimento do segmento de recta
?? Simple DDA Simple DDA ((Digital Differential Analyzer)Digital Differential Analyzer)? As equações
xk+1 = xk +1; yk+1 = yk + m (2)y = y +1; x = x + 1/m (3)yk+1 = yk +1; xk+1 = xk + 1/m (3)
são válidas se consideramos que os segmentos são processados deesquerda a direita.
? Em caso contrário vamos ter que ∆∆∆∆x= -1 pelo que
xk+1 = xk - 1; yk+1 = yk - m (4)Ou para o caso que m>1 então temos que ∆∆∆∆y= -1 e
yk+1 = yk - 1; xk+1 = xk - 1/m (5)? Estas equações podem ser utilizadas também para calcular a
posição dos pixels de segmentos com m<0 (Exercício) 11
Conversão por varrimento do segmento de recta
?? Simple DDA Simple DDA ((versão versão 0< m <10< m <1))void LineDDA(int x1, int y1, int x2, int y2, int color){
float y; float m = (y2-y1)/(x2-x1);int x;
? Problemas:? Aproximações “muito grosseiras” de y
12
int x;
PutPixel(x1,y1, color);y = y1;
for (x=x1+1; x<=x2; x++){
y += m;PutPixel(x,ROUND(y), color);
}}
Conversão por varrimento do segmento de recta
?? Simple DDA (cont...)Simple DDA (cont...)Observações:
? O número total de pixels desenhados pelo método DDA é iguala max(∆∆∆∆x, ∆∆∆∆y)Para segmentos (S) horizontais/verticais o max(∆∆∆∆x, ∆∆∆∆y) =? Para segmentos (S) horizontais/verticais o max(∆∆∆∆x, ∆∆∆∆y) =Length(S) – ideal!!!
? Para segmentos oblíquos com ângulo de inclinação de 450
então:Length(S) = Sqrt(∆x2+∆y2) = Sqrt(2*∆x2) =
= Sqrt(2)*∆x ≈ 1,41*dx∆∆∆∆x = 0,71* Length (S)
???? O segmento S só tem um 71% dos pontos!!!
13
Conversão por varrimento do segmento de recta
?? O Algoritmo de BresenhamO Algoritmo de Bresenham(Bresenham, J.E. Algorithm for computer control of a digitalplotter, IBM Systems Journal, January 1965, pp. 25-30.)
? É um algoritmo eficiente já que apenasrecorre a adições e subtracções inteirasÉ um algoritmo eficiente já que apenasrecorre a adições e subtracções inteirase multiplicações por 2.
? Ideia fundamental:A melhor aproximação ao segmento de
recta verdadeiro é dada pelos pixels doraster a menor distância do segmentode recta verdadeiro
14
Conversão por varrimento do segmento de recta
?? O Algoritmo de BresenhamO Algoritmo de Bresenham? Em vez de computar o valor do
próximo y em ponto flutuante, oproblema fica reduzido a decidir
(x + 1, y + 1)
problema fica reduzido a decidirse o próximo pixel vai tercoordenadas(x + 1, y) ou (x + 1, y + 1)
? Esta decisão requer que seavalie se a linha passa acima ouabaixo do ponto médio
(x + 1, y)(x, y)
(x + 1, y + ½)
15
Conversão por varrimento do segmento de recta
?? O Algoritmo de BresenhamO Algoritmo de Bresenham? Variável de decisão V é dada pela classificação do ponto
médio com relação ao semi-espaço definido pela recta V? Caso 1: Linha passou abaixo do ponto médio? Caso 1: Linha passou abaixo do ponto médio
(x,y) (x+1,y)
(x+1,y+1)
(x+1,y+½)
a+V=V
c+)+b(y+ax=V
c+)+b(y+)+a(x=V
y)(x,>V
y)(x,<V
y)(x,=V
V=c+by+ax
01∴
12
121
recta da acima 0
recta da abaixo 0
recta a sobre 0 onde
0
1
→
→
→
(x,y+½) V1
V0
(x,y+1)
16
Conversão por varrimento do segmento de recta
?? O Algoritmo de BresenhamO Algoritmo de Bresenham? Caso 2: Linha passou acima do ponto médio
(x+1,y+2)
(x,y)
(x+1,y+1)
(x+1,y+ 1+ ½)
(x,y+½)
V1
V0
(x,y+1)
V 1= a ( x+1)+b( y+1+ 12 )+c
V 0= ax+b ( y+12 )+c
∴V 1= V 0+a +b
17
Conversão por varrimento do segmento de recta
?? O Algoritmo de BresenhamO Algoritmo de Bresenham? Coeficientes da recta
a = y2 – y1
b = x1 – x2
c = x2 y1 – x1 y2c = x2 y1 – x1 y2
? Para iniciar o algoritmo, precisamos saber o valor de V em (x1+ 1, y1 + ½)
V = a (x1 + 1) + b (y1 + ½) + c= a x1 + b y1 + c + a + b/2 = a + b/2
como a x1 + b y1 + c = 0 então temos que V = a + b/2
? Podemos evitar a divisão por 2 multiplicando a, b e c por 2 (não altera a equação da recta)
18
Conversão por varrimento do segmento de recta
?? O Algoritmo de Bresenham (0 a 45º)O Algoritmo de Bresenham (0 a 45º)a ← y2 – y1
b ← x1 – x2
V ← 2 * a + bx ← xx ← x1
y ← y1
Enquanto x ≤ x2 fazer:Pintar pixel (x, y)x ← x + 1Se V ≤ 0
Então V ← V + 2 * a Senão V ← V + 2 * (a + b) ; y ← y + 1
19
Conversão por varrimento do segmento de recta
?? O Algoritmo de Bresenham O Algoritmo de Bresenham
? Outra versão deste algoritmo pode ser encontrada em:em:
http://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html
http://www.gocad.org/~caumon/Teach/CG/bresenham.pdf
20
Conversão por varrimento do segmento de recta
?? O Algoritmo de Bresenham O Algoritmo de Bresenham Extensão (∀∀∀∀ ângulo de inclinação)? Ver no documento AlgBre.zip (nos sumários práticos
da disciplina)da disciplina)
21
Conversão por varrimento do segmento de recta
?? O Algoritmo de Bresenham O Algoritmo de Bresenham
Implementação Javahttp://www.cs.unc.edu/~mcmillan/comp136/Lecture6/Lines.html
Applethttp://www.cs.technion.ac.il/~cs234325/Applets/applets/bresenham/GermanApplet.html
22
Conversão por varrimento da circunferência
? Uma circunferência é uma figurasimétrica!
? Qualquer algoritmo por varrimento da? Qualquer algoritmo por varrimento dacircunferência pode tirar partido destasimetria para desenhar oito pontos apartir de cada valor que o algoritmocalcula.
23
Conversão por varrimento da circunferência
?? Exemplo: Simetria a 4 eixosExemplo: Simetria a 4 eixos
24
Conversão por varrimento da circunferência
?? MétodoMétodo PolinomialPolinomial?? UmaUma circunferênciacircunferência podepode serser definidadefinida pelapela
seguinteseguinte equaçãoequação polinomialpolinomial::yy22 == rr22 –– xx22 ,,ondeonde rr –– raioraio dada circunferênciacircunferênciaondeonde rr –– raioraio dada circunferênciacircunferência
?? EntãoEntão cadacada coordenadacoordenada x,x, nono sectorsector quequevaivai dede 9090ºº aa 4545ºº éé determinadadeterminada porporsucessivossucessivos incrementosincrementos dede xx dede 00 aaeecadacada coordenadacoordenada yy éé calculadacalculada porpor
?? ObservaçãoObservação:: esteeste métodométodo temtem operaçõesoperaçõesaritméticasaritméticas muitomuito custosascustosas parapara oocomputadorcomputador ?? éé muitomuito poucopouco eficiente!!!eficiente!!!
22 xr −)2(2/ 22222 rxyrxr =⇒−=
25
Conversão por varrimento da circunferência
?? MétodoMétodo PolinomialPolinomialOrganigrama:
1. Inicializar: r - raio, (h, k) – centro da circunferência: (x, y) = (0,0); i = incremento; xfim = r/sqrt(2);(x, y) = (0,0); i = incremento; xfim = r/sqrt(2);
2. Testar se a circunferência foi gerada totalmente: 2. Testar se a circunferência foi gerada totalmente: se x > xfim, se x > xfim, STOPSTOP
3. Calcular o valor de y: y = sqrt(ry = sqrt(r22--xx22))
4. Desenhar os pontos da simetria: (x+h, y+k); ((x+h, y+k); (--x+h, x+h, --y+k); y+k); (y+h, x+k); ((y+h, x+k); (--y+h, y+h, --x+k); x+k); ((--y+h, x+k); (y+h, y+h, x+k); (y+h, --x+k); x+k); ((--x+h, y+k); (x+h, x+h, y+k); (x+h, --y+k) y+k)
5. Incrementar x: x = x+ix = x+i
6. Continuar no passo 2 26
Conversão por varrimento da circunferência
? Método TrigonométricoUma circunferência pode ser definidamediante a utilização de funçõestrigonométricas:
x = r*cos(θθθθ); y = r*sen(θθθθ)x = r*cos(θθθθ); y = r*sen(θθθθ)onde θθθθ – ângulo corrente
r – raio da circunferência
Com este método, θθθθ é sucessivamenteincrementado de 0 a ππππ/4 e cada valor dex e y é calculado
Este método tem operações aritméticasainda mais custosas que o métodopolinomial ? é muito pouco eficiente!!!
27
Conversão por varrimento da circunferência
? Método TrigonométricoOrganigrama:1. Inicializar r - raio, (h, k) – centro da circunferência:
(x,y) = (0,0), i = incremento, (x,y) = (0,0), i = incremento, θθfimfim= (22/7)/4 (== (22/7)/4 (=ππ/4=45º); /4=45º); θθ=0=02. Testar se a circunferência foi gerada totalmente: 2. Testar se a circunferência foi gerada totalmente:
se se θθ > > θθfimfim, , STOPSTOP3. Calcular os valores de x e y:
x = r*cos(x = r*cos(θθ); y = r*sen(); y = r*sen(θθ))4. Desenhar os pontos da simetria:
(x+h, y+k); ((x+h, y+k); (--x+h, x+h, --y+k); y+k); (y+h, x+k); ((y+h, x+k); (--y+h, y+h, --x+k); x+k); ((--y+h, x+k); (y+h, y+h, x+k); (y+h, --x+k);x+k);((--x+h, y+k); (x+h, x+h, y+k); (x+h, --y+k) y+k)
5. Incrementar θ: θθ = = θθ + i+ i
6. Continuar no passo 2 28
Conversão por varrimento da circunferência
? Observações gerais:? Para traçar eficientemente uma circunferência deve
ser evitada a utilização de funções trigonométricase funções de potências.e funções de potências.
? Para encontrar os pontos de conversão porvarrimento da circunferência é desejável efectuarapenas cálculos de adição e subtracções inteiras,assim como multiplicações por potências de 2.
? O algoritmo de BresenhamBresenham permite que tal sejaconseguido!!!
29
Conversão por varrimento da circunferência
? Algoritmo de Bresenham para a circunferência? Se é usada a simetria em
relação a quatro eixos, apenasrelação a quatro eixos, apenastemos de gerar os pontos numsector angular de 45º
? Se os pontos forem gerados de90º a 45º, apenas serão feitosmovimentos nas direcções de+x e –y
30
Conversão por varrimento da circunferência
? Algoritmo de Bresenham para a Circunferência (cont...)? Ideia básica
A melhor aproximação àA melhor aproximação àcircunferência verdadeira serádefinida por aqueles pixelsque estão a menor distânciada circunferência verdadeira.
31
Conversão por varrimento da circunferência
? Algoritmo de Bresenham para a Circunferência (cont...)? Note que se os pontos são gerados de
90º a 45º, podemos determinar cada90º a 45º, podemos determinar cadanovo tomando uma das seguintesacções:
? Mover uma unidade da direcção +x? Mover uma unidade na direcção +x
e uma na direcção -y? É preciso um método (eficiente) para
decidir entre essas duas alternativas!!!
32
Conversão por varrimento da circunferência
?? Algoritmo de Bresenham para a circunferência Algoritmo de Bresenham para a circunferência Sejam:
Relativamente ao pixel P3:
Relativamente ao ponto P
221
21 )1()( ryxSD iii −++= −−
P(xi-1,yi-1)
Relativamente ao ponto P2
Por definição D(Si)>0 e D(Ti)≤0Seja di = D(Si) + D(Ti)Então
A partir dessa equação e sabendo que (x0,y0)é (0,r) podemos obter que:
d1= 3 - 2*r
221
21 )1()1()( ryxTD iii −−++= −−
221
21
221
21 )1()1()1( ryxryxd iiiii −−+++−++= −−−−
33
Conversão por varrimento da circunferência
?? Algoritmo de Bresenham para a circunferência Algoritmo de Bresenham para a circunferência
Se di então sabemos quexi+1 = xi + 1; yi+1 = yi
P(xi-1,yi-1)
xi+1 = xi + 1; yi+1 = yiUtilizando a recorrência di (Exercício) podemosdeterminar quedi+1 = di + 4xi + 6
Se di
≤ 0
então sabemos quexi+1 = xi + 1; yi+1 = yi -1Utilizando a recorrência di (Exercício) podemosdeterminar quedi+1 = di + 4(xi – yi)+ 10
34
> 0
Conversão por varrimento da circunferência
?? AlgoritmoAlgoritmo dede BresenhamBresenham parapara aa circunferênciacircunferênciaOrganigrama:1. Inicializar r 1. Inicializar r -- raio, (h, k) raio, (h, k) –– centro da circunferência:centro da circunferência:
x = 0; y = raio da circunferência; d = 3x = 0; y = raio da circunferência; d = 3--2*r;2*r;2. Testar se a circunferência foi gerada totalmente: 2. Testar se a circunferência foi gerada totalmente: 2. Testar se a circunferência foi gerada totalmente: 2. Testar se a circunferência foi gerada totalmente:
se x > y, se x > y, STOPSTOP3. Calcular a localização do próximo pixel: 3. Calcular a localização do próximo pixel:
Se d<0 ? d = d+4*x+6; x = x+1; Se d≥0 ? d = d+4*(x-y)+10; x = x+1; y = y-1;
4. Desenhar os pontos da simetria: 4. Desenhar os pontos da simetria: (x+h, y+k); ((x+h, y+k); (--x+h, x+h, --y+k); y+k); (y+h, x+k); ((y+h, x+k); (--y+h, y+h, --x+k); x+k); ((--y+h, x+k); (y+h, y+h, x+k); (y+h, --x+k); x+k); ((--x+h, y+k); (x+h, x+h, y+k); (x+h, --y+k) y+k)
5. Continuar no passo 25. Continuar no passo 2 35
Conversão por varrimento da elipse?? Definição polinomial da elipseDefinição polinomial da elipse
? A elipse apresenta, tal como acircunferência simetrias.
? As simetrias da elipse são em relaçãoa dois eixos em vez de a quatroa dois eixos em vez de a quatroeixos.
? Definição Polinomial:
? onde? (h, k) – centro da elipse;? a – cumprimento do eixo maior? b – cumprimento do eixo menor
1)()(
2
2
2
2
=−+−b
kya
hxNeste método:Neste método:x varia de h até a;x varia de h até a;o valor de y é determinado o valor de y é determinado por:por:
ka
hxby +−−= 2
2
1
36
Conversão por varrimento da elipse?? Definição polinomial da elipseDefinição polinomial da elipse
Organigrama:1. Inicializar a – cumprimento do eixo maior, b – cumprimento do eixo
menor, (h, k) – centro da elipse:x = 0; i = incremento; xfim = a;x = 0; i = incremento; xfim = a;x = 0; i = incremento; xfim = a;x = 0; i = incremento; xfim = a;
2. Testar se a elipse foi gerada totalmente: se x > xfim, se x > xfim, STOPSTOP3. Calcular o valor de y:
4. Desenhar os pontos da simetria: (x+h, y+k); ((x+h, y+k); (--x+h, x+h, --y+k);y+k);((--x+h, y+k); (x+h, x+h, y+k); (x+h, --y+k) y+k)
5. Incrementar x: x = x + ix = x + i
6. Continuar no passo 2
2
2
1ax
by −=
37
Conversão por varrimento da elipse?? Definição trigonométrica da elipseDefinição trigonométrica da elipse
? Uma elipse pode ser definida mediante autilização de funções trigonométricas:
x = a*cos(θ)+h ; y = b*sen(θ)+k ,ondeθ – ângulo correntea – cumprimento do eixo maiorb – cumprimento do eixo menor(h, k) – centro da elipse
? Com este método, θ é sucessivamenteincrementado de 0 a π/2 e cada valor de xe y é calculado utilizando a definiçãotrigonométrica
38
Conversão por varrimento da elipse?? Definição trigonométrica da elipseDefinição trigonométrica da elipse
Organigrama:Organigrama:1. Inicializar a 1. Inicializar a –– cumprimento do eixo maior, b cumprimento do eixo maior, b –– cumprimento do cumprimento do
eixo menor, (h, k) eixo menor, (h, k) –– centro da elipse: centro da elipse: i = incremento, i = incremento, θθfimfim= (11/7) (== (11/7) (=ππ/2=90º); /2=90º); θθ = 0= 0fimfim
2.Testar se a elipse foi gerada totalmente: 2.Testar se a elipse foi gerada totalmente: se se θθ > > θθfimfim, STOP, STOP3. Calcular os valores:3. Calcular os valores:x = a*cos(x = a*cos(θθ); y = b*sen(); y = b*sen(θθ))4. Desenhar os pontos da simetria: 4. Desenhar os pontos da simetria: (x+h, y+k); ((x+h, y+k); (--x+h, x+h, --y+k); y+k);
((--x+h, y+k); (x+h, x+h, y+k); (x+h, --y+k) y+k) 5. Incrementar 5. Incrementar θθ::θθ = = θθ +i+i6. Continuar no passo 26. Continuar no passo 2
39
Conversão por varrimento de arcos
?? ArcosArcos? Um arco pode ser gerado quer usando o
método polinomial que o trigonométrico.? Quando é utilizado o método trigonométrico –? Quando é utilizado o método trigonométrico –
? O valor inicial θ e igual a θ1 e o valor final θ2
? Os restantes passos são semelhantes aos usadospara a conversão por varrimento da circunferência.
? Quando é utilizado o método polinomial –? O valor de x varia entre x1 e x2
? Os valores de y são calculados pela expressão:22 xr −
40
Conversão por varrimento de arcos?? ArcosArcos
Organigrama (Método Trigonométrico)1. Inicializar a – eixo maior, b – cumprimento do eixo menor,
(h, k) – centro do arco:i = incremento, i = incremento, θθ -- ângulo inicial, ângulo inicial, θθ –– ângulo finalângulo finali = incremento, i = incremento, θθ -- ângulo inicial, ângulo inicial, θθ1 1 –– ângulo finalângulo final
2. Testar se o arco foi gerado totalmente: se se θθ > > θθ11, , STOPSTOP
3. Calcular os valores:x = a*cos(x = a*cos(θθ)+h; y = b*sen()+h; y = b*sen(θθ)+k)+k4. Desenhar um ponto nas coordenadas (x,y) 5. Incrementar θ:
θθ = = θθ + i+ i1. Continuar no passo 2Nota: arco circular a = b = raio da circunferência 41
Geração de CaracteresEmEm ComputaçãoComputação GráficaGráfica existemexistem duasduas técnicastécnicas básicasbásicas parapara aageraçãogeração dede caracterescaracteres::
1. Cada caracter é definido através do seu contorno(curva o linha poligonal) que se desenha utilizandoprocedimentos do tipo “raster”. Esta solução é custosa
42
procedimentos do tipo “raster”. Esta solução é custosacomputacionalmente e não é muito utilizada em aplicaçõesde processamento de texto. Apenas é utilizada em aplicaçõesespecíficas que editem fontes.
2. Cada caracter é definido em termos de um bitmaprectangular. Gerar um caracter equivale a copiar apenasum bitmap para o ecrã. Todos os caracteres de todas asfontes disponíveis estão assim representadas com umrespectivo bitmap.
? A discretização dos segmentos pode causar distorções visuaiscomo cisalhamento ou efeito de escada.
Aliasing vs Anti-aliasing
? Essas distorções são chamadas de aliasing? Para reduzir o problema de aliasing, usa-se uma técnica
chamada anti-aliasing? A técnica consiste em uma superamostragem (uma vez que o
aliasing é causada por uma subamostragem)
43
SUPERAMOSTRAGEM
dividir os pixels em sub-pixels (i.e. 9), aplicar o algoritmo de Bresenham nesses sub-pixels
contar o número desub-pixels “acesos”
por pixel
O pixel será aceso com intensidade proporcional ao número de sub-pixels acesos.
23
1 3
3
3
44
Exemplo de Anti-aliasing em Linhas
? Quando a cor de fundo não é preto, o anti-aliasing deve fazer umacomposição da intensidade com a cor de fundo.
? Anti-aliasing é necessário não só para linhas, mas também paraestruturas mais complexas o que torna esta tarefa mais complicada. 45