cg1

54
BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO 5º Período COMPUTAÇÃO GRÁFICA COMPUTAÇÃO GRÁFICA COMPUTAÇÃO GRÁFICA COMPUTAÇÃO GRÁFICA Ionildo José Sanches Ionildo José Sanches Ionildo José Sanches Ionildo José Sanches CURITIBA 01/2012

Upload: biluzitz

Post on 19-Jan-2016

78 views

Category:

Documents


51 download

TRANSCRIPT

Page 1: cg1

BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO

5º Período

COMPUTAÇÃO GRÁFICACOMPUTAÇÃO GRÁFICACOMPUTAÇÃO GRÁFICACOMPUTAÇÃO GRÁFICA

Ionildo José SanchesIonildo José SanchesIonildo José SanchesIonildo José Sanches

CURITIBA 01/2012

Page 2: cg1

ii

SUMÁRIO

1. INTRODUÇÃO À COMPUTAÇÃO GRÁFICA ..................................................................................................................... 1

1.1 INTRODUÇÃO ......................................................................................................................................................................... 1 1.2 HISTÓRICO E EVOLUÇÃO DA COMPUTAÇÃO GRÁFICA ........................................................................................................... 3

1.2.1 Alguns Marcos Históricos ................................................................................................................................................ 4 1.3 APLICAÇÕES DA COMPUTAÇÃO GRÁFICA ............................................................................................................................. 5 1.4 HARDWARE GRÁFICO ............................................................................................................................................................ 6

1.4.1 Dispositivos de Entrada ................................................................................................................................................... 7 1.4.2 Dispositivos de Saída ....................................................................................................................................................... 8 1.4.3 Métodos de Varredura ................................................................................................................................................... 10 1.4.4 Resolução Gráfica .......................................................................................................................................................... 11 1.4.5 Formato de Dados Gráficos ........................................................................................................................................... 11

1.5 PADRÕES E BIBLIOTECAS GRÁFICAS ................................................................................................................................... 11

1.5.1 Exemplos de padrões Gráficos ....................................................................................................................................... 12 1.5.2 OpenGL .......................................................................................................................................................................... 12

2. FUNDAMENTOS MATEMÁTICOS ...................................................................................................................................... 19

2.1 SISTEMAS DE COORDENADAS .............................................................................................................................................. 19

2.1.1 Sistema de Coordenadas do Mundo ............................................................................................................................... 19 2.1.2 Sistema de Coordenadas do Dispositivo ........................................................................................................................ 19 2.1.3 Sistema de Coordenadas Normalizadas do Dispositivo ................................................................................................. 19

2.1.4 Visualização ................................................................................................................................................................... 20 2.1.5 Mapeamento ................................................................................................................................................................... 20

2.2 CONCEITOS MATEMÁTICOS PARA COMPUTAÇÃO GRÁFICA................................................................................................. 21

2.2.1 Matrizes .......................................................................................................................................................................... 21 2.2.2 Vetores ........................................................................................................................................................................... 24

3. ALGORITMOS BÁSICOS PARA RASTERIZAÇÃO DE PRIMITIVAS GRÁFICAS .................................................... 28

3.1 TRAÇADO DE LINHAS .......................................................................................................................................................... 28 3.1.1 Algoritmo de Bresenham ................................................................................................................................................ 30 3.1.2 Exercícios Resolvidos..................................................................................................................................................... 31

3.2 TRAÇADO DE CIRCUNFERÊNCIA .......................................................................................................................................... 33

3.2.1 Exercícios Resolvidos..................................................................................................................................................... 34 3.3 TRAÇADO DE ELIPSE ........................................................................................................................................................... 35

3.3.1 Método Polinomial ......................................................................................................................................................... 35 3.3.2 Método Trigonométrico ................................................................................................................................................. 36 3.3.3 Exercícios Resolvidos..................................................................................................................................................... 36

3.4 TRAÇADO DE ARCOS E SETORES ......................................................................................................................................... 37

3.4.1 Arcos .............................................................................................................................................................................. 37 3.4.2 Setores ............................................................................................................................................................................ 38 3.4.3 Exercícios Resolvidos..................................................................................................................................................... 38

3.5 TRAÇADO DE RETÂNGULOS ................................................................................................................................................ 38

3.5.1 Exercícios Resolvidos..................................................................................................................................................... 39

4. TRANSFORMAÇÕES GEOMÉTRICAS .............................................................................................................................. 40

4.1 TRANSFORMAÇÕES GEOMÉTRICAS 2D ................................................................................................................................ 40

4.1.1 Escala ............................................................................................................................................................................. 40 4.1.2 Translação ..................................................................................................................................................................... 40 4.1.3 Rotação .......................................................................................................................................................................... 41 4.1.4 Espelhamento ou Reflexão ............................................................................................................................................. 41 4.1.5 Cisalhamento (Shearing) ............................................................................................................................................... 42

4.2 COORDENADAS HOMOGÊNEAS E MATRIZES DE TRANSFORMAÇÃO ..................................................................................... 42

4.2.1 Coordenadas Homogêneas ............................................................................................................................................ 42 4.2.2 Translação ..................................................................................................................................................................... 43 4.2.3 Escala ............................................................................................................................................................................. 44 4.2.4 Rotação .......................................................................................................................................................................... 45 4.2.5 Espelhamento ................................................................................................................................................................. 45 4.2.6 Cisalhamento (Shearing) ............................................................................................................................................... 46

4.3 COMPOSIÇÃO DE TRANSFORMAÇÕES .................................................................................................................................. 47

Page 3: cg1

iii

4.4 TRANSFORMAÇÕES GEOMÉTRICAS 3D ................................................................................................................................ 48

4.4.1 Escala ............................................................................................................................................................................. 48 4.4.2 Translação ..................................................................................................................................................................... 48 4.4.3 Rotação .......................................................................................................................................................................... 48 4.4.4 Reflexão .......................................................................................................................................................................... 49 4.4.5 Cisalhamento (Shearing) ............................................................................................................................................... 50

4.5 COMPOSIÇÃO DE TRANSFORMAÇÕES EM 3D ....................................................................................................................... 50 4.6 TRANSFORMAÇÕES AFINS ................................................................................................................................................... 50

5. REFERÊNCIAS BIBLIOGRÁFICAS .................................................................................................................................... 51

Page 4: cg1

1

1. Introdução à Computação Gráfica

1.1 Introdução Computação Gráfica é a sub-área da ciência da computação que trata e representa graficamente as

informações através de algoritmos, técnicas e metodologias que possibilitam a criação, o armazenamento e manipulação de modelos de objetos e suas imagens via computador.

Segundo a ISO (International Standards Organization) a Computação Gráfica pode ser definida como o conjunto de métodos e técnicas utilizados para converter dados para um dispositivo gráfico, via computador.

A área de Computação Visual (CV) é uma especialização da ciência da computação, onde os dados são visuais. A área de CV está dividida em 3 sub-áreas:

1. Computação Gráfica (CG): Descrição -> CG -> Imagem • Área que estuda a geração de representações visuais a partir das especificações geométricas de

seus componentes. • Criação e alterações em imagens a partir de uma dada descrição; • Também conhecida como síntese de imagens; • Uma sub-área é a visualização.

2. Processamento de Imagens (PI): Imagem -> PI -> Imagem

• Envolve técnicas de transformação de imagens visando melhorar suas características visuais, tais como aumento do contraste, foco, eliminação de ruído, detecção de bordas, etc.

3. Visão Computacional (VC): Imagem -> VC -> Descrição

• Busca isolar e identificar os componentes de uma imagem a partir de sua representação visual; • Estuda a modelagem e funcionamento do sistema visual natural para implementação em

sistemas artificiais de visão; • Também conhecida como análise de imagens; • Se preocupa com a análise das imagens, a interpretação de características ou reconstituição do

modelo de um objeto ou de uma cena. • Uma sub-área é o Reconhecimento de Padrões (RP).

No processamento tradicional, o computador recebe dados, faz algum processamento e devolve na

saída dados de mesma natureza; na Computação Gráfica, os dados de entrada são transformados em imagem através de algum dispositivo de saída gráfica; no Processamento Digital de Imagens, o computador tem como entrada uma imagem e a saída é outra imagem; as técnicas da área de Reconhecimento de Padrões permitem obter a partir de uma imagem (entrada), informações geométricas e topológicas sobre os modelos que deram origem a essa imagem.

Em resumo tem-se que:

Entrada Descrição Imagem

Saída Descrição MG VC Imagem CG PI

Page 5: cg1

2

Im a g e m

P ro c e s sa m e n to d e Im a g e n s

M o d e lo

C o m p u ta ç ã oG rá fica

V isã o C o m p u ta c io n a l

Figura 1 – Relação entre Computação Gráfica, Processamento de Imagens e Visão Computacional

A Computação Gráfica abriga inúmeras sub-áreas, que refletem conjuntos de técnicas com objetivos comuns. Por exemplo, síntese de imagens corresponde às técnicas de geração de imagens utilizando, para isso, a simulação (mais ou menos fiel) da interação da luz com as superfícies que compõem os objetos presentes na cena e cuja descrição encontra-se em modelos computacionais com grau de realismo variável. A construção de tais modelos corresponde, por si só, a uma outra sub-área da Computação Gráfica, a de modelagem geométrica (MG). Nesta, a preocupação é especificação dos elementos (geométricos) que constituem o objeto ou cena ser modelada e a sua representação em estruturas de dados. A escolha da forma de representação e das respectivas estruturas de dados é estritamente dependente das operações que serão realizadas pela aplicação, sobre os objetos.

Numa aplicação de desenho ou projeto auxiliado por computador, por exemplo, os requisitos de

estruturas de dados são diferentes daqueles de uma aplicação em cartografia. Enquanto algumas aplicações fornecem suporte à construção interativa dos modelos dos objetos pelo próprio usuário, outras prevêem apenas a produção de imagens dos objetos. Seguramente, os requisitos de ambas as classes de aplicação são diferentes.

De modo geral, abstraindo a complexidade das interações necessárias para modelar um objeto ou cena, podemos identificar as seguintes ações como necessárias para a síntese de imagens foto-realísticas (figura 2):

• modelagem dos objetos, isto é, a descrição de sua morfologia, atributos e, eventualmente, sua funcionalidade;

• composição da cena pela organização dos objetos num sistema de referência comum; • iluminação da cena, o que envolve, a modelagem de fontes de luz e a determinação dos efeitos de

reflexão e sombreamento sobre as superfícies dos objetos; • remoção das áreas invisíveis da cena e dos objetos, de acordo com a posição do observador e com

a projeção adotada; • apresentação da imagem, o que leva em consideração características desejadas para a mesma

(tamanho, número de cores, resolução, etc.).

modelos deobjetos

funções devisualização

funções deanálise do modelo

funções demodelagem

funçõesgráficas

funções deentrada

descriçãoda imagem

parâmetros

dados sobre osobjetos

Figura 2 – Estruturação de sistemas gráficos. É bastante claro que muitas disciplinas da Computação são utilizadas, dependendo da complexidade da aplicação, desde

Page 6: cg1

3

Gerenciamento de Banco de Dados até Engenharia de Software. Computação Gráfica pode, então, ser entendida como um conjunto de técnicas para a modelagem, representação e manipulação de objetos gráficos e para a geração de imagens de tais objetos. Em função da dimensão dos objetos, o que incorre em diferenciação de técnicas empregadas, identificamos separadamente a Computação Gráfica Bidimensional (2D) e Computação Gráfica Tridimensional (3D). Vale ressaltar aqui que o emprego da expressão objeto é livre, ou seja, objeto designa unicamente uma entidade real ou imaginária com a qual uma dada aplicação trabalha. Pode ser um desenho, uma peça mecânica, um ator numa animação, etc. Cena, em geral, designa um conjunto de objetos, sendo aqui sinônimo de mundo virtual .

Uma sub-divisão da CG é o que se chama de computação gráfica interativa, ou seja, onde o usuário não somente vê os resultados, como pode manipulá-los interativamente O paradigma funciona da seguinte maneira:

Um esquema típico de aplicação interativa é um loop dirigido por eventos. Ele pode ser visualizado como uma máquina de estados finitos com um estado de espera central e transições para outros estados que são provocados por eventos de entrada do usuário. O loop de interação dirigido por eventos é caracterizado pelo seguinte esquema em pseudocódigo: gerar display inicial while (!quit) { habilita seleção de comandos dos objetos /*programa espera indefinidamente num "estado de espera" até a ação do usuário*/ espera pela seleção do usuário switch (seleção) { processar o comando, atualizando o modelo o dis play quando necessário } }

1.2 Histórico e Evolução da Computação Gráfica Costuma-se identificar a origem da Computação Gráfica com os monitores de vídeo acoplados ao

computador Whirlwind I (furacão) no MIT (Massachussets Institute of Technology), em 1950. Este computador tornou-se a base para o protótipo de um sistema desenvolvido poucos anos depois para a Força Aérea americana, o sistema de monitoramento e controle de vôos SAGE (Semi-Automatic Ground Environment), que convertia as informações capturadas pelo radar em imagem em um tubo de raios catódicos (na época uma invenção recente), observado por um operador que podia apontar uma aeronave com uma caneta ótica (light pen) e obter dados a seu respeito. Ao contrário dos outros sistemas existentes, que eram orientados para fazer cálculos pesados para físicos e projetistas de mísseis, guiados unicamente por comandos entrados por teclado ou painel de controle, o SAGE apresentava a possibilidade de um operador interagir de forma rudimentar com uma imagem através de um dispositivo especial.

A introdução de interação entre usuário e aplicação através de elementos gráficos exibidos numa tela ocorreu definitivamente em 1963, com a tese de doutorado de Ivan Sutherland ("Sketchpad - A Man-Machine Graphical Communication System"), no MIT. Sutherland desenvolveu o SKETCHPAD, um sistema de desenho interativo onde estruturas de dados “novas” baseadas em listas encadeadas permitiam a construção, na tela, de formas geométricas, através de técnicas interativas muito semelhantes ao que hoje são chamados de interfaces WIMP – Window-Icon-Menu-Pointer .. O sistema SKETCHPAD desenvolvido por Sutherland, marcou de forma definitiva não apenas o início da computação gráfica interativa, mas também lançou a pedra fundamental para a área de modelagem.

Page 7: cg1

4

Esta publicação chamou a atenção das indústrias automobilísticas e aeroespaciais americanas. Na

década de 60, a Computação Gráfica se expandiu principalmente com o advento das primeiras estações gráficas e dos sistemas de projeto auxiliado por computador. Às aplicações de desenho (computer-aided drafting) utilizadas por engenheiros mecânicos para o projeto de peças (através de desenhos), somaram-se as aplicações de projeto (CAD - computer-aided design), onde modelos computacionais tridimensionais das peças podiam ser submetidos a processos de análise, cálculo de custos de produção, geração de lista de matéria prima, até o controle total do processo de manufatura (CAM - computer-aided manufacturing). Esses sistemas deram origem a uma tendência dominante na década de 70, a dos sistemas turnkey, ou seja, sistemas voltados para aplicações específicas.

A adaptação da tecnologia de televisão (raster) para os monitores de vídeo e o surgimento dos primeiros computadores pessoais no final da década de 1970 foram, certamente, os fatores principais para a aplicação crescente da Computação Gráfica. Os sistemas CAD/CAM logo passaram para esse tipo de plataforma, incluindo dispositivos de interação como mouse, trackball e tablets, e novos dispositivos de saída como os plotters eletrostáticos. Na década de 80, tais estações de trabalho para CAD/CAM tornaram-se o ambiente de trabalho mais comum em grandes indústrias. A popularização das aplicações gráficas, também nessa década, deu-se pela introdução do Apple Macintosh com sua interface gráfica, em 1984. Em paralelo com essa popularização, ocorreu um significativo avanço em termos de hardware e software para estações gráficas de alta performance. Aceleradores e processadores gráficos já garantiam a criação e apresentação de imagens foto-realísticas quase em tempo real e surgiu a tecnologia para interação em três dimensões como a spaceball e as luvas. Os dispositivos de apontamento em três dimensões e os equipamentos para visão estereoscópica propiciaram, nessa década, as primeiras experiências na manipulação de mundos virtuais. Foi também nessa década que iniciou a discussão de padronização de funções gráficas por parte de organismos como a ISO e ANSI. O GKS – Graphical Kernel System foi desenvolvido originalmente na Alemanha, onde tornou-se o padrão para conjunto de funções gráficas a serem utilizadas pelos programas de aplicação no acesso a dispositivos de entrada e saída de informações “gráficas”. Alguns produtos da indústria, entretanto, tornaram-se padões “de fato”, em função da aceitação e utilização generalizada. Exemplos são a OpenGl, da Silicon Graphics e o sistema X Window, apenas para citar alguns.

1.2.1 Alguns Marcos Históricos • 1450: imprensa. • 1824: um estudante chamado Peter Mark Roget, publicou um artigo chamado "The Persistence of

Vision with Regard to Moving Objects", o qual estabeleceu que o olho humano retêm uma imagem por uma fração de segundos a mais do que a exposição da imagem.

• 1826: primeira imagem fotográfica (Joseph Nicéphore Niepce). • 1842: máquina de facsimile (fax) (Alexandre Bain). • 1884: scanner para capturar e transmitir imagens (Paul Nipkow). • 1885: Tubos de Raios Catódicos (Cathode Ray Tube - CRT). • 1906: o primeiro desenho animado nos EUA. • 1913: John Bray usa papel translúcido para desenhar planos de fundo. • 1923: Walt Disney começou a criar estórias para crianças. • 1926: primeira televisão (John Logie Baird). • 1927: filmes são padronizados em 24 quadros por segundos. • 1928: trilha sonora sincronizada com o desenho. • 1938: TV colorida é proposta (George Valensi). • 1941: primeira transmissão de TV nos EUA. • 1945: surgimento do computador digital. • 1953: código de transmissão NTSC (National Television System Committee). • 1954: Federal Communications Commission (FCC) autoriza a transmissão para TV colorida. • 1955: Sistema SAGE ((Semi-Automatic Ground Environment). • 1960: Surge o termo Computer Graphics (computação gráfica)- criado por Verne L. Hudson,

Page 8: cg1

5

quando o mesmo coordenava um projeto para a Boeing de simulação de fatores humanos em aviões.

• 1961: criação do jogo Spacewar, o primeiro vídeo game interativo, desenvolvido pelo estudante Steve Russell no MIT para o computador PDP-1.

• 1962: No MIT o projeto TX2 com o aluno Ivan Sutherland usa um computador para fazer desenhos em sua tese de doutorado (Sketchpad).

• 1963: criação do mouse por Doug Englebart na Stanford Research Institute, Menlo Park, California.

• 1965: criação da mesa digitalizadora. • 1968: fundação da INTEL. • 1969: Graphical User Interface (GUI) desenvolvida pela Xerox (Alan Kay). • 1969: criação do SIGGRAPH. • 1969: surgimento da ARPANET (Advanced Research Projects Agency Network). • 1970: surgem os primeiros monitores à varredura. • 1977: introdução do padrão GKS (Graphical Kernel System). • 1979: padrão gráfico SIGGRAPH CORE Graphics. • 1980: Disney utiliza computação gráfica para o filme Tron. • 1982: Atari desenvolve luvas de dados (data glove). • 1982: fundação da Autodesk: AutoCAD é lançado. • 1986: INTEL introduz co-processador gráfico 82786: Texas Instruments introduz TMS34010

Graphics System Processor. • 1987: formato GIF (Graphics Interchange Format) (CompuServe). • 1987: VGA (Video Graphics Array) criado pela IBM. • 1988: Willow (Lucasfilm) utiliza morphing em filme. • 1990: Microsoft lança o Windows 3.0. • 1990: 3D Studio (AutoDesk). • 1991: Beauty and the Beast (A bela e a fera) (Disney). • 1991: JPEG/MPEG. • 1992: OpenGL • 1993: Filme Jurassic Park - ILM e Steven Spielberg. • 1993: Windows NT. • 1993: Mosaic browser (NCSA, University of Illinois). • 1994: lançamento do jogo Doom. • 1994: padrão HDTV para transmissão é adotado nos Estados Unidos. • 1995: Toy Story (1ª longa metragem 3D) • 1996: lançamento do jogo Quake. • 1996: lançamento do Windows 95. • 1998: padrão MPEG-4 é anunciado. • 1999: Primeiras Placas Gráficas para PC da NVIDIA • 2000: Playstation 2 (Sony).

1.3 Aplicações da Computação Gráfica A computação gráfica é usada hoje em diversas áreas tais como industria, economia, orgãos

governamentais, medicina, educação e entretenimento. Diversas aplicações fazem uso da computação gráfica, alguns exemplos são apresentados a seguir:

• Interfaces (IHC - Interação homem-máquina): a maioria dos sistemas operacionais para

computadores pessoais e estações de trabalho atualmente dispõe de interfaces gráficas (GUI - Graphical User Interface) baseadas em janelas, menus, ícones, etc.

• Automação de Escritórios e Editoração Eletrônica: permite a criação de documentos que combinam texto, imagem, tabelas e gráficos. Com os programas de Editoração Eletrônica é

Page 9: cg1

6

possível, antes de ter-se o material impresso por uma gráfica, obter uma idéia precisa de como ficará o produto final. Com isto as alterações podem ser feitas com facilidade antes mesmo da impressão do primeiro exemplar. O que, sem dúvidas, diminui os custos de produção e aumenta a qualidade da publicação.

• Gráficos de Apresentação: outro importantíssimo campo dentro da Computação Gráfica é a visualização de dados através de gráficos. Utilização de técnicas gráficas para demonstração de resultados, com o objetivo de mostrar ou transmitir conhecimento específico como, por exemplo, em uma aula ou reunião.

• Projeto Auxiliado por Computador (CAD - computer-aided design): sistemas gráficos interativos utilizados para projetar componentes, peças e sistemas de dispositivos mecânicos, elétricos, eletro-mecânicos e eletrônicos. Isto inclui edifícios, automóveis, aviões, circuitos VLSI, sistemas ópticos, redes telefônicas e de computador.

• Manufatura Auxiliada por Computador (CAM - computer -aided manufacturing): o uso dos computadores para automatizar a fabricação, montagem e controle de processos. Os programas de CAM podem ser aplicados desde a automatização de pequenas atividades de produção até o uso da robótica em linhas de montagem de alta complexidade. As técnicas de CAM se referem, principalmente, ao uso de programas e equipamentos especialistas, e não necessariamente ao uso de microcomputadores no ambiente de produção.

• Engenharia auxiliada por computador (CAE - computer-aided engineering): um tipo de aplicação que permite ao usuário realizar testes e análises de engenharia sobre projetos criados no computador. Em alguns casos, recursos como os testes lógicos, que são habitualmente associados às aplicações de CAE também fazem parte dos programas de CAD, e portanto, a distinção entre CAE e CAD não é muito nítida.

• Simulação e Animação para Visualização Científica: animações computadorizadas utilizadas para estudar entidades matemáticas abstratas e modelos matemáticos de fenômenos como fluxo de fluídos, relatividade, reações químicas e nucleares, moléculas, deformação de estruturas mecânicas sob diferentes tipos de pressão, meteorologia, simulação de vôo, etc.

• Controle de Processos: sistemas de controle de tráfego aéreo e espacial, sistemas de controle de refinarias e de usinas de energia mostram graficamente os dados coletados por sensores conectados a componentes críticos dos sistemas, de forma que os operadores possam responder adequadamente a condições críticas.

• Cartografia: a computação gráfica é utilizada para produzir representações precisas e esquemáticas de fenômenos geográficos e outros fenômenos naturais obtidos a partir da coleta de dados. Exemplos incluem mapas geográficos, mapas de relevo, mapas para perfuração e exploração, gráficos oceanográficos, mapas de densidade populacional, etc.

• Arte e Entretenimento: é possível utilizar os recursos de computação gráfica para produzir efeitos artísticos como a extração de texturas, padrões e estruturas a partir de fotos digitalizadas, efeitos especiais para filmes e comerciais de televisão, jogos, animação, multimídia, ambientes virtuais, web, etc.

1.4 Hardware Gráfico Um sistema de hardware para computação gráfica consiste essencialmente de dispositivos gráficos de

entrada e saída ligados a um computador. Ao conjunto de dispositivos de entrada e saída gráficos denomina-se genericamente de estação de trabalho.

Definição: Processador gráfico é a parte do hardware responsável pela integração do gerenciamento simultâneo da tela e dos recursos gráficos mínimos residentes (no hardware).

Diversas tecnologias e diferentes tipos de dispositivos são utilizados para gerar representações visuais, sendo que o desenvolvimento dessas tecnologias teve um papel fundamental na evolução da Computação Gráfica.

É possível classificar os dispositivos gráficos em duas principais categorias, segundo a forma pela qual as imagens são geradas:

Page 10: cg1

7

• Vetoriais: a informação representada consiste de um conjunto de segmentos de reta, descritos pelas coordenadas de seus pontos iniciais e finais;

• Matriciais: a informação representada consiste de uma matriz bidimensional de M linhas por N colunas, onde cada elemento da matriz é uma estrutura de dados associada à cor e outros componentes da imagem;

1.4.1 Dispositivos de Entrada A entrada pode ser diferenciada em 2 categorias diferentes: coordenadas relativas x coordenadas absolutas. VETORIAL: Coordenadas relativas: - mouses (ópticos e mecânicos)

- joysticks, trackball e luvas (data glove) Coordenadas absolutas: - teclados

- mesas digitalizadoras - caneta óptica - “light pen”

- tela óptica - “touch screen” MATRICIAL:

• Digitalizadores de vídeo: a partir de um sinal de televisão gera uma matriz de pontos em um monitor de vídeo; - Frame Grabber

• Varredores digitais (scanner): são baseados na absorção da luz; versão do Frame Grabber para papel.

• Film Scanner: o equivalente para filme.

Teclado: o teclado alfanumérico é o recurso mais utilizado na comunicação entre usuário e máquina, permitindo a entrada de textos e dados numéricos. Um teclado alfanumérico estendido inclui teclas adicionais para a seleção de alternativas em menus ou para a ativação de funções. Teclas de movimento de cursor podem ser usadas para seleção de coordenadas de um ponto em uma tela gráfica.

Mouse: é uma pequena caixa que pode deslizar sobre uma superfície plana. Na parte inferior, uma pequena esfera rola livremente à medida que o mouse se movimenta. Os movimentos de rotação da esfera relativos à caixa são transmitidos mecanicamente a dois potenciômetros que medem o deslocamento do mouse em relação a dois eixos ortogonais fixos. Como o sistema de eixos é fixo em relação à caixa, o dispositivo é capaz apenas de detectar movimentos relativos a sua própria posição atual. Ele pode ser levantado da superfície, movido e recolocado sobre a superfície sem que a sua posição corrente no sistema seja alterada.

Joystick: dispositivo que informa a posição do cursor na tela. A informação de posicionamento não é dada exclusivamente pela pequena alavanca. é também indispensável o acompanhamento visual através de um cursor, um símbolo especial que se move na tela. Os joysticks podem indicar a posição em um plano, a partir da medida do deslocamento da alavanca em relação ao centro. A manipulação é percebida por potenciômetros colocados na base da alavanca. O sinal elétrico é codificado e enviado ao computador.

Mesas Digitalizadoras: dispositivo adequado para entrada de dados geométricos. Consiste de uma superfície plana e um cursor que pode ser posicionado sobre a superfície. Por indução eletromagnética, a posição corrente do cursor relativa a um referencial fixo à mesa pode ser detectada e transmitida ao processador.

Caneta Óptica: é um dispositivo que funciona associado a um monitor de vídeo, sendo capaz de detectar luz. A caneta tem em sua ponta uma célula fotoelétrica e um interruptor de pressão. Ao ser pressionado contra a tela, o interruptor habilita a célula a detectar o pulso de luz emitido pelo fósforo que

Page 11: cg1

8

recobre a tela no ponto sendo apontado. Quando a caneta detecta um pulso de luz em um terminal de varredura, o conteúdo dos registradores X e Y do controlador de vídeo é armazenado e o processamento é interrompido. Através dos valores armazenados, o software gráfico determina as coordenadas do pixel apontado pela caneta.

Tela Óptica: dispositivo utilizado para a seleção de opções de comandos. O usuário toca a tela indicando um dos comandos selecionados. A posição do dedo é identificada por um conjunto de sensores dispostos em torno da tela. O tipo mais comum emprega diodos emissores de radiação infravermelha e células fotoelétricas. Ao colocar o dedo na tela, o usuário interrompe os feixes de luz nos dois eixos. As células que deixaram de receber luz podem ser identificadas e um cálculo simples pode relacionar o par de células com a opção da tela. O uso de infravermelho evita a interferência da luz ambiente.

Luva: dispositivo de entrada utilizado em realidade virtual. Consiste de um conjunto de sensores acoplados a uma luva que detectam movimento e força dos dedos. Antenas de transmissão e recepção são responsáveis por fornecer o posicionamento das mãos. Assim, a posição das mãos pode indicar a posição de objetos que são então mapeados para a tela ou outro dispositivo.

1.4.2 Dispositivos de Saída Impressoras:

• Matriciais: os caracteres são impressos por intermédio de um conjunto de agulhas. Um ponto é impresso quando uma agulha pressiona a fita sobre o papel. As agulhas são montadas sobre um cabeçote móvel e os diferentes caracteres são obtidos pelo acionamento conveniente das agulhas à medida que o cabeçote se movimenta. Estas impressoras podem operar no modo texto para a impressão de caracteres ou em um modo gráfico pelo qual é possível controlar cada agulha de modo independente. Cada padrão a ser impresso é definido por uma pequena matriz de pontos, onde cada ponto pode ser traçado ou não.

• Laser: o processo de impressão é semelhante ao das copiadoras eletrostáticas. Um feixe de raio laser varre uma chapa em uma trajetória semelhante ao de um cabeçote de uma impressora. O bombardeio do feixe deixa a chapa carregada com uma carga eletrostática não uniforme. Por efeito da intensidade da carga, uma tintura (tonner) adere à chapa e por pressão é impregnada no papel, formando a imagem.

• Jato de Tinta: o cabeçote transporta um pequeno bico que expele a tinta em um jato curto e fino sobre o papel. é possível variar a intensidade do jato, obtendo-se assim controle sobre a densidade de impressão. Algumas impressoras dispõem de vários bicos com tintas de cores diferentes, cuja mistura produz diversas tonalidades.

Traçadores Gráficos (Plotters): são dispositivos eletromecânicos que produzem o desenho pelo

movimento de uma caneta sobre a superfície do papel. A primitiva gráfica básica nesse tipo de dispositivo é o segmento de reta. Arcos, curvas e caracteres são produzidos pelo traçado de uma série de pequenos segmentos. Figuras são traçadas pela variação controlada da posição da caneta (eixo x e y) pelo controle do estado da caneta (abaixada ou levantada).

• Traçadores de Mesa: o papel é fixado sobre uma superfície plana retangular sobre a qual está localizado um braço mecânico que movimenta-se por translação. Ao longo do braço desloca-se um cabeçote que suporta uma caneta perpendicularmente à mesa, a qual pode ser pressionada contra o papel ou levantada de forma a não tocá-lo.

• Traçadores de Tambor: o braço é fixo e o papel é movimentado para frente e para trás por ação de um rolo, como em uma máquina de escrever.

Terminais de Vídeo: Os terminais de vídeo são o meio de saída mais utilizado em Computação

Gráfica, devido a sua capacidade de representar imagens de forma dinâmica. O projeto dos terminais de vídeo teve, durante sua evolução, muitas abordagens tecnológicas

diferentes que resultaram em comportamentos diferentes, tanto do ponto de vista do programador do sistema gráfico quanto do ponto de vista do usuário.

Page 12: cg1

9

Praticamente todos os terminais em uso hoje utilizam a técnica CRT (Tubos de Raios Catódicos) que é o princípio da televisão. Um cátodo aquecido emite um feixe eletrônico que é convenientemente focalizado por um conjunto de lentes, e acelerado. O feixe, de alta velocidade, incide sobre a superfície do tubo, que é recoberta com fósforo. O ponto de fósforo bombardeado pelos elétrons emite luz.

O conjunto de pontos acesos forma a figura. O desvio do feixe eletrônico para selecionar o ponto a se acender é feito por um conjunto de bobinas às quais aplica-se tensão proporcional ao deslocamento que se pretende obter.

Os terminais de varredura fixa são muito semelhantes aos aparelhos de televisão, podendo ser coloridos ou monocromáticos. No caso de terminais coloridos, tem-se um conjunto de três canhões que emitem três feixes de elétrons. Os canhões são dispostos de tal forma que incidam sobre a tela em três pontos distintos, onde se encontram depositados três tipos diferentes de fósforo: o verde, o vermelho e o azul. Os três pontos de fósforo ficam bastante próximos entre si, de tal forma que o olho humano vê um só ponto colorido na tela. Variando a aceleração de cada feixe, faz-se com que varie a intensidade luminosa de cada ponto de fósforo, obtendo-se os inúmeros tons de cores.

A disposição dos canhões e dos pontos de fósforo é geralmente arranjada em retângulos, formando linhas verticais. Cada um dos três canhões recebe uma entrada de tensão que regula a intensidade do feixe eletrônico em cada ponto da linha de varredura. A deflexão dos três feixes eletrônicos é controlada por pulsos de sincronismo horizontal e vertical, recebidos pelo monitor de TV. Estes sinais controlam o retraço do feixe, isto é, o apagamento do feixe durante sua movimentação, até o início da próxima linha de varredura no caso de retraço horizontal, ou até o topo da tela no caso de retraço vertical.

A seqüência de varredura de um terminal é mostrada abaixo, destacando-se o uso de entrelaçamento, ou seja, a varredura de todas as linhas ímpares seguida de varredura das linhas pares. Esta técnica é usada para diminuir a cintilação da imagem: devido à baixa persistência do fósforo, as linhas superiores começam a se apagar quando o feixe está desenhando as linhas inferiores.

12

3

4

5

6

7

Painel de Plasma (Gas Discharge - descarga de gás): Uma camada de gás neon, misturada com

outros gases é comprimida entre duas placas de vídeo. Essas placas possuem no seu interior fileiras de condutores milimétricos. O gás é ionizado pela passagem de corrente elétrica nestes condutores. Ao passar por uma interseção a corrente provoca emulsão de luz pelo gás. No caso do display de cristal líquido, as moléculas de cristal líquido encontram-se, inicialmente, sem direcionamento. Aplicando-se um potencial elétrico aos condutores, tais moléculas se arranjam, impedindo a passagem de luz através das superfícies de polarização, com isto, certas células tornam-se escuras, mostrando

Page 13: cg1

10

a figura nos cruzamentos. Memória de Tela:

Os terminais usados em Computação Gráfica devem ser capazes de reter indefinidamente a imagem apresentada. Esta retenção é obtida pelo redesenhamento contínuo da imagem na tela.

Os dados desta imagem ficam armazenados em uma memória de tela que é constantemente lida pelo circuito controlador para regenerar a imagem no vídeo. Esta memória é normalmente grande: para cada ponto da matriz de tela deve haver uma célula de memória onde se armazena a intensidade do feixe naquele ponto. O tamanho (em bits) da célula dá o número de cores que podem ser representadas simultaneamente na tela.

O conteúdo da célula de memória pode representar dois tipos de informação: • a intensidade dos três feixes no ponto. Por exemplo, em uma célula de oito bits, dois podem ser

usados para regular a intensidade do feixe azul, dois para o verde, dois para o vermelho. Os dois restantes podem ser usados para controle de piscagem e vídeo reverso.

• endereço de uma tabela de cores. O uso da tabela reduz o tamanho da célula de memória necessária para se obter um número grande de cores, porque cada célula só terá o tamanho do endereço da tabela. O número máximo de cores simultâneas na tela é dado pelo tamanho da tabela de cores. Uma configuração comum é a de 8 bits, onde cada pixel é mapeado em uma memória de tela com 8 bits por célula. Cada célula contém o índice da tabela de cores, com 256 posições (28). A tabela de cores mantém 8 bits para cada cor primária, isto é, cada uma das 256 entradas da tabela é uma das 28 × 28 × 28 = 16.777.216 cores possíveis.

12

R G B

80% 20% 50%

Tabela de Cores

Memória de Tela

R G B Valor Binário Cor 0 0 0 0 preto 0 0 1 1 azul 0 1 0 2 verde 0 1 1 3 turquesa 1 0 0 4 vermelho 1 0 1 5 magenta 1 1 0 6 amarelo 1 1 1 7 branco

1.4.3 Métodos de Varredura Dois metodologias básicas para geração de imagens na tela gráfica: • Varredura randômica ou vetorial (random/vector scan); • Varredura rastreada ou matricial (raster scan).

Até 1980 ⇒ prevalecia equipamento de varredura randômica (método ideal para representar vetores, típicos das aplicações de CAD). Hoje ⇒ predominam equipamentos de varredura matricial. Funcionamento:

Page 14: cg1

11

• Random-scan: o feixe de elétrons é direcionado somente para as partes da tela onde a figura é desenhada.

• Raster-scan: o feixe de elétrons é disparado sobre todas as partes da tela, sendo a tela criada por um conjunto de pontos ⇒ processo da televisão ⇒ varre-se a tela de cima para baixo e da esquerda para a direita marcando os trechos visíveis durante o trajeto.

PAL - 256 linhas de varredura TV NTSC - 525 linhas de varreduras CONAP 256 → 2048, já chegando a 4096 linhas.

1.4.4 Resolução Gráfica Virtualmente, todos os dispositivos de entrada e saída gráficos utilizam uma malha retangular de

posições endereçáveis, a qual é denominada retângulo de visualização (Display Rectangle ou Graphics I/O Rectangle).

A resolução gráfica de um dispositivo é o número de posições (ou pontos) horizontais e verticais que ele pode distinguir. Existem 4 parâmetros que definem a resolução:

• ndh: o número de posições endereçáveis horizontalmente • ndv: o número de posições endereçáveis verticalmente • width: a largura do retângulo de visualização em mm • height: a altura do retângulo de visualização em mm

A partir desses 4 parâmetros, vários valores podem ser calculados:

• resolução horizontal: horiz_res = ndh / width • tamanho do ponto horizontal: horiz_dot_size = width / ndh • resolução vertical: vert_res = ndv / height • tamanho do ponto vertical: vert_dot_size = height / ndv • total de pontos endereçáveis: total_nr_dots = ndh * ndv • resolução de área: area_res = total_nr_dots / (width * height) • razão de aspecto gráfica: aspect_ratio = vert_dot_size / horiz_dot_size • razão de aspecto física: physical_aspect_ratio = height / width

1.4.5 Formato de Dados Gráficos Existem dois formatos básicos para a representação e o armazenamento de dados gráficos no

computador: o formato vetorial e o formato matricial (raster). O formato vetorial é utilizado em geral, para descrever a estrutura geométrica dos objetos gráficos, enquanto que o formato matricial esta freqüentemente associado à imagem digital. A conversão entre formatos é desejável e muitas vezes necessária. Dá-se o nome de rasterização à transformação de dados do formato vetorial para o formato material. Essa técnica constitui uma parte fundamental dos algoritmos de síntese de imagens. A transformação oposta, ou seja, de dados no formato matricial para o formato vetorial faz parte da área de reconhecimentos de padrões. Essa conversão, em alguns casos não é bem definida, sendo impossível ser realizada.

1.5 Padrões e Bibliotecas Gráficas Com o crescente aumento do interesse em Computação Gráfica, procurou-se escrever aplicações que

possam ser executadas em diferentes plataformas.

Page 15: cg1

12

Um padrão para desenvolvimento de programas gráficos facilita esta tarefa eliminando a necessidade de

escrever código para um driver gráfico distinto para cada plataforma na qual a aplicação deve ser executada. Para padronizar a construção de aplicativos que utilizam recursos gráficos e torná-los o mais independentes possível de máquinas, foram desenvolvidos os chamados Sistemas Gráficos.

1.5.1 Exemplos de padrões Gráficos • Linguagem PostScript: facilita a publicação de documentos estáticos contendo textos e gráficos 2D. • X Window: para desenvolvimento de interfaces gráficas 2D em estações de trabalho Unix/Linux. Um

programador utiliza o X para obter uma janela em um display gráfico no qual um texto ou um gráfico 2D pode ser apresentado. Com a adoção do ambiente X pela maioria dos fabricantes de estações de trabalho, um programa desenvolvido em X pode ser executado em uma variedade de estações simplesmente recompilando o código.

• Core Graphics System: desenvolvido em 1977 e 1979 nos Estados Unidos, foi a primeira tentativa a propor gráficos 3D.

• Graphical Kernel System (GKS): especificação gráfica padronizada pela ANSI e ISO em 1985. Suporta um conjunto de primitivas gráficas tais como desenho de linhas, polígonos, caracteres, etc, bem como seus atributos. Não suporta agrupamentos de primitivas hierárquicas de estruturas 3D.

• Programmer’s Hierarchical Interactive Graphics System (PHIGS): baseado no GKS, PHIGS é um padrão ANSI que provê meios para manipular e desenhar gráficos 3D encapsulando descrições de objetos e atributos. Isto possibilita que um objeto complexo seja descrito uma única vez, mesmo exibindo-o várias vezes. PHIGS não possui suporte a recursos avançados como mapeamento de textura.

• PEX: extensão para o PHIGS em ambiente X Window, permitindo que o X pudesse manipular e desenhar objetos 3D. Também não suporta recursos avançados.

• OpenGL: sistema relativamente novo (sua primeira versão é de 1992) que provê características gráficas avançadas. É baseado nas bibliotecas GL (Graphics Library) das estações de trabalho da SGI. Atualmente um consórcio de indústrias é responsável pelo gerenciamento da evolução do OpenGL. Existe uma implementação livre do OpenGL conhecida como MesaGL ou Mesa3D.

1.5.2 OpenGL

1.5.2.1 Introdução

OpenGL é uma biblioteca de rotinas gráficas para trabalhar em duas e três dimensões. Existem implementações de OpenGL para, PC, Mac Unix e PowerPC. Para obter maiores informações sobre estas implementações consulte http://www.opengl.org.

Das implementações para PC as mais conhecidas são as da Silicon Graphics e da Microsoft. Aqui é

importante contextualizar OpenGL com relação às linguagens de programação e aos ambientes operacionais. Independente da plataforma usada, e também da linguagem, as rotinas de exibição de objetos de OpenGL são sempre iguais. O que difere o uso de OpenGL em uma plataforma UNIX ou PC, ou em ferramentas como Delphi, C Builder, Borland C, Visual C ou Visual Basic é a forma de inicializar e integrar a biblioteca OpenGL em cada linguagem e a forma de definir em que janela(ou parte dela) a imagem será exibida.

Como a tarefa de integrar OpenGL a uma linguagem, nem sempre é trivial, existem diversas ferramentas (bibliotecas) para este fim, especialmente para Delphi e Visual Basic. Estas ferramentas são componentes ou OCXs que encapsulam a OpenGL, e tornam mais fácil a integração com estas linguagens. Consulte http://www.opengl.org para obter maiores informações sobre estas ferramentas.

Outra forma de integrar OpenGL com as linguagens de programação tradicionais é o uso da GLUT- GL Utility Library. Criada pela Silicon Graphics, trata-se de uma API de funções que permite entre outras coisas criar janelas, ler o teclado e o mouse e criar menus de opções. Existem versões padronizadas da GLUT para DOS, Windows, Linux, Mac OS e para a maioria das plataformas UNIX.

Page 16: cg1

13

A grande vantagem do uso da GLUT é que ela permite o uso de todas as funções gráficas OpenGL e ainda torna padronizado o acesso a características específicas de cada ambiente de janelas. Para obter maiores informações sobre a GLUT consulte a página oficial para download da GLUT: http://reality.sgi.com/mjk/glut3/glut3.html

1.5.2.2 Objetivo geral

O objetivo da construção de programas nas aulas práticas de CG é testar/exemplificar conceitos desenvolvidos nas aulas teóricas. Isto será feito através da API (Application Programming Interface) de programação gráfica OpenGL usando a linguagem C no ambiente de programação Dev-C++. Não serão utilizadas funções para programação específica em ambiente Windows, ou seja, usaremos apenas as funcionalidades disponibilizadas pela OpenGL, mesmo para definição de janelas e tratamento de mouse e teclado. Desta forma, nossos programas são portáveis, ou seja, podemos executá-los tanto em ambiente Windows como Linux.

1.5.2.3 Instalação do compilador Dev-C++

O compilador Dev-C++ pode ser localizado no seguinte endereço: www.bloodshed.net/devcpp.html Para instalar o compilador Dev-C++ Versão 4 siga os passos abaixo: 1. Faça download do arquivo devcpp4.zip 2. Faça download do arquivo devcpp401.zip 3. Descompacte o arquivo devcpp4.zip num diretório Temp. 4. Execute Setup.exe (opção Typical, instala no diretório C:\Dev-C++). 5. Descompacte o arquivo devcpp401.zip num diretório Temp. 6. Mova o arquivo DevCpp.exe para o diretório C:\Dev-C++ sobrepondo-o à versão instalada

anteriormente (este novo executável corrige alguns bugs da versão anterior).

1.5.2.4 Usando OpenGL no Windows com Dev-C++

Para utilização de OpenGL: 1. O compilador Dev-C++ já está preparado para programação com OpenGL: observe que o

diretório "C:\Dev-C++\Include\GL" possui os arquivos GL.H e GLU.H que contém os headers das funções do OpenGL e da GLU (OpenGL Utility Library).

2. O ambiente Windows já deve conter essas bibliotecas: veja o diretório onde se encontram as DLLs (em geral, o System ou System32). Você vai encontrar: OpenGL32.DLL e GLU32.DLL.

3. Para a construção de programas interativos, vamos precisar de outra biblioteca, a GLUT (OpenGL Utility Toolkit). Para isso: a) Faça o download do arquivo glut-devc.zip b) Descompacte o arquivo. Nele possui quatro arquivos: GLUT.H, GLUT32.DLL,

GLUT32.DEF e LIBGLUT.A. c) Mova GLUT.H para o subdiretório Include\GL do Dev-C++ e GLUT32.DLL para o mesmo

diretório onde se encontra a OpenGL32.DLL e GLU32.DLL (System ou System32). d) Mova GLUT32.DEF e LIBGLUT.A para o diretório C:\Dev-C++\Lib

1.5.2.5 Usando OpenGL em ambiente Linux

Faça download do MESA3D (The Mesa 3D Graphics Library) no endereço: http://www.mesa3d.org/ Em nossos programas usaremos os seguintes informações do pré-compilador para manter a

portabilidade entre o Windows e o Linux:

#ifdef _WIN32 #include <windows.h> #endif

Nos arquivos em C, onde você encontrar #include <gl/*.h> , troque por #include

<GL/*.h> . Para compilar, use a seguinte linha de comando:

Page 17: cg1

14

gcc <arquivo.c> -o <arquivo> -lglut -lGL -lGLU

1.5.2.6 Criando e Executando Programas com OpenGL

1. Execute o Dev-C++; 2. As informações para compilação e ligação de qualquer projeto ficam armazenadas em um arquivo do

tipo Project (extensão .dev); 3. Crie um novo projeto (menu File → New → Project). Selecione a guia Graphcs (ou MultiMedia) e em

seguida OpenGL. Escolha um nome para salvar o projeto. 4. Configure o projeto para utilização do OpenGL em menu Project – Project options, campo Further

object files or linker options com a inclusão das diretivas de ligação: -lopengl32 –lglut32 –lglu32 que especificam as DLLs a serem ligadas com esse programa.

5. Execute o programa (menu Execute – Run).

1.5.2.7 Primeiro Programa

Nos exemplos deste tutorial, que começam a ser apresentados a partir deste capítulo, é utilizada a biblioteca GLUT. Assim, eles podem ser compilados em várias plataformas sem a necessidade, por exemplo, de saber elaborar programas para ambiente Windows.

Para entender como funciona a GLUT, logo abaixo é apresentado o menor programa OpenGL possível, que simplesmente abre uma janela OpenGL. // Simple.c // The Simplest OpenGL program with GLUT // OpenGL SuperBible, 2nd Edition // Richard S. Wright Jr. /* Includes required */ #ifdef _WIN32 #include <windows.h> #endif #include <GL/glut.h> // Called to draw scene void RenderScene(void) { glClear(GL_COLOR_BUFFER_BIT); /* Clear the window with current clearing color */ glFlush(); /* Flush drawing commands */ } // Setup the rendering state void SetupRC(void) { glClearColor(0.0f, 0.0f, 1.0f, 1.0f); } // Main program entry point void main(void) { glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutCreateWindow("Simple"); glutDisplayFunc(RenderScene); SetupRC(); glutMainLoop(); }

Este programa simples contém quatro funções da biblioteca GLUT (prefixo glut), e três funções

OpenGL (prefixo gl). O conteúdo deste programa é descrito detalhadamente a seguir. • O arquivo glut.h contém os protótipos das funções utilizadas pelo programa. Ele também inclui os

Page 18: cg1

15

headers gl.h e glu.h que definem, respectivamente, as bibliotecas de funções OpenGL e GLU. O header windows.h é requerido por todas as aplicações windows, mas a sua inclusão é opcional porque a versão WIN32 da GLUT já inclui o windows.h na glut.h. Entretanto, se o objetivo é criar um código portável, é um bom hábito incluir este arquivo.

• glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); avisa a GLUT que tipo de modo de exibição deve ser usado quando a janela é criada. Neste caso os flags indicam a criação de uma janela single-buffered (GLUT_SINGLE) com o modo de cores RGBA (GLUT_RGB). O primeiro significa que todos os comandos de desenho são feitos na janela de exibição. Uma alternativa é uma janela double-buffered, onde os comandos de desenho são executados para criar uma cena fora da tela para depois rapidamente colocá-la na view. Este método é geralmente utilizado para produzir efeitos de animação. O modo de cores RGBA significa que as cores são especificadas através do fornecimento de intensidades dos componentes red, green e blue separadas.

• glutCreateWindow("Simple"); é o comando da biblioteca GLUT que cria a janela. Neste caso, é criada uma janela com o nome Simple. Este argumento corresponde a legenda para a barra de título da janela.

• glutDisplayFunc(RenderScene); estabelece a função RenderScene previamente definida como a função callback de exibição. Isto significa que a GLUT chama a função especificada sempre que a janela precisar ser redesenhada. Esta chamada ocorre, por exemplo, quando a janela é redimensionada ou encoberta. É nesta função que deve-se colocar as chamadas de funções de rendering OpenGL.

• SetupRC(); não é uma função OpenGL nem GLUT, é apenas uma convenção utilizada no livro no qual este tutorial está baseado. Nesta função são feitas as inicializações OpenGL que devem ser executadas antes do rendering. Muitos estados OpenGL devem ser determinados somente uma vez e não a cada vez que o rendering é realizado.

• glutMainLoop(); é a função que inicializa a execução do framework GLUT e processa todas as mensagens específicas do sistema operacional, teclas pressionadas, etc., até que o programa termine.

• glClearColor(0.0f, 0.0f, 1.0f, 1.0f); é a função que determina a cor utilizada para limpar a janela. Seu protótipo é: void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alfa);. GLclampf é definido como um float na maioria das implementações de OpenGL. O intervalo para cada componente red, green, blue é de 0 a 1. O componente alfa é usado para efeitos especiais, tal como transparência.

• glClear(GL_COLOR_BUFFER_BIT); "limpa" um buffer particular ou combinações de buffers, onde buffer é uma área de armazenamento para informações da imagem. Os componentes RGB são geralmente referenciados como color buffer ou pixel buffer. Existem vários tipos de buffer, mas por enquanto só é necessário entender que o color buffer é onde a imagem é armazenada internamente e limpar o buffer com glClear remove o desenho da janela.

• glFlush(); faz com que qualquer comando OpenGL não executado seja executado. Neste primeiro exemplo tem apenas a função glClear.

1.5.2.8 Segundo Programa com OpenGL

/* Includes required */ #ifdef _WIN32 #include <windows.h> #endif #include <GL/glut.h> /* Executada sempre que é necessario re-exibir a im agem */ void display(void) { /* Limpa a janela com a cor especificada como co r de fundo */ glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); /* muda a cor corren te do desenho */ glRectf(-0.5, 0.5, 0.5, -0.5); /* coordenadas ( x1,y1) e (x2,y2) */ glFlush(); /* forca a renderizacao efetiva dos g raficos ate então produzidos a

Page 19: cg1

16

armazenados no buffer */ /* Flush dos comandos de desenho que estejam no "pipeline" da OpenGL para conclusao da geracao da imagem */ } /* Inicializações do programa */ void myInit(void) { /* Os valores especificados são valores de RGBA (Re d-Green-Blue-Alpha) que variam de 0 a 1, do tipo float */ glClearColor(0.0, 0.0, 0.0, 0.0); /* Estabelece a cor de fundo ao limpar */ } /* Função ativada qdo a janela é aberta pela primei ra vez e toda vez que a janela é reconfigurada (movida ou modifica do o tamanho) */ void myReshape(int w, int h) { glViewport (0, 0, w, h); /* define a viewport para as dimensõesda janela */ glMatrixMode(GL_PROJECTION); /* limpa a matriz */ glLoadIdentity(); /* reset the proj ection matrix */ glOrtho(-1.0,1.0,-1.0,1.0,1.0,-1.0); /* ponto ce ntral, coordenadas orogonais */ glMatrixMode(GL_MODELVIEW); /* back to modelv iew matrix */ glLoadIdentity(); /* reset the proj ection matrix */ } /* Função ativada qdo alguma tecla é pressionada */ void Key(unsigned char key, int x, int y) { switch (key) { case 27: exit(1); break; /* Esc finaliza o programa */ default: break; } } /* Parte principal - ponto de início de execução */ /* Cria a janela com tamanho inicial, barra de titu lo, RGB display mode e especifica a função de callba ck de desenho */ int main(int argc, char** argv) { glutInit(&argc, argv); /* Indica que deve ser usado um unico buffer para a rmazenamento da imagem e representacao de cores RGB */ glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); /* especifica o tamanho em pixels da janela */ glutInitWindowSize(250, 250); /* especifica a posição do canto superior esquerd o da janela */ glutInitWindowPosition(0, 0); /* Cria uma janela com o titulo especificado */ glutCreateWindow("My First Program"); /* Executa a inicializacao de parametros de exibica o */ myInit (); /* Especifica para a OpenGL qual funcao deve ser at ivada para geracao da imagem */ glutDisplayFunc(display); /*Especifica para a OpenGL qual funcao deve ser ati vada para atualizar a janela*/ glutReshapeFunc (myReshape); /* Especifica para a OpenGL qual funcao deve ser at ivada qdo algo for digitado */ glutKeyboardFunc(Key); glutMainLoop(); return(0); }

Page 20: cg1

17

Este programa, como mostra a figura abaixo, apenas exibe um retângulo vermelho numa janela com fundo branco.

Algumas funções do exemplo anterior são descritas a seguir com mais detalhes: glutReshapeFunc(myReshape); estabelece a função myReshape previamente definida como a função callback de alteração do tamanho da janela. Isto é, sempre que a janela é maximizada, minimizada, etc., a função myReshape é executada para reinicializar o sistema de coordenadas. glColor3f(1.0f, 0.0f, 0.0f); determina a cor que será usada para o desenho (linhas e preenchimento). A seleção da cor é feita da mesma maneira que na função glClearColor, sendo que não é necessário especificar o componente alfa, cujo valor default é 1.0 (completamente opaco). glRectf(-0.5f, 0.5f, 0.5f, -0.5f); desenha um retângulo preenchido. Seus parâmetros são números de ponto flutuante, como denotado por f. O protótipo desta função é: void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);. Os quatro parâmetros representam dois pares de coordenadas, (x1,y1) e (x2,y2). O primeiro par representa o canto superior esquerdo do retângulo, e o segundo par representa o canto inferior direito. OpenGL mapea estas coordenadas para a posição atual da janela na função callback myReshape.

Antes de descrever os parâmetros e comandos da função myReshape, torna-se necessário revisar alguns conceitos e especificações. Em quase todos ambientes de janelas, o usuário pode alterar o tamanho e dimensões da janela em qualquer momento. Quando isto ocorre o conteúdo da janela é redesenhado levando em conta as novas dimensões. Normalmente o esperado é que a escala do desenho seja alterada de maneira que ele fique dentro da janela, independente do tamanho da janela ou do desenho. Assim, uma janela pequena terá o desenho completo, mas pequeno, e uma janela grande terá o desenho completo e maior. Apesar do exemplo mostrar um retângulo 2D, o desenho é feito em um espaço de coordenadas 3D. A função glRectf desenha o retângulo no plano xy em z=0. Neste caso, torna-se necessário determinar o tamanho da viewport e do volume de visualização, pois estes parâmetros influenciam o espaço de coordenadas e a escala dos desenhos 2D e 3D na janela.

Sempre que o tamanho da janela é alterado, a viewport e o volume de visualização devem ser redefinidos de acordo com as novas dimensões da janela. Assim, a aparência do desenho não é alterada (por exemplo, um quadrado não vira um retângulo). Como a alteração do tamanho da janela é detectada e gerenciada de maneira diferente em cada ambiente, a biblioteca GLUT fornece a função glutReshapeFunc, descrita anteriormente, que registra a função callback que a GLUT irá chamar sempre que houver esta alteração. A função passada para a glutReshapeFunc deve ter o seguinte protótipo: void myReshape(GLsizei w, GLsizei h);. O nome myReshape foi escolhido porque descreve o que a função faz. Os parâmetros recebidos sempre que o tamanho da janela é alterado são, respectivamente, a sua nova largura e a sua nova altura. Esta informação é usada para modificar o mapeamento do sistema de coordenadas desejado para o sistema de coordenadas da tela com a ajuda de duas funções OpenGL glViewport e glOrtho . Estas e outras funções chamadas na myReshape, que definem como a viewport é "setada", são descritas a seguir:

• glViewport(0, 0, w, h); recebe como parâmetro a nova largura e altura da janela. O protótipo desta função é: void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);. Seus parâmetros especificam o canto inferior esquerdo da viewport (x,y) dentro da janela, e a sua largura e altura em

Page 21: cg1

18

pixels (width e height). Geralmente x e y são zero, mas é possível usar a viewport para fazer o render de mais de uma cena em diferentes áreas da janela. Em outras palavras, a viewport define a área dentro janela, em coordenadas de tela, que a OpenGL pode usar para fazer o desenho. O volume de visualização é, então, mapeado para a nova viewport.

• glOrtho (-1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f); é usada para determinar que a projeção ortográfica ortográfica será utilizada para determinar o volume de visualização. O protótipo desta função é: void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);. No sistema de coordenadas cartesianas, os valores left e right especificam os limites mínimo e máximo no eixo X; analogamente, bottom e top especificam os limites mínimo e máximo no eixo Y, e near e far especificam os limites mínimo e máximo no eixo Z, geralmente, com os valores negativos para o lado oposto da posição do observador.

• glMatrixMode(GL_PROJECTION); e glLoadIdentity(); servem, respectivamente, para avisar a OpenGL que todas as futuras alterações, tais como operações de escala, rotação e translação, irão afetar a "câmera" (ou observador), e para "resetar" o sistema de coordenadas antes da execução de qualquer operação de manipulação de matrizes. Sem este comando, cada chamada sucessiva de glOrtho poderia resultar em uma corrupção da janela ou volume de visualização. Em outras palavras, a matriz de projeção é onde o volume de visualização é definido; a função glOrtho não estabelece realmente o volume de visualização utilizado para fazer o recorte, apenas modifica o volume existente; ela multiplica a matriz que descreve o volume de visualização corrente pela matriz que descreve o novo volume de visualização, cujas coordenadas são recebidas por parâmetro.

• glMatrixMode(GL_MODELVIEW); avisa a OpenGL que todas as futuras alterações, tais como operações de escala, rotação e translação, irão afetar os modelos da cena (o que é desenhado). A função glLoadIdentity(); chamada em seguida, faz com que a matriz corrente seja inicializada com a matriz identidade (nenhuma transformação é acumulada).

Sufixo Tipo de Dado Correspondência em C Tipo de Dados OpenGL

b 8-bit integer signed char GLbyte s 16-bit integer short GLshort i 32-bit integer int or long GLint, GLsizei f 32-bit floating-point float GLfloat, GLclampf d 64-bit floating-point double GLdouble, GLclampd ub 8-bit unsigned integer unsigned char GLubyte, GLboolean us 16-bit unsigned integer unsigned short GLushort ui 32-bit unsigned integer unsigned int or unsigned long GLuint, GLenum, GLbitfield

Os dez tipos de primitivas do OpenGL são:

Page 22: cg1

19

2. Fundamentos Matemáticos

2.1 Sistemas de Coordenadas É necessário definir sistemas de coordenadas para quantificar os dados sendo manipulados. Já que as

coordenadas do dispositivo podem variar bastante entre diferentes equipamentos, utiliza-se coordenadas normalizadas do dispositivo.

Em geral, são definidos três sistemas de coordenadas: • sistema de coordenadas do mundo; • sistema de coordenadas do dispositivo; • sistema de coordenadas normalizadas do dispositivo.

2.1.1 Sistema de Coordenadas do Mundo Consiste de coordenadas cartesianas (x, y) em um intervalo qualquer definido pelo usuário. Estas

coordenadas não se referem a nenhuma unidade de medida específica, sendo portanto, adimensionais. Chama-se coordenada do usuário ao sistema de coordenadas que um usuário escolhe para trabalhar.

• mais freqüente: sistema cartesiano • outra opção: sistema polar

Para o GKS => Sistema cartesiano => chamado de World Coordinates (WC).

Os objetos (gráficos) são especificados no sistema de coordenadas do usuário e devem ser convertidos

em coordenadas apropriadas do dispositivo físico. A porção do desenho que deve aparecer na tela é chamada de JANELA. A janela pode apresentar porção do objeto, objeto inteiro ou objeto mais área vazia. Uma janela é geralmente definida pelas coordenadas superior e inferior. Formato geral da definição de uma janela: WINDOW(min_x, max_x, min_y, max_y)

2.1.2 Sistema de Coordenadas do Dispositivo Consiste do conjunto de pixels endereçáveis pelo dispositivo. Os pixels são endereçados por dois

números inteiros que correspondem as coordenadas horizontal e vertical. Em geral, o pixel (0, 0) localiza-se no canto superior esquerdo do retângulo de visualização.

2.1.3 Sistema de Coordenadas Normalizadas do Dispos itivo Este sistema é intermediário entre os dois anteriores, definido de tal forma que todo o conteúdo da

janela de apresentação possua as coordenadas variando no intervalo [0, 1] × [0, 1].

Coordenadasdo Mundo

CoordenadasNormalizadas

Coordenadasdo Dispositivo

Wraparound: o uso de escalas deferentes por programadores diferentes pode gerar problemas de um desenho aparecer recortado ao se mudar o dispositivo de saída pelo novo programador/operador. A falta de uso de escalas normalizadas pode gerar tal problema.

Para contornar o problema anterior, considerando a grande diversidade de equipamentos existentes, com diferentes resoluções gráficas, onde há um sistema de coordenadas para cada tipo de dispositivo, propõe-se o sistema de coordenadas normalizadas (NDC - Normalized Device Coordinates) com valores de coordenadas variando de 0 a 1.

A porção retangular da tela sobre a qual a janela e todo seu conteúdo são mapeadas é chamada de

Page 23: cg1

20

Viewport.

Definição de uma viewport: VIEWPORT(min_x, max_x, min_y, max_y)

Numa situação em que definamos diferentes viewports teremos: VIEWPORT1 (0.0 , 0.5 , 0.0 , 0.5) VIEWPORT2 (0.5 , 1.0 , 0.0 , 0.5) VIEWPORT3 (0.0 , 0.5 , 0.5 , 1.0) VIEWPORT4 (0.5 , 1.0 , 0.5 , 1.0)

0.5

0.5 x

y

viewport 1 viewport 2

viewport 3 viewport 4

2.1.4 Visualização Janela de Desenho (Janela): define a porção do desenho que deve aparecer no dispositivo gráfico.

Normalmente esta janela é definida por meio de um retângulo indicado por dois pontos: canto inferior (xd1, yd1) e canto superior (xd2, yd2). O sistema de coordenadas de desenho associado à janela é denominado de coordenadas do usuário.

Janela de Apresentação (Viewport): define a porção do dispositivo gráfico de saída onde deve ser apresentada a porção do desenho definida por sua janela. O sistema de coordenadas associado é denominado de sistema de coordenadas do dispositivo.

quatro janelas definidas

sobre o desenho três janelas de visualização

apresentando a janela de desenho 3

2.1.5 Mapeamento O processo de visualização baseia-se na mudança de sistemas de coordenadas. Matematicamente, este

mapeamento é descrito através de fórmulas expressando a proporcionalidade, ou seja, o posicionamento relativo de um ponto (xd, yd) na janela de desenho deve-se refletir no ponto correspondente (xv, yv) na janela de visualização.

Assim, por interpolação, obtém-se:

Page 24: cg1

21

)(* 112

121

12

1

12

1 xdxdxdxd

xvxvxvxv

xvxv

xvxv

xdxd

xdxd −−−+=⇒

−−=

−−

ou xv = xv1 + fat_vis_x ∗ (xd − xd1)

onde fat_vis_x = 12

12

xdxd

xvxv

−−

Analogamente, yv = yv1 + fat_vis_y ∗ (yd − yd1)

onde fat_vis_y = 12

12

ydyd

yvyv

−−

Desta forma, calcula-se para cada ponto (xd, yd) da janela de desenho, o correspondente ponto na

janela de visualização (xv, yv). Os fatores de visualização fat_vis_x e fat_vis_y explicam as deformações nos casos de janelas geometricamente não semelhantes: se estes fatores forem diferentes, a imagem será deformada.

WC

(xd1, yd1)

(xd2, yd2)

(xd, yd)

NDC

(xv1, yv1)

(xv2, yv2)

(xv, yv)

(0,0)

(1, 1)

x

y

Mapeamento (graficamente)

2.2 Conceitos Matemáticos para Computação Gráfica

2.2.1 Matrizes Definição: Uma matriz é um agrupamento retangular de números. Os números neste agrupamento são

chamados entradas da matriz. O tamanho de uma matriz é descrito em termos do número de linhas e colunas que contém. Uma matriz com somente uma coluna é chamada matriz-coluna (ou vetor-coluna) e uma matriz com somente uma linha é chamada matriz-linha (ou vetor-linha).

Alguns exemplos de matrizes são:

32113

301

x

123

2

x

[ ] 412120 x−

A entrada que ocorre na i-ésima linha e j-ésima coluna de uma matriz A é denotada por aij. Assim, uma

matriz arbitrária m x n pode ser escrita como Uma matriz A com n linhas e n colunas é chamada matriz quadrada de ordem n e as entradas a11, a22, ..., ann constituem a diagonal principal.

Page 25: cg1

22

mxnmnmmm

n

n

n

aaaa

aaaa

aaaa

aaaa

L

MLMMM

L

L

L

321

3333231

2232221

1131211

2.2.1.1 Matriz Diagoanal

Uma matriz quadrada na qual todas as entradas fora da diagonal principal são zero é chamada matriz diagonal. Aqui temos alguns exemplos:

10

03

−300

010

002

− 2000

0200

0000

0004

2.2.1.2 Matrizes Triangulares

Uma matriz quadrada na qual todas as entradas acima da diagonal principal são zero é chamada triangular inferior e uma matriz quadrada na qual todas as entradas abaixo da diagonal principal são zero é chamada triangular superior. Uma matriz que é triangular inferior ou triangular superior é chamada triangular.

44

3433

242322

14131211

000

00

0

a

aa

aaa

aaaa

Matriz triangular superior 4 x 4 arbitrária

44434241

333231

2221

11

0

00

000

aaaa

aaa

aa

a

Matriz triangular inferior 4 x 4 arbitrária

2.2.1.3 Matriz Transposta

Se A é uma matriz m x n qualquer, então a transposta de A, denotada por AT, é definida como uma matriz n x m que resulta da permutação das linhas com as colunas de A; ou seja, a primeira coluna de AT é a primeira coluna de A, a segunda coluna de AT é a segunda linha de A, e assim por diante.

A seguir, alguns exemplos de matrizes e suas transpostas:

A =

102

321 B =

−−

320

214

012

AT =

13

02

21

BT =

−−320

211

042

2.2.1.4 Matriz Identidade

De especial interesse são as matrizes quadradas com entradas 1 na diagonal principal e com entradas 0 fora da diagonal principal, tais como:

Page 26: cg1

23

10

01

100

010

001

1000

0100

0010

0001

Uma matriz desta forma é chamada uma matriz identidade e é denotada por I. Se for importante enfatizar seu tamanho, nós escrevemos In para matriz identidade de tamanho n x n. Se A é uma matriz m x n, então, como ilustra o seguinte exemplo,

AIn = A e ImA = A

2.2.1.5 Matriz Inversa

Dada uma matriz quadrada A, se pudermos encontrar uma matriz B de mesmo tamanho tal que AB = BA = I, então diremos que A é invertível e que B é uma inversa de A. Se não puder ser encontrada uma tal matriz B então diremos que A é não-invertível ou singular. A matriz

B =

21

53 é uma inversa de A =

−−31

52

pois

AB =

−−31

52.

21

53 =

10

01 = I

e

BA =

21

53.

−−31

52 =

10

01 = I

2.2.1.6 Operações Matriciais

2.2.1.6.1 Adição e Subtração

Definição: Se A e B são matrizes de mesmo tamanho, então a soma A + B é a matriz obtida somando as entradas de B às entradas correspondentes de A, e a diferença A – B é a matriz obtida subtraindo as entradas de B das entradas correspondentes de A. Matrizes de tamanho distintos não podem ser somadas ou subtraídas. Exemplo:

A =

−302

214

132

B =

−−

320

214

012

A + B =

− 622

400

144

A − B =

−022

028

120

2.2.1.6.2 Múltiplos Escalares

Definição: Se A é uma matriz e c é um escalar, então o produto cA é a matriz obtida pela multiplicação de cada entrada da matriz A por c. A matriz cA é chamada múltiplo escalar de A. Exemplo:

A =

−302

214

132

2A =

−604

428

264

2.2.1.6.3 Produto de Matrizes

Page 27: cg1

24

Definição: Se A é uma matriz m x r e B é uma matriz r x n, então o produto AB é a matriz m x n cujas entradas são determinadas como segue. Para obter a entrada na linha i e coluna j de AB, destaque a linha i de A e a coluna j de B. Multiplique as entradas correspondentes desta linha e desta coluna e então some os produtos resultantes. Exemplo:

A =

032

121 B =

−−

102

320

413

AB =

−−

146

135

A definição de multiplicação de matrizes exige que o número de colunas do primeiro fator A seja igual ao número de linhas do segundo fator B para que seja possível formar o produto AB. Se esta condição não é satisfeita, o produto não está definido.

A Bm x r r x n

ABm x n

Se os números internos coincidem, então o produto está definido.

2.2.1.7 A Função Determinante

Se A é uma matriz quadrada. A função determinante é denotada por det e nós definimos det(A) como a soma de todos os produtos elementares com o sinal de A. O número det(A) é chamado determinante de A. Exemplo:

D = 7

121

112

111

=−

2.2.1.8 Propriedades da Função Determinante

• Teorema 1: Se A for uma matriz quadrada qualquer, então det(A) = det(AT). • Teorema 2: Se A e B forem matrizes quadradas de mesmo tamanho, então det(AB) = det(A).det(B). • Teorema 3: Uma matriz A é inversível se, e somente se, det(A) ≠ 0.

2.2.2 Vetores Os vetores podem ser representados geometricamente como segmentos de reta orientados ou como

flechas nos espaços bi e tridimensionais. A direção e o sentido da flecha especificam a direção e o sentido do vetor e o comprimento da flecha descreve sua magnitude. A cauda da flecha é chamada de ponto inicial do vetor e a ponta da flecha é o ponto final.

A

B

O vetor AB

Vetores equivalentes

Definição: Sejam v e w dois vetores quaisquer. A soma de v com w é o vetor v + w determinado da seguinte maneira: posicione o vetor w de tal maneira que seu ponto inicial coincide com o ponto final do vetor v. O vetor v + w é representado pela flecha do ponto inicial de v ao ponto final de w.

Page 28: cg1

25

v

w

v+w

Definição: Se v e w são dois vetores quaisquer então a diferença de w por v é definida por

v – w = v + (-w)

v

w

v-w

Se v é um vetor não-nulo e k é um número real (escalar) não-nulo, então o produto kv é definido como o vetor de mesma direção de v e cujo comprimento é |k| vezes o comprimento de v e cujo sentido é o mesmo de v se k > 0 e oposto ao de v se k < 0. Nós definimos kv = 0 se k = 0 ou se v = 0.

v

1/2v

-v

2.2.2.1 Vetores em Sistemas de Coordenadas

A introdução de um sistema de coordenadas retangulares muitas vezes simplifica problemas envolvendo vetores. Seja v qualquer vetor no plano e suponha que v tenha sido posicionado com seu ponto inicial na origem de um sistemas de coordenadas retangulares. As coordenadas (v1, v2) do ponto final de v são chamadas componentes de v e escrevemos: v = (v1, v2).

yv

x

(v1, v2)

2.2.2.2 Vetores no Espaço Tridimensional

Assim como os vetores no plano podem ser descritos por pares de números reais, os vetores no espaço podem ser descritos por termos de números reais utilizando um sistema de coordenadas retangulares. Para construir um tal sistema de coordenadas, selecionamos o ponto O, denominado a origem e escolhemos três retas mutuamente perpendiculares passando pela origem, denominadas eixos coordenados. Designe estes eixos x, y e z e selecione um sentido positivo para cada eixo coordenado, bem como uma unidade de comprimento para medir tamanhos. Cada par de eixos coordenados determina uma plano chamado plano coordenado. Referimo-nos aos planos coordenados como os planos xy, xz e yz. A cada ponto P no espaço tridimensional associamos um termo (x, y, z) de números, chamados coordenadas de P, como segue: passe três planos por P paralelos aos planos coordenados e denote os pontos de intersecção destes planos com os três eixos coordenados por X, Y e Z.

Page 29: cg1

26

y

zx0

y

zx0

P

x'

z'

y'

Na figura abaixo construímos o ponto cujas coordenadas são (3, 4, 5):

y

z

x0

P

3

5

4

2.2.2.3 Operando com Vetores Usando Componentes

Se v = (1, -3, 2) e w = (4, 2, 1) então

v + w = (5, -1, 3), 2v = (2, -6, 4), -w = (-4, -2, -1), v – w = (-3, -5, 1)

Às vezes um vetor não está posicionado com o seu ponto inicial na origem. Se o vetor 21PP tem o ponto inicial P1 (x1, y1, z1) e ponto final P2 (x2, y2, z2) então

21PP = (x2 – x1, y2 – y1, z2 – z1)

ou seja, os componentes do vetor 21PP são obtidos subtraindo as coordenadas do ponto final.

OP1

OP2

P1P2

P1(x1, y1, z1)P2(x2, y2, z2)

x

z

y

Os componentes do vetor v = 21PP com ponto inicial P1 (2, -1, 4) e final P2 = (7, 5, -8) são

v = (7 – 2, 5 – (-1), (-8) – 4) = (5, 6, -12) No espaço bidimensional o vetor com ponto inicial P1 (x1, y1) e ponto final P2 (x2, y2) é

21PP = (x2 – x1, y2 – y1)

Page 30: cg1

27

2.2.2.4 Produto Vetorial e Escalar

Exercícios: 1) Desenhe um sistema de coordenadas de mão direita e marque os pontos cujas coordenadas são:

a) (2, 3, 5) b) (-3, 0, 0) c) 2, 1, 0) d) (1, 1, 1) e) (3, -4, 5) 2) Esboce os seguintes vetores com ponto inicial na origem:

a) v1 = (3, 6) b) v2 = (3, 0) c) v = (3, -1) d) v4 = (-3, -2, 4) 3) Encontre os componentes do vetor de ponto inicial P1 e ponto final P2:

a) P1 = (4, 5) P2 = (3, 1)

Page 31: cg1

28

3. Algoritmos Básicos para Rasterização de Primitiv as Gráficas

3.1 Traçado de Linhas A geração de retas em terminais matriciais merece um estudo cuidadoso, desde que a matriz da tela é

formada por um conjunto de pontos discretos (pixels). Além do aspecto visual indesejável que a discretização acarreta (serrilhado) quando a reta possui orientação cujo ângulo não é múltiplo de 45 graus, é importante que a reta comece e termine exatamente nos pontos especificados. É conveniente também que a geração da reta seja bastante rápida.

Uma primeira abordagem para se obter um segmento de reta entre os pontos (x1, y1) e (x2, y2) é utilizar a equação analítica da reta:

y = y1 + m(x + x1)

onde m = (y2 − y1) / (x2 − x1) é o coeficiente angular da reta, ou seja, a tangente do ângulo de inclinação.

Dados os pontos extremos do segmento de reta (x1, y1) e (x2, y2) podem-se calcular os valores de y a partir de incrementos unitários em x. O pseudocódigo abaixo ilustra a técnica. int x, y, x1, x2, y1, y2, cor; float m; if (x1 != x2) // reta não vertical { m = (y2 - y1) / (x2 - x1); for (x = x1; x <= x2; x++) {

y = y1 + m * (x - x1); // arredonda y PutPixel(x, y, cor);

} } else for (y = y1; y <= y2; y++)

PutPixel(x, y, cor);

O pseudocódigo acima resolve o problema para contidas no primeiro quadrante (0 ≤ m ≤ 1). Além

disso, ele requer operações com ponto flutuante, não sendo eficiente.

Uma outra técnica utiliza a equação diferencial da reta:

dx

dy

x

y =∆∆

Nesta equação, incrementos de correspondem a incrementos proporcionais em y. Isto é, não é

necessário calcular o valor de y a cada incremento de x, mas simplesmente somá-lo a um valor fixo pré-estabelecido. A fórmula incremental é mais rápida do que a analítica, pois evita a multiplicação na iteração do pseudocódigo anterior.

O pseudocódigo abaixo pode ser utilizado na geração incremental de retas. if (x2 - x1) > (y2 - y1) { incremento = (y2 - y1) / (x2 - x1); y = y1; for (x = x1; x <= x2; x++) { PutPixel(x, y, cor); y = y + incremento; }

Page 32: cg1

29

} else { incremento = (x2 - x1) / (y2 - y1); x = x1; for (y=y1; y <= y2; y++) { PutPixel(x, y, cor); x = x + incremento; } }

Observe que há apenas uma operação de divisão por linha desenhada, o que melhora muito a

eficiência do algoritmo. O valor de incremento, entretanto, é um número fracionário, o que não é interessante para a maioria das aplicações.

Um algoritmo incremental bastante conhecido ´e chamado de Digital Differential Analyzer (DDA). Ele também utiliza a equação diferencial da reta:

dx

dy = constante ou

12

12

xx

yy

x

y

−−=

∆∆

A solução para a equação diferencial acima é:

yi+1 = yi + ∆y

yi+1 = yi + 12

12

xx

yy

−− ∆x

x1, x2, y1 e y2 são os pontos extremos do segmento de reta e yi é o valor para cada passo ao longo da reta. O maior valor entre ∆x e ∆y é escolhido como uma unidade de discretização.

O pseudocódigo para o algoritmo DDA que funciona para qualquer quadrante é mostrado abaixo:

- assume-se que os pontos extremos (x1, y1) e (x2, y2) são diferentes - floor: função inteira. Observe que aqui floor(−1.5) = −2, ao invés de −1. - sign: retorna −1, 0 ou 1, quando seu argumento é menor que 0, igual a zero ou maior que zero,

respectivamente. #define sgn(x) ((x<0)?-1:((x>0)?1:0)) /* macro to r eturn the sign of a number */

if (abs(x2 - x1) >= abs(y2 - y1)) length = abs(x2 - x1); else length = abs(y2 - y1); // selecionar o maior entre ∆x e ∆y ∆x = (x2 - x1) / length; ∆y = (y2 - y1) / length; // arrendondar os valores ao invés de truncá-los // usar a função sign para permitir que o algoritmo funcione em todos os quadrantes x = x1 + 0.5 * sign( ∆x); y = y1 + 0.5 * sign( ∆y); i = 1; while (i <= length) { PutPixel(floor(x), floor(y), cor); x = x + ∆x; y = y + ∆y; i = i + 1; }

Page 33: cg1

30

3.1.1 Algoritmo de Bresenham Embora originalmente desenvolvido para plotters, o algoritmo de Bresenham é apropriado para

desenhar retas em dispositivos do tipo CRT. O algoritmo procura selecionar as posições discretas ótimas para representar o segmento de reta. O algoritmo sempre incrementa de uma unidade a variável x ou y, dependendo da inclinação da reta. O incremento na outra variável (de zero ou um) é determinado através da análise da distância entre a posição da reta real e as posições discretas mais próximas. Esta distância é chamada de erro. O algoritmo é cuidadosamente construído de tal forma que apenas o sinal do erro é necessário na análise.

O algoritmo de Bresenham para o primeiro octante é dado abaixo:

- assume-se que os pontos extremos (x1, y1) e (x2, y2) são diferentes int x, y, ∆x, ∆y, i; float e; // inicializa variáveis x = x1; y = y1; ∆x = x2 - x1; ∆y = y2 - y1; e = ∆y/ ∆x - 1/2; for (i=1; i<= ∆x; i++) { PutPixel(x, y, cor); while (e >= 0) { y++; e--; } x++; e = e + ∆y/ ∆x; }

Uma versão do algoritmo de Bresenham utilizando apenas aritmética inteira é dada abaixo:

x = x1; y = y1; ∆x = x2 - x1; ∆y = y2 - y1; e = 2 * ∆y - ∆x; for (i=1; i<= ∆x; i++) { PutPixel(x, y, cor); while (e >= 0) { y++; e = e - 2 * ∆x; } x++; e = e + 2 * ∆y; }

A implementação do algoritmo de Bresenham para funcionar em outros octantes requer a análise da

posição da reta e sua inclinação. Quando a magnitude absoluta da inclinação da reta for maior do que 1, y é incrementado de um e o critério de erro de Bresenham é utilizado para determinar quando incrementar x. Se x ou y deve ser incrementado por −1 ou +1, depende do quadrante. Isto é ilustrado na figura a seguir:

Page 34: cg1

31

x

y

x = x + 1y = y + 1

x = x + 1y = y - 1

x = x - 1y = y - 1

x = x - 1y = y + 1

O algoritmo de Bresenham para todos os quadrantes utilizando apenas aritmética inteira é dado abaixo:

// inicializa variáveis x = x1; y = y1; x = abs(x2 - x1); y = abs(y2 - y1); s1 = sign(x2 - x1); s2 = sign(y2 - y1); // trocar ∆y e ∆x, dependendo da inclinação da reta if ( ∆x > ∆y) { aux = ∆x; ∆x = ∆y; ∆y = aux; trocou = 1; } else trocou = 0; e = 2 * ∆y - ∆x; for (i=1, i<= ∆x; i++) { PutPixel(x, y, cor); while (e >= 0) { if (trocou == 1) x = x + s1; else y = y + s2; e = e - 2 * ∆x; } if (trocou == 1) y = y + s2; else x = x + s1; e = e + 2 * ∆y; }

3.1.2 Exercícios Resolvidos 1) Os pontos extremos de um dado segmento de reta são (0, 0) e (6, 18). Calcule os valores de y, para x variável entre 0 e 6, e desenhe o resultado. Solução: Não foi dada a equação para um segmento de reta. Por isso, tem de ser determinada e equação da reta (y = mx + b) é encontrada da seguinte maneira: Primeiro é calculado a inclinação da reta:

m = 12

12

xx

yy

x

y

−−=

∆∆

= 06

018

−−

= 6

18 = 3

a seguir é calculado o ponto b1, onde a reta intersecta o eixo y, substituindo y1 e x1 na equação y = 3x + b: 0 = 3(0) + b. Como b = 0, a equação da reta é y = 3x.

Page 35: cg1

32

x y = 3x + 0 0 0 1 3 2 6 3 9 4 12 5 15 6 18

2) Quais são os passos exigidos para traçar um segmento de reta usando o método do declive? Solução:

1. Calcular dx: dx = x2 − x1 2. Calcular dy: dy = y2 − y1 3. Calcular m: m = dy/dx 4. Calcular b: b = y1 − m * x1 5. Inicializar (x, y) com as coordenadas do ponto extremo inferior esquerdo e xfim com o maior valor

de x. Se dx < 0, então x = x2, y = y2 e xfim = x1. Se dx > 0, então x = x1, y = y1 e xfim = x2. 6. Testar se todo o segmento de reta já foi desenhado. Se x > xfim, pára. 7. Desenhar um ponto nas coordenadas correntes (x, y). 8. Incrementar x: x = x + 1. 9. Calcular o próximo valor de y a partir da equação y = mx + b. 10. Continuar no passo 6.

3) Quais são os passos exigidos para desenhar, usando o método de Bresenham, um segmento de reta cuja inclinação está entre 0 e 45 graus? Solução:

1. Calcular os valores iniciais:

dx = x2 − x1 Inc2 = 2 * (dy − dx) dy = y2 − y1 d = Inc1 − dx Inc1 = 2 * dy

2. Inicializar (x, y) com o valor do ponto extremo inferior esquerdo e xfim com o maior valor de x. Se

dx < 0, então x = x2, y = y2, xfim = x1. Se dx > 0, então x = x1, y = y1 e xfim = x2. 3. Desenhar um ponto nas coordenadas correntes (x, y). 4. Testar se todo segmento de reta foi desenhado. Se x > xfim, pára. 5. Calcular a localização do próximo pixel. Se d < 0, então d = d + Inc1. Se d ≥ 0, então d = d + Inc2,

e então y = y + 1. 6. Incrementar x: x = x + 1. 7. Desenhar um ponto nas coordenadas correntes (x, y). 8. Continuar no passo 4.

4) Indicar que localizações serão calculadas pelo algoritmo de Bresenham quando se gera por varrimento um segmento de reta entre (1, 1) e (8, 5) em coordenadas do monitor vídeo. Solução: Primeiro têm de ser calculado os valores iniciais. Neste caso:

Page 36: cg1

33

dx = x2 − x1 = 8 − 1 = 7 dy = y2 − y1 = 5 − 1 = 4

Assim:

Inc1 = 2 * dy = 2 * 4 = 8 Inc2 = 2 * (dx − dy) = 2 * (4 − 7) = −6

d = Inc1 − dx = 8 − 7 = 1 A tabela abaixo indica os valores calculados pelo algoritmo.

d x y 1 + Inc2 = −5 1 1 −5 + Inc1 = 3 2 2 3 + Inc2 = −3 3 2 −3 + Inc1 = 5 4 3 5 + Inc2 = −1 5 3 −1 + Inc1 = 7 6 4 7 + Inc2 = 1 7 4

8 5

3.2 Traçado de Circunferência A equação de uma circunferência com centro na origem e raio R, em coordenadas cartesianas, é dada

por:

x2 + y2 = R2

Circunferências não centradas na origem podem ser transladadas para a posição (0, 0), e os pixels reais podem ser traçados aplicando-se um deslocamento aos pixels gerados pelo algoritmo de traçado.

Outra abordagem seria utilizar a equação paramétrica da circunferência:

x = R cos(t) y = R sen(t)

onde 0 ≤ t ≤ 2π.

x

y(y, x)

(x, y)

(x, -y)

(y, -x)(-y, -x)

(-x, -y)

(-x, y)

(-y, x)

Note que o traçado de uma circunferência pode tirar proveito de sua simetria. Considere uma circunferência centrada na origem. Se o ponto (x, y) pertence à circunferência, pode-se calcular de maneira trivial sete outros pontos da circunferência, conforme mostrado na figura abaixo. Conseqüentemente, basta calcular um arco de circunferência de 45 graus para obter a circunferência toda. Para uma circunferência com centro na origem, os oito pontos simétricos podem ser traçados usando o procedimento CirclePoints apresentado a seguir: void CirclePoints(int x, int y, int cor) { PutPixel(x, y, cor);

Page 37: cg1

34

PutPixel(y, x, cor); PutPixel(y, -x, cor); PutPixel(x, -y, cor); PutPixel(-x, -y, cor); PutPixel(-y, -x, cor); PutPixel(-y, x, cor); PutPixel(-x, y, cor); }

Um algoritmo de Bresenham para traçado de circunferência é mostrado abaixo. É assumido que o raio

está centrado em (0, 0).

void Circle(int raio) { x = 0; y = raio; d = 3 - 2 * raio; while (x < y) { CirclePoints(x, y, cor); if (d < 0) d = d + 4 * x + 6; else { d = d + 4 * (x - y) + 10; y = y -1; } x = x + 1; } if (x = y) CirclePoints(x, y, cor); }

3.2.1 Exercícios Resolvidos 1) Que passos são exigidos para gerar, por varrimento, uma circunferência usando o método polinomial? Solução:

1. Inicializar as variáveis: r = raio da circunferência; (h, k) = coordenadas do centro da circunferência; (x, y) = coordenadas do centro da circunferência; k = 0; i = valor do incremento;

xfim = 2r . 2. Testar se a circunferência foi totalmente gerada. Se x > xfim, pára.

3. Calcular o valor da coordenada y, onde y = 22 xr − . 4. Com as coordenadas correntes desenhar oitos pontos, encontrados por simetria relativamente ao

centro (h, k): Desenha(x + h, y + k) Desenha(−x + h, −y + k) Desenha(y + h, x + k) Desenha(−y + h, −x + k) Desenha(−y + h, x + k) Desenha(y + h, −x + k) Desenha(−x + h, y + k) Desenha(x + h, −y + k)

5. Incrementar x: x = x + i. 6. Continuar no passo 2.

2) Que passos são exigidos para gerar, por varrimento, uma circunferência usando o método trigonométrico? Solução:

1. Inicializar as variáveis: r = raio da circunferência; (h, k) = coordenadas do centro da circunferência; i = valor do incremento; θfim = (22/7)/4 {(22/7)/4 = π/4 = 90º}; θ = 0.

Page 38: cg1

35

2. Testar se a circunferência foi totalmente gerada. Se θ > θfim, pára. 3. Calcular o valor da coordenada x e y:

x = r * cos(θ) y = r * sen(θ)

4. Com as coordenadas correntes (x, y), desenhar os oitos pontos, determinados por simetria relativamente ao centro (h, k):

Desenha(x + h, y + k) Desenha(−x + h, −y + k) Desenha(y + h, x + k) Desenha(−y + h, −x + k) Desenha(−y + h, x + k) Desenha(y + h, −x + k) Desenha(−x + h, y + k) Desenha(x + h, −y + k)

5. Incrementar θ: θ = θ + i. 6. Continuar no passo 2.

3) Quais são os passos exigidos para converter, por varrimento, uma circunferência usando o algoritmo de Bresenham? Solução:

1. Inicializar o valor das variáveis (h, k) = coordenadas do centro da circunferência; x = 0; y = raio da circunferência; e d = 3 − 2 * r.

2. Verificar se a circunferência foi gerada na totalidade. Se x > y, pára. 3. Calcular a localização do próximo pixel. Se d < 0, então d = d + 4 * x + 6 e x = x + 1. Se d ≥ 0,

então d = d + 4 * (x − y) + 10, x = x + 1 e y = y − 1. 4. Com as coordenadas correntes (x, y), desenhar os oitos pontos determinados por simetria

relativamente ao centro (h, k): Desenha(x + h, y + k) Desenha(−x + h, −y + k) Desenha(y + h, x + k) Desenha(−y + h, −x + k) Desenha(−y + h, x + k) Desenha(y + h, −x + k) Desenha(−x + h, y + k) Desenha(x + h, −y + k)

5. Continuar no passo 2.

3.3 Traçado de Elipse A elipse apresenta, tal como a circunferência, simetria. No caso da elipse é, todavia, uma simetria em

relação a dois eixos em vez de a quatro eixos. Para a definição matemática de uma elipse há dois métodos.

3.3.1 Método Polinomial A definição polinomial de uma elipse é dada pela expressão:

( ) ( )1

2

2

2

2

=−+−b

ky

a

hx

onde: (h, k) = centro da elipse a = comprimento do eixo maior b = comprimento do eixo menor

Page 39: cg1

36

a

b

centro

h

k

x

y

Descrição polinomial da elipse

Quando é usado o método polinomial para definir uma elipse, o valor de x é incrementado de h até a. Para cada incremento de x é determinado o valor de y, calculando a expressão:

ka

hxby +−−=

2

2

1

Este método é, no entanto, muito ineficiente, porque têm de ser determinados os quadrados de a e (x − h); depois têm de ser calculadas, em ponto flutuante, a divisão de (x − h)2 por a2 e a multiplicação da raiz quadrada por b.

3.3.2 Método Trigonométrico Um segundo método de definição de uma elipse faz uso de funções trigonométricas. As equações

seguintes definem trigonometricamente uma elipse: x = a * cos(θ) + h e y = b * sen(θ) + k onde: (x, y) = coordenadas correntes a = comprimento do eixo maior b = comprimento do eixo menor θ = ângulo corrente (h, k) = centro da elipse

a

b

centro

h

k

x

y

θ

(a cos(θ)+h, b sen(θ)+k)

Descrição trigonométrica de uma elipse

Para a conversão por varrimento de uma elipse usando o método trigonométrico, o valor de θ varia de

0 a π/2 radianos (rad). Os pontos restantes são determinados por simetria. Embora este método também seja ineficiente e, por isso, geralmente lento para aplicações interativas, pode ser usada uma tabela de referência para com os valores de sen(θ) e cos(θ), para os valores compreendidos entre 0 e π/2.

3.3.3 Exercícios Resolvidos 1) Quais são os passos exigidos para gerar uma elipse pelo método polinomial? Solução:

1. Inicializar as variáveis a = comprimento do eixo maior; b = comprimento do eixo menor; (h, k) =

Page 40: cg1

37

coordenadas do centro da elipse; x = 0; i = valor do incremento; xfim = a. 2. Testar se a elipse foi totalmente gerada. Se x > xfim, pára. 3. Calcular o valor da coordenada y:

2

2

1a

xby −=

4. Com as coordenadas correntes (x, y), desenhar os quatro pontos determinados por simetria:

Desenha(x + h, y + k) Desenha(−x + h, −y + k) Desenha(−x + h, y + k) Desenha(x + h, −y + k)

5. Incrementar x: x = x + i. 6. Continuar no passo 2.

2) Quais são os passos exigidos para gerar por varrimento uma elipse pelo método trigonométrico? Solução:

1. Inicializar as variáveis a = comprimento do eixo maior; b = comprimento do eixo menor; (h, k) = coordenadas do centro da elipse; i = valor do incremento; θfim = 11/7 = π/2; θ = 0.

2. Testar se a elipse foi totalmente gerada. Se θ > θfim, pára. 3. Calcular os valores das coordenadas x e y:

x = a * cos(θ) y = b * sen(θ)

4. Com as coordenadas correntes (x, y), desenhar os quatro pontos determinados por simetria: Desenha(x + h, y + k) Desenha(−x + h, −y + k) Desenha(−x + h, y + k) Desenha(x + h, −y + k)

5. Incrementar θ: θ = θ + i. 6. Continuar no passo 2.

3.4 Traçado de Arcos e Setores

3.4.1 Arcos Um arco pode ser gerado pelo método polinomial ou trigonométrico. Quando é usado o método

trigonométrico, o valor inicial é igual a θ 1 e o valor final é igual a θ 2. Os passos restantes são semelhantes aos usados para conversão por varrimento de uma circunferência, com exceção de que neste caso não é usada a simetria.

y

xθ1

θ2

x1 x2

y

x

Quando é usado o método polinomial, o valor de x variará entre x1 e x2, e os valores de y serão

calculados pela expressão 22 xr − . Do ponto de vista do programador, os arcos surgem como não sendo mais do que porções de

circunferências. Todavia, ocorrem problemas se são usados, no desenho de um arco, algoritmos como o

Page 41: cg1

38

algoritmo de Bresenham. No caso do algoritmo de Bresenham, têm de ser especificados os pontos extremos de um arco em termos de coordenadas x e y. Quando os pontos extremos têm de ser determinados, a formulação genérica torna-se ineficiente. Isto acontece porque têm de ser determinados os pontos extremos para cada incremento de 45º do arco. Cada um dos oito pontos determinados por simetria têm de ser testados. Como resultado, a rotina para desenhar um arco, baseada no algoritmo de Bresenham, despende o tempo necessário para calcular e testar todos os pontos do perímetro da circunferência.

3.4.2 Setores Um setor pode ser gerado usando qualquer um dos dois métodos de conversão por varrimento de um

arco, seguido da geração de dois segmentos de reta que unem o centro do arco aos pontos extremos do mesmo. Por exemplo, considere que queremos gerar o setor cujo centro é o ponto (h, k). Primeiro, geramos o arco de θ 1 a θ 2. Depois, geramos um segmento de reta de reta de (h, k) até (r cos(θ 1) + h, r sen(θ 1) + k). Um segundo segmento de reta terá de ser gerado de (h, k) até (r cos(θ 2) + h, r sen(θ 2) + k).

3.4.3 Exercícios Resolvidos 1) Quais são os passos exigidos para gerar por varrimento um arco de circunferência usando o método polinomial? Solução:

1. Inicializar as variáveis r = raio; (h, k) = coordenadas do centro do arco; x = coordenada x do inicio do arco; x1 = x coordenada x do fim do arco; i = valor do incremento.

2. Testar se o arco foi totalmente gerado. Se x > x1, pára. 3. Calcular o valor da coordenada y:

22 xry −=

4. Desenhar um ponto nas coordenadas correntes (x, y): Desenha(x + h, y + k) 5. Incrementar x: x = x + i. 6. Continuar no passo 2.

2) Quais são os passos exigidos para gerar por varrimento um arco usando o método trigonométrico? Solução:

1. Inicializar as variáveis a = eixo maior; b = eixo menor; (h, k) = coordenadas do centro do arco; i = valor do incremento; θ = ângulo inicial; θ 1 = ângulo final.

2. Testar se o arco foi totalmente gerado. Se θ > θ 1, pára. 3. Calcular os valores das coordenadas x e y:

x = a * cos(θ) + h y = a * sen(θ) + k

4. Desenhar um ponto nas coordenadas correntes (x, y): Desenha(x, y). 5. Incrementar θ: θ = θ + i. 6. Continuar no passo 2.

(Nota: Para o arco circular, a = b = raio da circunferência).

3.5 Traçado de Retângulos Um retângulo cujos lados são paralelos aos eixos coordenados pode ser construído se forem conhecidas

as localizações de dois vértices. Os vértices restantes são derivados. Uma vez conhecidos os vértices, são enviados para a rotina de conversão por varrimento do segmento de reta, quatro conjuntos de coordenadas e o retângulo é gerado. No caso do retângulo, da figura abaixo, serão gerados os seguintes segmentos de reta:

Page 42: cg1

39

segmento de reta (x1, y1) até (x1, y2); segmento de reta de (x1, y2) até (x2, y2); segmento de reta de (x2, y2) até (x2, y1); segmento de reta de (x2, y1) até (x1, y1);

(x1, y1)

(x2, y2)

x1 x2

y1

y2

y

x

3.5.1 Exercícios Resolvidos 1) Quais são os passos exigidos para gerar por varrimento um retângulo cujos lados são paralelos aos eixos coordenados? Solução:

1. Inicializar as variáveis (x1, y1) = coordenadas do primeiro ponto especificado; (x2, y2) = coordenadas do segundo ponto especificado;

2. Desenhar o retângulo: Desenha de (x1, y1) até (x2, y1) Desenha de (x2, y2) até (x1, y2) Desenha de (x2, y1) até (x2, y2) Desenha de (x1, y2) até (x2, y1)

Page 43: cg1

40

4. Transformações Geométricas Transformações geométricas são a base de inúmeras aplicações gráficas, permitindo a alteração de

características de desenhos, tais como escala e orientação. As figuras são formadas por primitivas gráficas, as quais têm como parâmetros coordenadas

cartesianas de pontos no espaço. As transformações agem sobre estas coordenadas, de modo que, ao desenhar novamente estas primitivas com as novas coordenadas transformadas, o desenho também fica transformado.

A seguir serão apresentados os tipos fundamentais de transformações geométricas.

4.1 Transformações Geométricas 2D

4.1.1 Escala A transformação de escala é obtida pela multiplicação de todas as coordenadas que definem o desenho

por fatores de escala não nulos. Estes fatores, no caso bidimensional, são o fator de escala horizontal que multiplica as coordenadas referentes ao eixo x do sistema cartesiano e o fator de escala vertical que multiplica as coordenadas referentes ao eixo y.

Chamando-se os fatores de escala horizontal e vertical de Sx e Sy, respectivamente, as coordenadas (x', y') obtidas pela transformação de escala das coordenadas (x, y), valem:

x' = Sx.x y' = Sy.y

ou na forma matricial

=

y

x

S

S

y'

x'

y

x.

0

0 ou P' = S.P

0 1 4

1

3

0 2 8

2

6

xx

yy

original após escala

4.1.2 Translação A transformação de translação corresponde à movimentação de uma figura para uma outra posição no

sistema de coordenadas, de modo que todos os pontos da imagem sejam deslocados de uma mesma distância em relação a sua posição anterior.

A transformação de translação é obtida adicionando-se constantes de translação a todas as coordenadas que definem o desenho. No caso bidimensional, existem duas constantes: uma referente ao deslocamento paralelo ao eixo x e outra referente ao deslocamento paralelo ao eixo y. Chamando-se estas constantes, respectivamente, de Tx e Ty, as coordenadas (x', y') obtidas pela translação do ponto de coordenadas (x, y) valem:

x' = Tx + x y' = Ty.+ y

ou na forma matricial

Page 44: cg1

41

+

=

y

x

T

T

y'

x'

y

x ou P' = T + P

0 1 4

1

3

0 4 7

3

5

xx

yy

original após translação

4.1.3 Rotação A transformação de rotação em torno da origem corresponde à movimentação de uma figura para uma

outra posição no sistema de coordenadas, de modo que todos os pontos da imagem mantenham a mesma distância da origem que possuíam antes da transformação. Para a obtenção de uma rotação em torno de um ponto qualquer que não a origem, deve-se fazer uma combinação de transformações de translação e de rotação em torno da origem.

O único parâmetro da transformação de rotação é o ângulo, que indica o valor do deslocamento angular no sentido anti-horário. Um exemplo de rotação é mostrado abaixo.

As coordenadas (x', y') obtidas pela rotação do ponto de coordenadas (x, y) de um ângulo α em torno da origem são:

x' = xcosθ − ysenθ y' = xsenθ + ycosθ

ou na forma matricial

−=

y

x

cossen

sencos

y'

x'.

θθθθ

ou P' = R.P

0 1 4

2

4

0 2

3

6

xx

yy

original após rotação

4.1.4 Espelhamento ou Reflexão Uma reflexão em torno do eixo y é dada pela expressão

x' = −x y' = y

ou na forma matricial

−=

y

x

y'

x'.

10

01 ou P' = Ey.P

Uma reflexão em torno do eixo x é dada pela expressão

x' = x y' = −y

Page 45: cg1

42

ou na forma matricial

−=

y

x

y'

x'.

10

01 ou P' = Ex.P

x

y

PP'x

P'y

4.1.5 Cisalhamento ( Shearing ) Um cisalhamento com relação à coordenada x é dada pela expressão:

x' = x + ay y' = y

ou na forma matricial

=

y

xa

y'

x'.

10

1 ou P' = Cx.P

Um cisalhamento com relação à coordenada y é dada pela expressão:

x' = x y' = bx + y

ou na forma matricial

=

y

x

by'

x'.

1

01 ou P' = Cy.P

0 0 xx

yy

x' = x+ ayay

y' = bx+ y

bx

P

P'

P P'

4.2 Coordenadas Homogêneas e Matrizes de Transforma ção

4.2.1 Coordenadas Homogêneas A representação de uma reta em 2D é:

y = mx + b Esta é uma equação dita não-homogênea pois envolve variáveis e constantes (variável com grau

menor). Pode no entanto ser normalizada, ao multiplicar-se a equação acima por w:

wy = w(mx) + w(b)

Page 46: cg1

43

e assim ter-se-á:

y' = mx' + wb

fazendo-se:

x = x' / w e y = y' / w. Assim, com a utilização de coordenadas normalizadas passa-se a trabalhar em um espaço (n + 1)

dimensional ao invés do espaço original n-dimensional. Deve-se notar que ao resolver-se a equação, obtém-se uma família de resultados, desde o valor trivial

(w = 0) até múltiplos, com w ≠ 0. Em geral toma-se o valor w = 1 para as operações em coordenadas homogêneas.

Para a escala, translação, rotação, espelhamento e cisalhamento, as matrizes de transformação são

respectivamente: P' = S.P P' = T + P P' = R.P P' = E.P P' = C.P

Infelizmente, a translação é tratada diferente (como uma soma) das demais, que são tratadas através de

multiplicações. Para que possamos combinar facilmente essas transformações, devemos poder tratar do mesmo modo todas as três transformações de uma forma consistente.

Se os pontos são expressos em coordenadas homogêneas, todas as cinco transformações podem ser tratadas como multiplicações. Em coordenadas homogêneas, adicionamos um terceira coordenada ao ponto. Logo, ao invés de um ponto ser representado por um par de valores (x, y), ele é representado por um tripla (x, y, W). Pelo menos uma das coordenadas homogêneas necessita ser diferente de zero, assim (0, 0, 0) não é permitido.

Se W é a coordenada não zero, podemos dividir (x, y, W) por ela, obtendo o mesmo ponto (x/W, y/W, 1). Os números x/W e y/W são chamados de coordenadas cartesianas do ponto homogêneo. Usualmente, triplas representam pontos em um espaço 3D, mas agora estão sendo usadas para representar pontos em 2D. Se homogeneizamos o ponto, ou seja, dividimos por W, obtemos um ponto da forma (x, y, 1). Logo, os pontos homogeneizados formam o plano definido pela equação W = 1no espaço (x, y, W). A figura a seguir mostra esse relacionamento.

X

W

Y

Plano W = 1

O espaço de coordenadas homogêneas XYW, com o plano W = 1 e o ponto P(X, Y. W) projetado sobre

o plano W = 1.

Como agora os pontos são vetores de 3 elementos, as matrizes de transformações que multiplicam um ponto também precisam ser de 3 × 3.

4.2.2 Translação A equação de translação em coordenadas homogêneas fica:

Page 47: cg1

44

=

1

.

100

10

01

1

y

x

T

T

y'

x'

y

x

Assim, a equação pode ser representada como

P' = T.P

O que acontece se um ponto P é transladado por T1 para P' e então é transladado por T2 para P"? Intuitivamente esperamos que essas translações sejam equivalentes a T(Tx1 + Tx2, Ty1 + Ty2). Ou seja, se:

P' = T1.P P' = T2.P'

Substituindo a primeira equação na segunda, temos:

P" = T2.T1.P e a matriz produto das matrizes T1 e T2 é:

++

=

100

10

01

100

10

01

.

100

10

01

21

21

1

1

2

2

yy

xx

y

x

y

x

TT

TT

T

T

T

T

Portanto, a translação é aditiva. Essa transformação expressa pelas duas transformações é chamada de transformação de composição.

Podemos mostrar similarmente que é também possível realizar composições com a escala e a rotação.

4.2.3 Escala As equações de escala são representadas matricialmente:

=

1

.

100

00

00

1

y

x

S

S

y'

x'

y

x

Assim, a equação pode ser representada como

P' = S.P

O que acontece se um ponto P é escalado por S1 para P' e então é escalado por S2 para P"? Intuitivamente esperamos que essas escalas sejam equivalentes a S(Sx1.Sx2, Sy1.Sy2). Ou seja, se:

P' = S1.P P" = S2.P'

e substituindo

P" = S2.S1.P e a matriz produto das matrizes S1 e S2 é:

Page 48: cg1

45

=

100

0.0

00.

100

00

00

.

100

00

00

21

21

1

1

2

2

yy

xx

y

x

y

x

SS

SS

S

S

S

S

Portanto, a escala é multiplicativa.

4.2.4 Rotação Finalmente, vamos verificar as equações de rotação:

−=

1

.

100

0

0

1

y

x

cossen

sencos

y'

x'

θθθθ

Assim, a equação pode ser representada como:

P' = R.P Como exercício, mostre que duas rotações são aditivas.

4.2.5 Espelhamento A transformação de reflexão ou espelhamento, aplicada a um objeto, produz um objeto que é o espelho

do original. No caso de uma reflexão 2D, o espelho é gerado relativamente a um eixo de reflexão rotacionando o objeto de 180º em torno do eixo de reflexão. Por exemplo, pode-se aplicar uma reflexão em torno da linha y = 0 (eixo x) usando a seguinte matriz de transformação:

−100

010

001

Esta transformação mantém as coordenadas do objeto inalteradas, porém inverte os valores das

coordenadas y, alterando a orientação espacial do objeto.

a b

c

a' b'

c'

x

y

Analogamente, poderíamos definir uma reflexão em torno do eixo y que inverteria as coordenadas x do objeto.

Podemos também definir uma reflexão em torno de um eixo perpendicular ao plano xy e passando, por exemplo, pela origem do sistema de coordenadas, invertendo nesse caso ambas as coordenadas x e y. A matriz de transformação é dada por:

Page 49: cg1

46

−−

100

010

001

A operação é ilustrada na figura a seguir. Observe que a matriz de reflexão acima é idêntica à matriz

de rotação R(θ) com θ = 180º, ou seja, o objeto está apenas sendo rotacionado de 180º em torno da origem.

ab

c

a'

b'

c'

x

y

A operação pode ser generalizada para adotar qualquer ponto localizado no plano xy e o efeito é o mesmo que aplicar uma rotação de 180º em torno do ponto pivô da reflexão.

4.2.6 Cisalhamento (Shearing) Shearing ou cisalhamento é uma transformação que distorce o formato de um objeto. Uma distorção

na direção x é produzida com a seguinte matriz de transformação:

100

010

01 a

As coordenadas do objeto são transformadas da seguinte forma:

x' = x + ay y' = y

Similarmente, a matriz

100

01

001

b

distorce o objeto ao longo do eixo y.

x

y

x

y

x

y

direção x direção y

Qualquer número real pode ser usado como parâmetro. O resultado é que as coordenadas (x, y) são

deslocadas horizontalmente segundo um valor proporcional a sua distância em torno do eixo x. Por exemplo, se Cx é igual a 2, um quadrado será transformado em um paralelogramo. Valores negativos deslocam as

Page 50: cg1

47

coordenadas para a esquerda. Pode-se gerar distorções na direção relativamente a outros eixos de referência y = yref com a matriz:

100

010

1 refaya

produzindo as seguintes transformações sobre as coordenadas:

x' = x + a(y − yref) y' = y

Esta transformação desloca as coordenadas de uma posição verticalmente segundo um fator

proporcional a sua distância da linha de referência x = xref.

4.3 Composi ção de Transformações Usaremos composição como uma combinação de matrizes de transformação, e T, S e R. O propósito

de se compor transformações é o ganho de eficiência que se obtém ao aplicarmos uma transformação composta a um ponto em vez de aplicarmos uma série de transformações, uma após a outra.

Considere a rotação de um objeto em torno de um ponto arbitrário P1. Sabemos apenas rotacionar um ponto em torno da origem. Assim, podemos dividir este problema de rotação em 3 problemas simples, ou seja:

1. efetuar translação, levando P1 à origem; 2. efetuar a rotação desejada; 3. efetuar translação oposta à realizada em (1), levando P1 à posição anterior.

Esta seqüência é ilustrada a seguir, onde o objeto é rotacionado a P1(x1, y1). A primeira translação é

por (−x1, −y1) e a última translação (oposta à primeira) é por (x1, y1).

x

y

x

y

x

y

P1

P1 P1 x

y

P1θ

A transformação em seqüência é: T(x1, y1).R(θ).T(−x1, −y1) =

100

10

01

1

1

y

x

.

100

0

0

θθθθ

cossen

sencos

.

−−

100

10

01

1

1

y

x

=

−−−+−−−

100

)1(

)1(

11

11

θθθθθθθθ

senxcosycossen

senycosxsencos

Esse procedimento pode ser usado de forma similar para se efetuar a escala de um objeto em relação a

um ponto arbitrário P1. Primeiramente, o ponto P1 é transladado para a origem, então é feita a escala desejada e, então, o ponto P1 é transladado de volta. Dessa forma, a transformação em seqüência é:

T(x1, y1).Sxy.T(−x1, −y1) =

100

10

01

1

1

y

x

.

100

00

00

y

x

S

S

.

−−

100

10

01

1

1

y

x

=

−−

100

)1(0

)1(0

1

1

yy

xx

SyS

SxS

Page 51: cg1

48

Vamos supor que se deseja escalar, rotacionar e posicionar o objeto mostrado a seguir, onde o ponto

P1(x1, y1) é o centro da rotação e da escala. A seqüência de transformações ficaria a seguinte:

x

y

x

y

x

y

P1

x

y

x

y

P2

1. efetuar translação, levando P1 à origem; 2. efetuar a escala e a rotação desejadas; 3. efetuar translação da origem à nova posição P2, onde o objeto deve ser posicionado.

Cuidado com a ordem das transformações. A ordem na qual as transformações são realizadas pode afetar o resultado final. Considere, por exemplo, a translação e a rotação de um objeto.

Observe a diferença quando fazemos (a) uma rotação seguida de uma translação e (b) uma translação seguida de uma rotação.

4.4 Transformações Geométricas 3D

4.4.1 Escala

S(Sx, Sy, Sz) =

1000

000

000

000

z

y

x

S

S

S

4.4.2 Translação

T(Tx, Ty, Tz) =

1000

100

010

001

z

y

x

T

T

T

4.4.3 Rotação

Rz(θ) =

1000

0100

00

00

θθθθ

cossen

sencos

Page 52: cg1

49

Isto é facilmente verificado: uma rotação de 90º de [1 0 0 1], o qual é o vetor unitário ao longo do eixo x deve produzir o vetor unitário [0 1 0 1] ao longo do eixo y. Avaliando o produto

1000

0100

0001

0010

.

1

0

0

1

resulta o valor [0 1 0 1]

A matriz de rotação ao longo do eixo x é:

Rx(θ) =

1000

00

00

0001

θθθθ

cossen

sencos

A matriz de rotação ao longo do eixo y é:

Ry(θ) =

−1000

00

0010

00

θθ

θθ

cossen

sencos

4.4.4 Reflexão Em uma reflexão através do plano xy, apenas os valores da coordenadas z dos vetores de posição do

objeto sofrem alteração (inversão de sinal). Portanto,

Exy =

−1000

0100

0010

0001

Uma reflexão através do plano yz é dada por

Eyz =

1000

0100

0010

0001

Uma reflexão através do plano xz é dada por

Exz =

1000

0100

0010

0001

Page 53: cg1

50

4.4.5 Cisalhamento (Shearing)

C =

1000

01

01

01

fe

dc

ba

4.5 Composição de Transformações em 3D A composição de transformações em 3D pode ser entendida mais facilmente através do exemplo

indicado na figura a seguir. O objetivo é transformar os segmentos de reta P1P2 e P1P3 da posição inicial em (a) para a posição final em (b). Assim o ponto P1 deve ser transladado para a origem, P1P2 deverá ficar sobre o eixo z positivo e P1P3 deverá ficar no plano positivo de yz. Além disso, os comprimentos das linhas não devem ser alterados.

x

z

y

P1

P2

P3

x

z

y

P1

P2

P3

Uma primeira maneira de se obter a transformação desejada é através da composição das primitivas de transformação T, Rx, Ry e Rz.

Subdividindo o problema, teremos os seguintes quatro passos: 1. Transladar P1 para a origem; 2. Rotacionar o segmento P1P2 em relação ao eixo y, de forma que (P1P2) fique no plano yz; 3. Rotacionar o segmento P1P2 em relação ao eixo x, de forma que (P1P2) fique no plano z; 4. Rotacionar o segmento P1P3 em relação ao eixo z, de forma que (P1P3) fique no plano yz;

4.6 Transformações Afins As transformações vistas anteriormente (escala, translação, rotação, reflexão e cisalhamento) são casos

particulares das transformações afins, cuja forma cartesiana no plano é dada por: x' = ax + by + e y' = cx + dy + f

ou na forma matricial

+

=

f

e

y

x

dc

ba

y'

x'.

A versão utilizando coordenadas homogêneas é:

=

1

.

1001

y

x

fdc

eba

y'

x'

Page 54: cg1

51

5. Referências Bibliográficas FOLEY, J. D., VAN DAM, A., FEINER, S. K., e HUHES, J. F., Computer Graphics: Principles and

Practices, 2nd edition in C, Addison-Wesley, 1996. GOMES, Jonas, M.,VELHO, Luiz. Computação Gráfica - Volume 1. Rio de Janeiro: IMPA/SBM, 1998. VELHO, Luiz, GOMES, Jonas M., Sistemas Gráficos 3D. Rio de Janeiro: IMPA/SBM, 2001. HEARN, Donald W., BAKER, M. P., Computer Graphics: C Version, 2nd Edition, Prentice Hall, 1997. WATT, Alan, 3D Computer Graphics, 3rd Ed., Addison-Wesley, 2000. WOO, Mason, NEIDER, Jackie, DAVID, Tom, OpenGL Programming Guide Version 1.2, 3rd

Edition, Addison Wesley, 1999. ANTON, H., RORRER, C., "Álgebra Linear com Aplicações", 8ª ed., Porto Alegre, Bookman, 2001. PLASTOCK, Roy A., KALLEY, Gordon, Computação Gráfica, Ed. McGraw-Hill de Portugal, 1991.