universidade do vale do paraíba colégio técnico antônio ...i-bim).pdf · elementos básicos de...
TRANSCRIPT
1
Universidade do Vale do Paraíba
Colégio Técnico Antônio Teixeira Fernandes
Disciplina Introdução a Computação Gráfica
(ICG)
Material I-BimestrePrimitivas Gráficas em 2D, Conceito de pontos pixel, Sistema de
cores,linhas retas,Algoritmo DDA,Breseham,Linhas cores e
espessuras, Traçando círculos e elipses,Coordenadas polares,
preenchimento de áreas, transformações geométricas em duas
dimensões, Tratamento Imagens BMP(Mapa de Bits)
Site : http://www1.univap.br/~wagner
Prof. Responsável
Wagner Santos C. de Jesus
2
Computação Gráfica (CG)
• Vem a ser a forma de se fazer uma
representação da realidade graficamente na
resolução de computadores.
• A CG vem auxiliando nas mais diversas
áreas do conhecimento; facilitando a
visualização e simulação de eventos sociais,
culturais e científicos.
3
Algumas áreas de atuação da computação
gráfica
• Engenharia – Simulação e CAD
• Bioengenharia – Simulação de crescimento tumoral
• Medicina – Sistemas de eletrocardiograma e Tomografias
• Arte e Cinema – (Efeitos especiais e personagens).
Representação de quadros e esculturas
• Fotografia – Processamento de imagens
• Geografia – Sistema informações geográficas
• Arquitetura – Sistemas especializados em plantas de
edificações.
• Entretenimento e cultura – Jogos e vídeo games.
• Matemática, Física e estatística.
4
Simulação de crescimento tumoral
Criação de texturas de pelos de
animais
Criação de realidade virtual
simulação de deslocamento
humano.
Imagem do leito de um rio
em relevo
Simulador de Gestação
5
Criação de modelagem orgânica
digital
Sistema de informações
geográficas
Auto-CAD – Arquitetura e
Edificações (AutoDesk)
Simulador Neuro
Cirúrgico
Cena de Praça pública (CCRV)
6
Vista Lateral (Praça Publica CCRV)
7
0
10
20
30
40
50
60
70
80
90
1° Trim 2° Trim 3° Trim 4° Trim
Leste
Oeste
Norte
Entretenimento (Jogos em 2D)
Tiro ao Alvo Corrida
Gráfico (Estatística)
Cinema cena do filme (toyStoy -
1995) -Estúdio: Walt Disney
Pictures / Pixar Animation
Studios
Estatística e Cinema
9
Filme Shrek
2004 - Produtora(s): DreamWorks SKG, Pacific Data Images (PDI)
Simulação de Funcionamento de
Máquinas usando modelo Virtual
AutoDesk.Projeto trem de pouso
aeronave
15
Primitivas Gráficas – 2D
Chamamos de primitivas gráficas os
comandos e funções que manipulam e
alteram os elementos gráficos de uma
imagem. Também entram na definição os
elementos básicos de gráficos a partir dos
quais são construídos outros, mais
complexos.(Hetem Annibal Jr.,2006).
16
Pontos
• O ponto é a unidade gráfica fundamental e
também pode ser chamada de pixel.
Propriedades de um pixel :
- Posição no plano gráfico (x,y)
- Cor
17
Representação de pixel
• (x,y) preto
(coordenada - x)
(coordenada - y)
Para se obter um pixel é necessário informar o par ordenado
(x,y), que possibilita as coordenadas de linha e coluna onde
será pintada a grade do vídeo; de acordo com a resolução
especificada no sistema operacional.
20
Exibição do vídeo
O video é exibido lendo-se eletronicamente o sinal de vídeo e
transformando-o no movimento do feixe de elétrons que varre a tela do
monitor analógico.
22
Pintando um pixel na prática
usando C++ Builder
Para se tratar elementos gráficos podemos usar
um objeto denominado Canvas que possibilita usar
primitivas gráficas.
CanvasOBJETO Ponto
Linha
Retângulo
Elipse
Arcos
23
Criando um ponto
Para se desenhar um ponto usa-se a
propriedade Pixels do objeto Canvas.
Exemplo:Canvas->Pixels[x][y] = RGB(0,0,0);
Onde x coordenada da coluna; e y
coordenada da linha a função RGB
determina a cor do pixel que será plotado na
tela.
27
Exemplo da criação de um ponto no
vídeo - algoritmo
Pintap(Inteiro : x,y,cor)
inicio
pixels[x][y] <- cor;
fim
28
Linhas Retas
• Para se desenhar uma reta é necessário usar
primitivas gráficas, onde as primitiva vem a
ser um conjunto de algoritmos para se
realizar elementos gráficos mais complexos.
29
Conceito Matemático de reta
bmxy
1m
1m
Onde (m) Coeficiente ângular em
relação ao eixo x.
Ângulo entre 0º e 45º com eixo x, o
Coeficiente linear b dá o valor do
eixo y.
01
01
xx
yym
11 mxyb
Ângulo entre 45º e 90º com eixo x.
Dados dois pontos no plano P1 e P2, pode-se obter m e b
da seguinte maneira.
se
se
(1) (2)
31
DDA – Digital Diferencial Analyser
(Analisador Diferencial Digital)
Trata-se de um algoritmo que respeita as
equações de coeficiente angular e linear
mostrados anteriormente; Porem esse
algoritmo torna-se ineficiente em alguns
caso mostrando uma certa descontinuidade
nas retas desenhadas.
32
Algoritmo DDA (codificado)
retaDDA( real : x0, y0, x1, y1)
Inicio
dx <- x1 - x0
dy <- y1 - y0
x <- x0
y <- y0
s <- 0
se (dx > dy) entao
s <- dx
senao
s <- dy
fim_se
xi <- dx / s
yi <- dy / s
Pintap( x,y, cor)
Para x de 0 ate s faca
x <- x + xi
y <- y + yi
Pintap( x,y, cor)
fim_para
fim
(100,200)
(300,600)
(100,100) (500,100)
Exemplos valores (x0,y0)-(x1,y1)
33
Breseham
Esse algoritmo baseia-se no argumento
de que um segmento de reta, ao ser plotado,
deve ser contínuo, os pixels que compõem o
segmento devem ser vizinhos; Isso fará com
que os pontos das retas sejam próximos não
havendo separação entre os pixels pintados.
34
Algoritmo de Breseham
1. Calcula-se
2. Calculam-se variáveis auxiliares:
3. Coloca-se nas variáveis o ponto inicial: x = e y =
4. Plota-se o ponto (x,y)
5. Calcula-se os parâmetros de decisão:
6. Se p for negativo então x = x + 1, passa-se para passo 8.
7. Se p for positivo ou zero, então x = x + 1, y = y + 1,
8. Repetem-se os passos 6 a 7 até que o ponto seja alcançado
0101 yyyexxx
xyye 222
xyp 2
ypp 2
xypp 22
),( 11 yx
0x 0y
35
C++ Builder, Breseham
Em linguagens modernas esse algoritmo
já se encontra implementado e melhorado.
Não havendo necessidade de uma nova
implementação.
37
Métodos para segmentos de retas
MoveTo() : Determina o ponto inicial para um
segmento de reta.
Exemplo :
Canvas->MoveTo(x0,y0);
38
Método:LineTo():
Determina o ponto final para o segmento de
reta.
Exemplo :
Canvas->LineTo(x1,y1);
40
Espessura de uma linha
Propriedade : Pen Permite ativar a
caneta gráfica; em conjunto com Width que
determina espessura de um seguimento de
reta.
Exemplo :
Canvas->Pen->Width = x ;
Espessura
41
Cor da linha (Color)
Propriedade : Color determina a cor da
linha usando padrão RGB().
Exemplo :
Canvas->Pen->Color = RGB(255,0,0);
42
Tipos de linhas
Para usar os tipos de linhas usando
objeto Canvas implementado em C++, usa-se as
propriedades Pen,Style; determina o tipo de linha
que será usada em uma figura.
Sintaxe :
Canvas->Pen->Style = <Estilo da linha>;
44
Criando um retângulo
Método Rectangle() : Cria um retângulo
com a indicação de dois pontos.
Exemplo :
Canvas->Rectangle(5, 5, 100, 50);
46
Círculos
Traçado de um círculos:
Um circulo vem a ser um conjunto de pontos que estão a uma
mesma distância de um ponto; essa distância é também chamada de
raio. E o ponto distante de todos os outros é o centro.
Centro 222ryyxx cc
Obtemos a seguinte
definição.
Essa definição não tem como ser usada em computação
gráfica.
47
Definição válida para a computação gráfica.
y =f(x) ou x = g(y), Isolando-se as variáveis teremos
22
22
)(
)(
cc
cc
xxryy
yyrxx g(y)
f(x)
Essa definição quando um segmento de círculo fica
quase horizontal ou vertical um incremento e x ou y
tornará o arco descontinuo.
48
Para podermos criar um algoritmo que
desenhe o seguimento circular devemos converte as
expressões anteriores em coordenadas polares. Como
função de raio e de um ângulo.
sen
cos
ryy
rxx
c
c
20aÉ um ângulo que varia entre
Funções trigonométricas:
49
Precisão dependente do raio do
círculo
Octante Xn Yn
1 x y
2 y x
3 y -x
4 -x y
5 -x -y
6 -y -x
7 -y x
8 x -y
1
23
4
5
6 7
8
4/0 até
50
Algoritmo do segmento de arcos e círculos usando funções
trigonométricas sentido horário.
dArc(Inteiro:Xc,Yc, raio,Ti,Tf, cor)
Inicio
moverAte(Xc,Yc)
para teta de Ti ate Tf faca
x <- Xc + raio * cos(teta)
y <- Yc + raio * sin(teta)
Pintap(x,y,cor)
fim_para
fim
Xc, Yc – Centro Arco
Raio – Distância do
centro nos pontos que
formam o arco
Ti, Tf – valores iniciais e
finais de
Cor : poderá ser três
variáveis inteiras para
receber valores RGB.
Para forma um circulo deverá estar entre 0 e 2
51
Observação
As Variáveis Ti e Tf, serão iniciadas com valores em graus quedeverão ser transformada em radiano no momento de suaimplementação; que será equivalente a teta.
º180
52
O algoritmo apresentado anteriormenteconhecido como funções polares; iráapresentar falha de precisão quando seaumentar o raio podem tornar imprecisõesno traçado do circulo ou arco; Pararesolver esse problema existe um algoritmoconhecido como ponto médio para círculos.
Esse algoritmo já se encontraimplementado em C++.
53
Implementando arcos precisos
Método : Arc() - Desenha círculos e arcos.
Sintaxe :
Arc(Esq,top,Dir,Bai,Dir,Top,Esq,Top)
Exemplo :
Canvas->Arc(100,200,300,400,500,600,700,800);
54
ElipsesTraçado de uma Elipse:
Uma elipse é definida como um conjunto de pontos cuja soma das
distâncias para dois pontos fixos é constantes. Onde os dois pontos fixos
são chamados de foco da elipse. Sua definição matemática é:
2
2
2
2
2
1
2
121 )()()()( yyxxyyxxdd
),(),( 2211 yxeyx21eddOnde São as posições dos focos,
São as do ponto P distância até os focos.
p=(x,y)
1d 2dEssa definição não
tem como ser usada
em computação
gráfica.
55
Para se obter um algoritmo que satisfaça as
definições em computação gráfica.
Se faz necessário uma definição f(x) e g(y).
Coordenada polar
sen
cos
yc
xc
rxx
ryy
rx e ry referem-se aos raios da elipse na direção x e y, (xc, yc) é o
centro da elipse. é um ângulo que vária entre 0 e 2 O número de passos deverá aumentar com o raio.
57
Algoritmo do segmento de arcos para confecção da elipse
usando funções trigonométricas sentido horário.
dElipse(Inteiro:Xc,Yc, Rx,Ry,Ti,Tf, cor)
Inicio
moverAte(Xc,Yc)
para teta de Ti ate Tf faca
x <- Xc + Ry * cos(teta)
y <- Yc + Rx * sin(teta)
Pintap(x,y,cor)
fim_para
fim
Xc, Yc – Centro Arco
Rx, Ry – Raio da elipse
na direção x e y. Rx < Ry
Ti, Tf – valores iniciais e
finais de
Cor : poderá ser três
variáveis inteiras para
receber valores RGB.
Para forma um circulo deverá estar entre 0 e 2
58
O algoritmo apresentado anteriormenteconhecido como funções polares; iráapresentar falha de precisão quando seaumentar o raio podem tornar imprecisõesno traçado do circulo ou arco; Pararesolver esse problema existe um algoritmoconhecido como ponto médio para Elipse.
Esse algoritmo já se encontraimplementado em C++.
59
Ponto Médio para Elipse
Método : Ellipse() desenha uma elipse
nas coordenadas especificadas.
Exemplo :
Canvas->Ellipse(Xc,Yc, Lx, Ay);
60
Preenchimento de áreas
Ao se desenhar um objeto além de seu
contorno o mesmo poderá possuir cores em seu interior
podendo ser visualizadas. Em C++ encontramos
implementados esse algoritmos o que normalmente se
usa é o preenchimento recursivo.
61
Propriedade Brush, Color
Permite realizar o preenchimento em um
determinado objeto retângulo, círculo etc.
Exemplo :
Canvas->Brush->Color = RGB(0,255,0);
Canvas->Rectangle(10,10, 100, 50 );
62
Preenchimento Hachura
Style : Propriedade que permite realizar
um estilo de preenchimento em uma figura.
Exemplo :
Canvas->Brush->Color = RGB(255,0,0);
Canvas->Brush->Style = bsDiagCross;
Canvas->Rectangle(100, 100,200, 200 );
64
Usando Textura
Podemos preencher uma figura usandoum arquivo com uma imagem ou desenho.
Para realizar essa técnica usa-se umobjeto da classe Graphics.
Exemplo :
Graphics::TBitmap *ObjBmp = new Graphics::TBitmap;
65
Usando o método LoadFromFile()
Esse método irá carregar uma imagem
ao fundo da figura.
Exemplo :
ObjBmp->LoadFromFile("/Textura.bmp");
66
Propriedade Brush, Bitmap
Envolve toda uma imagem na área de
uma figura.
Exemplo :
Canvas->Brush->Bitmap = ObjBmp;
67
Exemplo :Graphics::TBitmap *BrushBmp = new Graphics::TBitmap;
try
{
BrushBmp->LoadFromFile(“Textura.bmp");
Canvas->Brush->Bitmap = BrushBmp;
Canvas->Ellipse(10,200,300,400);
}
__finally
{
Canvas->Brush->Bitmap = NULL;
delete BrushBmp;
}
68
Associando figuras a imagens
Exemplo :
TCanvas *pCanvas = Image1->Canvas;
pCanvas->Brush->Style = bsVertical;
pCanvas->Brush->Color = RGB(0,0,255);
pCanvas->Rectangle(0, 0, Image1->Width, Image1->Height);
70
Criação de textos
TextOutA() : Permite desenhas um texto
nas coordenadas especificadas.
Sintaxe : Canvas->TextOutA(x,y,String);
Exemplo :
Canvas->TextOutA(100,200,”Tchuk”);
71
Modificando atributos do textoPropriedade : Font
Propriedades Valores
Color RGB()
Size Tamanho da fonte
Name Nome da fonte : (Times New Roman)
Style fsBold,fsItalic,fsUnderline,fsStrikeOut
72
Exemplo prático de texto formatado
Canvas->Font->Color = RGB(255,0,0);
Canvas->Font->Size = 50;
Canvas->Font->Name = "Times New Roman";
Canvas->Font->Style = TFontStyles() << fsBold << fsStrikeOut << fsUnderline;
Canvas->TextOutA(100,200,“Bom Dia !!!");
73
Transformações Geométricas – 2D
Chamamos de transformação o atode levar um objeto de um ponto paraoutro, num sistema de referências. Astransformações mais usadas são :
• Translação
• Rotação
• Escala.
74
Translação
Chamamos de translação o ato de levar umobjeto de um ponto para outro, num sistema dereferência. Dado um ponto original (x,y) ; existe umponto (x’,y’) translação, que corresponde ao pontooriginal dado por:
{x’=x+tx
y’=y+ty
(tx, ty) – É chamado de
vetor de translação ou vetor
de deslocamento tx quantos
pixels a figura está
deslocada na horizontal e ty
quantos pixels a figura esta
deslocada na vertical.
76
Implementação de uma translação
int x0 = 10; int y0 = 10;
int x1 = 100; int y1 =50;
ty = 70;
Canvas->Rectangle(x0,y0,x1,y1 );
Canvas->Rectangle(x0,y0+ty,x1,y1+ty );
Vetor de translação horizontal
77
Rotação
Dá-se o nome de rotação ao ato de girar um
objeto de um ângulo, num sistema de referência.
cossen'
sencos'
yxy
yxx
78
Exemplo de Aplicação de Rotação em
torno de um eixo.
Origem (xc,yc)
(100,200)
{
x’=xc + r * cos(180+teta)
y’=yc + r * sen(180+teta)
teta = 90 graus
r(x’,y’)
Para ajuste no primeiro
quadrante os valores
devem ser negativos.
79
Implementação em C++ de Rotação
em torno de um eixo de referência
Canvas->Font->Size = 50;
Canvas->Font->Color = RGB(0,0,255);
Canvas->TextOutA(100,200,".");
double r = 50;
double x1 = 100 + r * cos((180 * 3.141592) / 180);
double y1 = 200 + r * sin((180 * 3.141592) / 180);
Canvas->Font->Color = RGB(255,0,0);
Canvas->TextOutA(x1,y1,".");
80
Escala
Quando se aplica uma transformação de
escala a um objeto, o resultado é um novo
objeto semelhante ao original, mas
“esticado” ou “encolhido”. Pode-se aplicar
escala com valores diferentes para cada
dimensão; por exemplo, dobrar um objeto
na direção horizontal e dividir na vertical.
81
Formalização da Escala
Uma escala é determinada pelo vetor de escala
(Sx ,Sy). Onde Sx é a escala aplicada na direção x, e
Sy é a escala aplicada na direção y.
Equação :x’= xsx
y’= ysy{
83
Implementação de escala em uma
figura.
int x0=100; int y0=200;
int x1=300; int y1=250;
int sx=2; int sy=2;
Canvas->Pen->Color = RGB(255,0,0);
Canvas->Brush->Style = bsCross;
Canvas->Brush->Color = RGB(0,0,255);
Canvas->Rectangle(x0,y0,x1,y1);
ShowMessage(" ");
Canvas->Rectangle(x0,y0,x1*sx,y1*sy );
84
Introdução : Processando Imagens
Bitmap
• Processamento de imagem é qualquer
forma de processamento de dados no qual a
entrada e saída são imagens tais como
fotografias ou quadros de vídeo.
89
Processamento computacional envolvendo imagens
Processar
Imagem
Processamento
de
Imagens
Processamento de Imagens – Estuda as transformações de imagens,
que pode ser de uma imagem em outra ou a estimação de
parâmetros da imagem.
90
Computação Gráfica (CG)
Processamento
em CG
Cone de raio 1
altura 1, pós
observador, pós
iluminação, fundo,
etc.
Estuda os métodos de se criar imagens sintéticas a partir de
especificações.
91
Tipo Bitmap
• Device Independent Bitmap (DIB) ou
Windows Bitmap (BMP) é um formato de
gráficos por mapa de bits (composto por
pixeis) usado pelos gráficos de subsistema
(GDI) do Microsoft Windows, e é usada
geralmente como um formato de gráficos
nessa plataforma.
GDI - Graphics Device Interface
92
Importante:
• Um arquivo do tipo BMP é mais seguro
para ser manipulado por não ter compressão
de informações em seu formato causando a
perda de qualidade na imagem ou figura.
93
Abrindo um arquivo de imagem.
• Primeiro o objeto da classe Image deve ser
instanciado.
Image1->Picture->LoadFromFile("C:/PImagem/bolas.bmp");
94
Fazendo leitura da Imagem
• Uma das técnica mais simples para realizar a
leitura de uma imagem é chamada de varredura
horizontal. Onde pega-se o tamanho da área
ocupada pela imagem e realiza-se a leitura dos
pixels até o final de cada linha fazendo isso até o
final da imagem.
95
Exemplo : Varredura Horizontal
Altura
(height)
Largura (width)
1
1
y
x
)(
)(arg
linhasAltura
colunasuraL
(Xn+1,Yn+1)
96
Capturando o tamanho da imagem
Width e Height
// Cria um ponteiro do tipo Imagem.
Graphics::TBitmap *Bmp = new Graphics::TBitmap;
// Exibe imagem na tela
Tela->Picture->LoadFromFile("C:/Caminho/bolas.bmp");
// Aponta para o endereço da imagem
Bmp = Tela->Picture->Bitmap;
// Captura o tamanho da imagem
int largura = Bmp->Width;
int altura = Bmp->Height;
97
Identificando a cor do pixel.
Criar um objeto da classe TColor.
Exemplo : TColor captura_cor;
Esse objeto irá permitir reconhecer cores da
imagem no formato RGB.
98
Método Descrição
GetRValue(cor) Retorna intensidade de cor
vermelha.
GetGValue(cor) Retorna intensidade de cor verde.
GetBValue(cor) Retorna intensidade de cor azul.
Exemplo :
byte r,g,b;
TColor captura_cor;
captura_cor = Bmp->Canvas->Pixels[x][y];
r = GetRValue(captura_cor);
g = GetGValue(captura_cor);
b = GetBValue(captura_cor);
99
Criando a varredura por arranjos
simples.
).( S
S, área retangular da
imagem.
S
A, são arranjos simples de S elementos
tomados 2 a 2.(par ordenado)
},{ 1 nnn yxZSeja: Z
x
y
100
Graphics::TBitmap *Bmp = new Graphics::TBitmap;
Tela->Picture->LoadFromFile("C:/PImagem/taco.bmp");
Image1->Picture->LoadFromFile("C:/PImagem/taco.bmp");
Bmp = Tela->Picture->Bitmap;
TColor captura_cor;
byte r,g,b;
int largura = Bmp->Width;
int altura = Bmp->Height;
for(int coluna=0;coluna<=largura;coluna++) {
for(int linha=0;linha<=altura;linha++){
captura_cor = Bmp->Canvas->Pixels[coluna][linha];
r = GetRValue(captura_cor);
g = GetGValue(captura_cor);
b = GetBValue(captura_cor);
if(r == 255 && g == 0 && b ==0)
Bmp->Canvas->Pixels[coluna][linha] = RGB(0,0,0);
}
}
Bmp->SaveToFile("C:/PImagem/taconovo.bmp");
Exemplo : (Troca a imagem de cor)
101
Capturando cores
objeto da classe TColorDialog (Dialog)
Retorna com os tons nas faixas RGB correspondente a cor
selecionada.
102
Método Execute()
Realiza a abertura da caixa de dialogo
(ColorDialog1), para escolha da cor
desejada.
boolean logico = Cd->Execute();
103
Capturando a cor selecionada.
TColor cor = ColorDialog1->Color;
Byte r = GetRValue(cor);
Byte g = GetGValue(cor);
Byte b = GetBValue(cor);
Captura as cores escolhidas nas faixas adequadas.
104
TPerformanceGraph (Sample)
Cria uma área para representação de
gráficos de funções matemáticas periódicas.
Onde as grades representam uma
determinada escala para representações e
leituras dos gráficos.
105
Método: DataPoint()
Realiza a atribuição de pontos e cor na
área do objeto, PerformanceGraph
permitindo plotar um gráfico com
deslocamento no período.
Sintaxe :
Obj_perf->DataPoint(<cor>,<ponto> );
107
Exemplo: de gráfico da f(x) = x2, onde –10 <= x <= 30
int b = 30;
for(int x = -10;x<=b;x++) {
int y = pow(x,2);
Pg->DataPoint(RGB(255,0,0),abs(y));
Pg->Update();
Pg->Refresh();
}0
100
200
300
400
500
600
700
800
900
1000
1 4 7
10
13
16
19
22
25
28
31
34
37
40
O programa acima irá imprimir uma parábola como mostra a figura,
acima.