![]() |
![]() |
Processo de Visualização 2D
Suponha um programa de desenho onde a área disponível, na tela, para a exibição dos objetos é de tamanho fixo. Uma das facilidades do programa é a ferramenta de ZOOM. Explique detalhadamente quais as etapas envolvidas no processo de realização do Zoom. Considere deste a marcação da área de zoom, até a reexibição do desenho. Assuma a existência de uma rotina(DesenhaTudo) capaz de reexibir todo o desenho, já realizando o recorte. Explique como são obtidos os valores limites para as janelas de exibição e seleção. Quem informa este valores, o programador ou o usuário ?. Mostre quais as rotinas necessárias para conversão de coordenadas. Voce NÃO pr4eceisa criar o código das rotinas, apenas explique em detalhes o que elas fazem.
Explique qual a utilidade da etapa de Instanciamento no processo de visualização bidimensional.
Dê um exemplo em que se possa mostra porque a técnica de Instanciamento pode economizar memória. Assuma que 1 número inteiro ocupa 2 bytes.
Desenhe na Viewport a abaixo o triângulo (10,10)-(20,50)-(30-10). Estas coordenadas referem-se ao modelo do triângulo no universo. Considere cada uma das windows especificadas.
Window : (0,0)-(100,200)
Window : (0,0)-(200,100)
Window : (0,0)-(1000,60)
Qual a utilidade do algoritmo de recorte de Cohen Sutherland? Mostre 3 exemplos.
Crie
uma rotina para implementar o algoritmo de
recorte de linhas por subdivisão recursiva.
Use o seguinte cabeçalho: Subdivide(X1,
Y1, X2, Y2);
Suponha um programa de desenho onde a área disponível, na tela, para a exibição dos objetos é de tamanho fixo. Utilizando os conceitos de Janela de Seleção(window) e Janela de Visualização como seria possível exibir uma certa parte de um desenho com um tamanho maior na tela ?
Suponha um programa de desenho onde haja disponível, na tela, duas áreas de tamanhos diferentes para a exibição dos objetos. Utilizando os conceitos de Janela de Seleção(window) e Janela de Visualização como seria possível exibir os mesmos objetos em ambas as regiões ?
Curvas Paramétricas
Crie 4 pontos e trace uma curva de Catmull-Rom que passe por eles. Calcule as coordenadas do vetores necessários para o traçado. Cuide a nomenclatura e as coordenadas dos vetores e dos pontos.
Defina uma estrutura de dados capaz de guardar os pontos de controle de uma seqüência de curvas Bèzier.
Explique a criação de uma curva Bèzier por 3 pontos a partir da equação paramétrica da reta
Como se pode garantir continuidade de derivada entre dois segmentos de curva Bèzier. Mostre com desenhos e apresente as fórmulas para o cálculo dos vetores. Tome muito cuidado com a nomenclatura dos vetores e dos pontos. Crie uma rotina para gerar o(s) dados(s) necessários a manutenção da continuidade.
Imagine
um sistema em que usuário clique
4 pontos.
Após a marcação destes pontos, o
programa ativa
uma rotina de traçado de curvas Hermite chamada TracaHermite(PA,
PB, VA, VB), que deve
receber o pontos inicial e final da
curva (PA e PB) e os vetores nestes pontos (VA e VB).
Se os pontos clicados pelo usuário fossem P1, P2, P3 e P4,
como
poderia ser a chamada da rotina de traçado da Hermite.
Faça o código necessário à
chamada.
Trace as curvas Bèzier a partir dos pontos a abaixo.
Crie uma rotina em C "ArrumaCurva (CURVA C[10])" capaz de gerar os dados necessários à manutenção de continuidade de derivada entre todos 10 segmentos de uma curva Bèzier. Mostre com desenhos e apresente as fórmulas usadas. Tome muito cuidado com a nomenclatura dos vetores e dos pontos. Imagine que os 10 segmentos Bèzier estão em uma estrutura como:
typedef struct
{
XYR p[4];
} CURVA;CURVA Curvas[10];
Trace as curvas Hermite a partir dos pontos e vetores a abaixo.
Manipulação
de Imagens
1 |
3 |
6 |
1 |
3 |
6 |
1 |
3 |
6 |
1 |
3 |
6 |
Crie uma rotina para suavizar uma imagem. Defina você mesmo a matriz de suavização. Assuma a existência da rotina LeCor(x,y, R,G,B) capaz de ler as componentes R, G e B de um ponto (x,y) da imagem.
Explique como funciona o algoritmo de Vetorização de uma Imagem
Explique como funciona a técnica de detecção de bordas.
Quadtree(Raiz: PtrNodo; X1,Y1,X2,Y2:integer);
Onde (X1,Y1) representam as coordenadas do canto superior esquerdo da área de desenho e (X2,Y2) representam as coordenadas do canto inferior direito da área de desenho.
Crie uma rotina que armazene este polígono em uma quadtree. O cabeçalho da rotina deve ser
void Quadtree(NODO *Raiz; int X1,Y1,X2,Y2);
onde (X1,Y1) representam as coordenadas do canto superior esquerdo da área de desenho e (X2,Y2) representam as coordenadas do canto inferior direito da área de desenho.Sabendo que:
- A struct a seguir serve para armazenar um do nodo de uma quadtree;
typedef struct tempNodo{
int Status; // Cheio, Vazio, Cinza
struct tempNodo *Filhos[4]; // 4 ponteiros para nodos-filho
} NODO;
- Existe uma função LeCor(x,y) capaz de ler a cor de um ponto na tela;
- Se o nodo da quadtree tem dimensões menores que 5x5, não é preciso subdividi-lo mais;
- Se o nodo tem 90% de seus pontos pintados, então ele é considerado cheio;
- Se o nodo tem 90% de seus pontos não pintados, então ele é considerado vazio.