Title: Universidade do Vale do Para
1Universidade do Vale do ParaíbaColégio Técnico
Antônio Teixeira FernandesDisciplina Introdução
a Computação Gráfica (ICG)
- Material I-Bimestre
- Primitivas 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.
3Algumas á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.
4Simulação de crescimento tumoral
Criação de texturas de pelos de animais
Simulador de Gestação
Criação de realidade virtual simulação de
deslocamento humano.
Imagem do leito de um rio em relevo
5Criação de modelagem orgânica digital
Sistema de informações geográficas
Simulador Neuro Cirúrgico
Cena de Praça pública (CCRV)
Auto-CAD Arquitetura e Edificações (AutoDesk)
6Vista Lateral (Praça Publica CCRV)
7Entretenimento (Jogos em 2D)
Tiro ao Alvo
Corrida
Estatística e Cinema
Cinema cena do filme (toyStoy - 1995)
-Estúdio Walt Disney Pictures / Pixar Animation
Studios
Gráfico (Estatística)
8Desenho confeccionado em AutoCad 2D usando
conceitos de primitivas básicas.
9Filme Shrek2004 - Produtora(s) DreamWorks SKG,
Pacific Data Images (PDI)
Simulação de Funcionamento de Máquinas usando
modelo Virtual AutoDesk.
Projeto trem de pouso aeronave
10Cena confeccionada pelos alunos André e Rafael
2008
Software - CCRV
11Cena vista de outro ângulo
Software - CCRV
12Caça F16 2009
13Caça F16 2009 (Francisco)
14- Introdução aos métodos de Computação Gráfica em
modo 2D.
15Primitivas 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).
16Pontos
- 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
17Representação de pixel
(coordenada - y)
(coordenada - x)
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.
18Eixo de coordenadas (800x600) ou (1024x768)
0 Colunas - x
y- Linhas - 0
19Sinal de vídeo Analógico
Linha impar
Linha par
20Exibiçã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.
21Vídeo Digital
22Pintando um pixel na práticausando C Builder
- Para se tratar elementos gráficos podemos usar
um objeto denominado Canvas que possibilita usar
primitivas gráficas.
Canvas
Ponto Linha Retângulo Elipse Arcos
OBJETO
23Criando um ponto
- Para se desenhar um ponto usa-se a propriedade
Pixels do objeto Canvas. - ExemploCanvas-gtPixelsxy 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.
24Tons monocromáticos
0
127
255
0
255
Faixa de tons de cinza gt C, portanto 0 lt C lt
255
25Intensidade Imagens Monocromáticas
26Demonstração da Tabela RGB abaixo.RGB(0,0,0)
27Exemplo da criação de um ponto no vídeo -
algoritmo
- Pintap(real x,y,cor)
- inicio
- pixelsxy lt- cor
- fim
28Linhas 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.
29Conceito Matemático de reta
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.
se
se
Â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.
(2)
(1)
30As formulas (1) e (2) serão base para construir
os algoritmos de retas
31DDA 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.
32Algoritmo DDA (codificado)
- retaDDA( real x0, y0, x1, y1)
- Inicio
- dx lt- x1 - x0
- dy lt- y1 - y0
- x lt- x0
- y lt- y0
- s lt- 0
- se (dx gt dy) entao
- s lt- dx
- senao
- s lt- dy
- fim_se
- xi lt- dx / s
- yi lt- dy / s
- Pintap( x,y, cor)
- Para x de 0 ate s faca
- x lt- x xi
- y lt- y yi
- Pintap( x,y, cor)
Exemplos valores (x0,y0)-(x1,y1)
(500,100)
(100,100)
(100,200)
(300,600)
33Breseham
- 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.
34Algoritmo de Breseham
- Calcula-se
- Calculam-se variáveis auxiliares
- Coloca-se nas variáveis o ponto inicial x
e y - Plota-se o ponto (x,y)
- Calcula-se os parâmetros de decisão
- Se p for negativo então x x 1, passa-se
para passo 8. - Se p for positivo ou zero, então x x 1, y y
1, - Repetem-se os passos 6 a 7 até que o ponto
seja alcançado
35C Builder, Breseham
- Em linguagens modernas esse algoritmo já
se encontra implementado e melhorado. Não havendo
necessidade de uma nova implementação.
36Algoritmo
- retaBreseham (inteirox0,y0,x1,y1)
- Inicio
- MoverAte(x0,y0)
- PintarAte(x1,x1)
- fim
37Métodos para segmentos de retas
- MoveTo() Determina o ponto inicial para um
segmento de reta. - Exemplo
- Canvas-gtMoveTo(x0,y0)
-
38MétodoLineTo()
- Determina o ponto final para o segmento de reta.
- Exemplo
- Canvas-gtLineTo(x1,y1)
39Exemplo Prático
- Canvas-gtMoveTo(100,100)
- Canvas-gtLineTo(100,200)
(100,100)
(100,200)
40Espessura 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-gtPen-gtWidth x
Espessura
41Cor da linha (Color)
- Propriedade Color determina a cor da linha
usando padrão RGB(). - Exemplo
- Canvas-gtPen-gtColor RGB(255,0,0)
42Tipos 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-gtPen-gtStyle ltEstilo da linhagt
-
43Estilos da Linha
Tipo Linha
PS_SOLID
PS_DASH
PS_DOT
PS_DASHDOT
PS_DASHDOTDOT
PS_NULL
44Criando um retângulo
- Método Rectangle() Cria um retângulo com a
indicação de dois pontos. - Exemplo
- Canvas-gtRectangle(5, 5, 100, 50)
45 46Cí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.
Raio
Obtemos a seguinte definição.
Centro
Essa definição não tem como ser usada em
computação gráfica.
47Definição válida para a computação gráfica.
- y f(x) ou x g(y), Isolando-se as variáveis
teremos
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.
Funções trigonométricas
É um ângulo que varia entre
49Precisã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
2
3
4
1
5
8
6
7
50Algoritmo do segmento de arcos e círculos usando
funções trigonométricas sentido horário.
- dArc(InteiroXc,Yc, raio,Ti,Tf, cor)
- Inicio
- moverAte(Xc,Yc)
- para teta de Ti ate Tf faca
- x lt- Xc raio cos(teta)
- y lt- 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
51Observação
- As Variáveis Ti e Tf, serão iniciadas com
valores em graus que deverão ser transformada em
radiano no momento de sua implementação que será
equivalente a teta. -
52- O algoritmo apresentado anteriormente conhecido
como funções polares irá apresentar falha de
precisão quando se aumentar o raio podem tornar
imprecisões no traçado do circulo ou arco Para
resolver esse problema existe um algoritmo
conhecido como ponto médio para círculos. - Esse algoritmo já se encontra implementado em
C.
53Implementando arcos precisos
- Método Arc() - Desenha círculos e arcos.
- Sintaxe
- Arc(Esq,top,Dir,Bai,Dir,Top,Esq,Top)
- Exemplo
- Canvas-gtArc(100,200,300,400,500,600,700,800)
54 Elipses
- Traç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 é
Onde
São as posições dos focos,
São as do ponto P distância até os focos.
p(x,y)
Essa definição não tem como ser usada em
computação gráfica.
55Para 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
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.
56Quadrante de simetria numa elipse
Quadrante Xn Yn
1 x y
2 -x y
3 -x -y
4 x -y
1
2
4
3
57Algoritmo do segmento de arcos para confecção da
elipse usando funções trigonométricas sentido
horário.
- dElipse(InteiroXc,Yc, Rx,Ry,Ti,Tf, cor)
- Inicio
- moverAte(Xc,Yc)
- para teta de Ti ate Tf faca
- x lt- Xc Ry cos(teta)
- y lt- 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 lt 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 anteriormente conhecido
como funções polares irá apresentar falha de
precisão quando se aumentar o raio podem tornar
imprecisões no traçado do circulo ou arco Para
resolver esse problema existe um algoritmo
conhecido como ponto médio para Elipse. - Esse algoritmo já se encontra implementado em
C.
59Ponto Médio para Elipse
- Método Ellipse() desenha uma elipse nas
coordenadas especificadas. - Exemplo
- Canvas-gtEllipse(Xc,Yc, Rx, Ry)
60Preenchimento 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.
61Propriedade Brush, Color
- Permite realizar o preenchimento em um
determinado objeto retângulo, círculo etc. - Exemplo
- Canvas-gtBrush-gtColor RGB(0,255,0)
- Canvas-gtRectangle(10,10, 100, 50 )
62Preenchimento Hachura
- Style Propriedade que permite realizar um
estilo de preenchimento em uma figura. - Exemplo
- Canvas-gtBrush-gtColor RGB(255,0,0)
- Canvas-gtBrush-gtStyle bsDiagCross
- Canvas-gtRectangle(100, 100,200, 200 )
63Tabela da propriedade Style
Obs São preenchimentos válidos apenas para o
objeto Canvas.
64Usando Textura
- Podemos preencher uma figura usando um arquivo
com uma imagem ou desenho. - Para realizar essa técnica usa-se um objeto da
classe Graphics. - Exemplo
- GraphicsTBitmap ObjBmp new
GraphicsTBitmap
65Usando o método LoadFromFile()
- Esse método irá carregar uma imagem ao fundo da
figura. - Exemplo
- ObjBmp-gtLoadFromFile("/Textura.bmp")
66Propriedade Brush, Bitmap
- Envolve toda uma imagem na área de uma figura.
- Exemplo
- Canvas-gtBrush-gtBitmap ObjBmp
67Exemplo
- GraphicsTBitmap BrushBmp new
GraphicsTBitmap - try
-
- BrushBmp-gtLoadFromFile(Textura.bmp")
- Canvas-gtBrush-gtBitmap BrushBmp
- Canvas-gtEllipse(10,200,300,400)
-
- __finally
-
- Canvas-gtBrush-gtBitmap NULL
- delete BrushBmp
-
68Associando figuras a imagens
- Exemplo
- TCanvas pCanvas Image1-gtCanvas
- pCanvas-gtBrush-gtStyle bsVertical
- pCanvas-gtBrush-gtColor RGB(0,0,255)
- pCanvas-gtRectangle(0, 0, Image1-gtWidth,
Image1-gtHeight)
69Desenhando Graficamente um texto
Subida
Altura
Descida
Linha de base
Tamanho da fonte
70Criação de textos
- TextOutA() Permite desenhas um texto nas
coordenadas especificadas. - Sintaxe Canvas-gtTextOutA(x,y,String)
- Exemplo
- Canvas-gtTextOutA(100,200,Tchuk)
71Modificando atributos do texto
Propriedade Font
Propriedades Valores
Color RGB()
Size Tamanho da fonte
Name Nome da fonte (Times New Roman)
Style fsBold,fsItalic,fsUnderline,fsStrikeOut
72Exemplo prático de texto formatado
- Canvas-gtFont-gtColor RGB(255,0,0)
- Canvas-gtFont-gtSize 50
- Canvas-gtFont-gtName "Times New Roman"
- Canvas-gtFont-gtStyle TFontStyles() ltlt fsBold
ltlt fsStrikeOut ltlt fsUnderline - Canvas-gtTextOutA(100,200,Bom Dia !!!")
73Transformações Geométricas 2D
- Chamamos de transformação o ato de levar um
objeto de um ponto para outro, num sistema de
referências. As transformações mais usadas são - Translação
- Rotação
- Escala.
74Translação
- Chamamos de translação o ato de levar um objeto
de um ponto para outro, num sistema de
referência. Dado um ponto original (x,y) existe
um ponto (x,y) translação, que corresponde ao
ponto original dado por
(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.
xxtx
yyty
75Aplicação de uma translação
y0ty
y1ty
y0
y1
x0
x1
Translação
76Implementação de uma translação
- int x0 10 int y0 10
- int x1 100 int y1 50
- ty 70
- Canvas-gtRectangle(x0,y0,x1,y1 )
- Canvas-gtRectangle(x0,y0ty,x1,y1ty )
Vetor de translação horizontal
77Rotação
- Dá-se o nome de rotação ao ato de girar um
objeto de um ângulo, num sistema de referência.
78Exemplo de Aplicação de Rotação em torno de um
eixo.
Para ajuste no primeiro quadrante os valores
devem ser negativos.
xxc r cos(180teta) yyc r
sen(180teta)
(100,200)
r
Origem (xc,yc)
(x,y)
teta 90 graus
79Implementação em C de Rotação em torno de um
eixo de referência
- Canvas-gtFont-gtSize 50
- Canvas-gtFont-gtColor RGB(0,0,255)
- Canvas-gtTextOutA(100,200,".")
- double r 50
- double x1 100 r cos((180 3.141592) /
180) - double y1 200 r sin((180 3.141592) /
180) - Canvas-gtFont-gtColor RGB(255,0,0)
- Canvas-gtTextOutA(x1,y1,".")
80Escala
- 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.
81Formalizaçã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
82Aplicando Escala
y0
y1 Sy
y
x0
x1
Sx
x
83Implementação de escala em uma figura.
- int x0100 int y0200
- int x1300 int y1250
- int sx2 int sy2
- Canvas-gtPen-gtColor RGB(255,0,0)
- Canvas-gtBrush-gtStyle bsCross
- Canvas-gtBrush-gtColor RGB(0,0,255)
- Canvas-gtRectangle(x0,y0,x1,y1)
- ShowMessage(" ")
- Canvas-gtRectangle(x0,y0,x1sx,y1sy )
84Introduçã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.
85Formação da Imagem
86(No Transcript)
87(No Transcript)
88(No Transcript)
89Processamento 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.
90Computação Gráfica (CG)
Cone de raio 1 altura 1, pós observador, pós
iluminação, fundo, etc.
Processamento em CG
Estuda os métodos de se criar imagens sintéticas
a partir de especificações.
91Tipo 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
92Importante
- 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.
93Abrindo um arquivo de imagem.
- Primeiro o objeto da classe Image deve ser
instanciado.
Image1-gtPicture-gtLoadFromFile("C/PImagem/bolas.bm
p")
94Fazendo 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.
95Exemplo Varredura Horizontal
Largura (width)
(Xn1,Yn1)
Altura (height)
96Capturando o tamanho da imagemWidth e Height
- // Cria um ponteiro do tipo Imagem.
- GraphicsTBitmap Bmp new
GraphicsTBitmap - // Exibe imagem na tela
- Tela-gtPicture-gtLoadFromFile("C/Caminho/bolas
.bmp") - // Aponta para o endereço da imagem
- Bmp Tela-gtPicture-gtBitmap
- // Captura o tamanho da imagem
- int largura Bmp-gtWidth
- int altura Bmp-gtHeight
97Identificando 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.
98Mé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-gtCanvas-gtPixelsxy r
GetRValue(captura_cor) g GetGValue(captura_cor
) b GetBValue(captura_cor)
99Criando a varredura por arranjos simples.
A, são arranjos simples de S elementos tomados 2
a 2.(par ordenado)
Seja Z
S, área retangular da imagem.
x
S
y
100Exemplo (Troca a imagem de cor)
- GraphicsTBitmap Bmp new
GraphicsTBitmap - Tela-gtPicture-gtLoadFromFile("C/PImagem/taco.bm
p") - Image1-gtPicture-gtLoadFromFile("C/PImagem/taco.
bmp") - Bmp Tela-gtPicture-gtBitmap
- TColor captura_cor
- byte r,g,b
- int largura Bmp-gtWidth
- int altura Bmp-gtHeight
- for(int coluna0colunaltlarguracoluna)
- for(int linha0linhaltalturalinha)
- captura_cor Bmp-gtCanvas-gtPixelscolun
alinha - r GetRValue(captura_cor)
- g GetGValue(captura_cor)
- b GetBValue(captura_cor)
- if(r 255 g 0 b 0)
- Bmp-gtCanvas-gtPixelscolunalinha
RGB(0,0,0) -
101Capturando cores objeto da classe TColorDialog
(Dialog)
Retorna com os tons nas faixas RGB correspondente
a cor selecionada.
102Método Execute()
- Realiza a abertura da caixa de dialogo
(ColorDialog1), para escolha da cor desejada. - boolean logico Cd-gtExecute()
103Capturando a cor selecionada.
- TColor cor ColorDialog1-gtColor
- Byte r GetRValue(cor)
- Byte g GetGValue(cor)
- Byte b GetBValue(cor)
Captura as cores escolhidas nas faixas adequadas.
104TPerformanceGraph (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.
105Mé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-gtDataPoint(ltcorgt,ltpontogt )
106Update()
- Realiza a impressão do ponto no gráfico.
- Sintaxe
- Obj_perf-gtUpdate()
107Exemplo de gráfico da f(x) x2, onde 10 lt x
lt 30
- int b 30
- for(int x -10xltbx)
- int y pow(x,2)
- Pg-gtDataPoint(RGB(255,0,0),abs(y))
- Pg-gtUpdate()
- Pg-gtRefresh()
-
O programa acima irá imprimir uma parábola como
mostra a figura, acima.