Desenho de Segmentos de Recta



Documentos relacionados
Desenho de Segmentos de Recta

Problema. Conversão Matricial. Octantes do Sistema de Coordenadas Euclidiano. Sistema de Coordenadas do Dispositivo. Maria Cristina F.

Prof. Julio Arakaki. Ciência da Computação

Primitivas Gráficas. Prof. Márcio Bueno Fonte: Material do Prof. Robson Pequeno de Sousa e do Prof.

Primitivos gráficos - algoritmos

Computação Gráfica 04

Primitivos gráficos - algoritmos

Conversão Matricial. Prof. Fernando V. Paulovich 20 de maio de SCC Computação Gráca

Preenchimento de Áreas e de Polígonos. Antonio L. Bajuelos Departamento de Matemática Universidade de Aveiro

Introdução ao estudo de equações diferenciais

É usual representar uma função f de uma variável real a valores reais e com domínio A, simplesmente por y=f(x), x A

2º Exame Computação Gráfica

Exemplos de utilização de primitivas gráficas (nível API)

Sistemas de Apoio à Decisão

Problemas de Valor Inicial para Equações Diferenciais Ordinárias

Interpolação. Interpolação

Truques e Dicas. = 7 30 Para multiplicar fracções basta multiplicar os numeradores e os denominadores: 2 30 = 12 5

TOPOLOGIA DA IMAGEM DIGITAL

Notas de Cálculo Numérico

7. Estrutura de Decisão

Análise Complexa e Equações Diferenciais 1 ō Semestre 2015/2016

Unidade 3 Função Logarítmica. Definição de logaritmos de um número Propriedades operatórias Mudança de base Logaritmos decimais Função Logarítmica

Computação Gráfica. Rasterização de Linhas Professora Sheila Cáceres

P r o g r a m a ç ã o d e C o m p u t a d o r e s 1 o S e m P r o f. A n d r é A m a r a n t e L u i z L A B 5 tag %2d while printf PE1:

Algoritmos e Programação II. Sobrecarga

INTRODUÇÃO À LINGUAGEM C++

INSTITUTO TECNOLÓGICO

LINGUAGEM C. Estrutura básica de um programa

Canguru sem fronteiras 2007

Gráficos de funções em calculadoras e com lápis e papel (*)

ITA º DIA MATEMÁTICA BERNOULLI COLÉGIO E PRÉ-VESTIBULAR

Imagem Vetorial x Imagem Matricial. Conversão Matricial de Primitivas Gráficas. Sistema de Coordenadas do Dispositivo. Problema

LÓGICA DE PROGRAMAÇÃO. Vitor Valerio de Souza Campos

(Testes intermédios e exames 2005/2006)

QUESTÕES COMENTADAS E RESOLVIDAS

XXVI Olimpíada de Matemática da Unicamp. Instituto de Matemática, Estatística e Computação Científica Universidade Estadual de Campinas

Aritmética de Ponto Flutuante e Noções de Erro. Ana Paula

Imagem e Gráficos. vetorial ou raster?

Programação Funcional. Aula 5. Funções Recursivas. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2011.

AV1 - MA (b) Se o comprador preferir efetuar o pagamento à vista, qual deverá ser o valor desse pagamento único? 1 1, , , 980

Introdução à Programação. Armazenamento de Grande Quantidade de Informação Usando Vetores

Coordenadas Polares Mauri C. Nascimento Dep. De Matemática FC Unesp/Bauru

Rasterização de primitivas 2D

Algoritmos e Programação

Análise de Regressão Linear Simples e Múltipla

TEXTO DE REVISÃO: Uso da calculadora científica e potências de 10.

Sistema de ponto flutuante

PLANIFICAÇÃO ANUAL MATEMÁTICA 3 DOMÍNIOS OBJETIVOS ATIVIDADES

Departamento de Informática

MD Sequências e Indução Matemática 1

Não é permitido o uso de corrector. Em caso de engano, deve riscar, de forma inequívoca, aquilo que pretende que não seja classificado.

ALGORITMOS E FLUXOGRAMAS

INF 1010 Estruturas de Dados Avançadas

Faculdade de Economia Universidade Nova de Lisboa TÓPICOS DE CORRECÇÃO DO EXAME DE CÁLCULO I. Ano Lectivo o Semestre

Processos. Estados principais de um Processo: Contexto de um Processo. Nível de um Processo.

Eduardo Camponogara. DAS-5103: Cálculo Numérico para Controle e Automação. Departamento de Automação e Sistemas Universidade Federal de Santa Catarina

COMPUTAÇÃO GRÁFICA. Rasterização e Preenchimento de Regiões. MARCO ANTONIO GARCIA DE CARVALHO Fevereiro de Computação Gráfica

Toleranciamento Geométrico João Manuel R. S. Tavares

Nível da Arquitetura do Conjunto das Instruções

PID control. (proportional, integral, derivative)

Programação: Estruturas de seleção

Estrutura Condicional C++

Agrupamento de Escolas Eugénio de Castro 1º Ciclo. Critérios de Avaliação. Ano Letivo 2015/16 Disciplina MATEMÁTICA 3.º Ano

Revisão para a Bimestral 8º ano

matemática álgebra 2 potenciação, radiciação, produtos notáveis, fatoração, equações de 1 o e 2 o graus Exercícios de potenciação

Linguagem e Técnicas de Programação I Tipos de dados, variáveis e constantes. Prof. MSc. Hugo Souza Material desenvolvido por: Profa.

ÓTICA COM ÍNDICE DE REFRAÇÃO NEGATIVO

Introdução ao MATLAB

Cálculo Numérico Faculdade de Engenharia, Arquiteturas e Urbanismo FEAU

PROVA DE MATEMÁTICA DA UFBA VESTIBULAR a Fase. RESOLUÇÃO: Profa. Maria Antônia Gouveia.

Conversão por Varrimento

Análise de Arredondamento em Ponto Flutuante

CAPÍTULO 2. Grafos e Redes

Regras Métodos Identificadores Variáveis Constantes Tipos de dados Comandos de atribuição Operadores aritméticos, relacionais e lógicos

Algoritmo Iterativo. Dilema do Martelo x Edifício. O Martelo. O Edifício 01/06/2014. Dilema das ações x declarações

Lógica para Computação

Curvas de nível homotópicas a um ponto

CAPÍTULO 1- OPERAÇÕES COM NÚMEROS INTEIROS Indicadores de aprendizagem Verifica se sabes: Identificar o conjunto dos números inteiros.

Ferramentas da Qualidade. Professor: Leandro Zvirtes UDESC/CCT

Figura 2.1: Carro-mola

Universidade Federal do Rio Grande do Norte. Centro De Ciências Exatas e da Terra. Departamento de Física Teórica e Experimental

Teste Intermédio de Matemática A Matemática A Versão 2 10.º Ano de Escolaridade

Uma lei que associa mais de um valor y a um valor x é uma relação, mas não uma função. O contrário é verdadeiro (isto é, toda função é uma relação).

Métodos Numéricos Exame 11/07/11

Um jogo de preencher casas

INSTITUTO POLITÉCNICO DE VISEU ESCOLA SUPERIOR DE TECNOLOGIA DE VISEU DEPARTAMENTO DE MATEMÁTICA

I CAPÍTULO 19 RETA PASSANDO POR UM PONTO DADO

MATEMÁTICA. y Q. (a,b)

CAPÍTULO 6 TRANSFORMAÇÃO LINEAR

Estrutura de Dados Básica

Divisão e Conquista. Túlio Toffolo Marco Antônio Carvalho marco.opt@gmail.com. BCC402 Aula 08 Algoritmos e Programação Avançada

Aula 2 Sistemas de Numeração (Revisão)

Lista de Exercícios 03

9 Comandos condicionais

4. Tangentes e normais; orientabilidade

MATEMÁTICA A - 12o Ano N o s Complexos - Equações e problemas

Prof. Rossini Bezerra Faculdade Boa Viagem

Programação científica C++

Fundamentos Tecnológicos

Estrutura Condicional em Java

Transcrição:

Desenho de Segmentos de Recta Sistemas Gráficos/ Computação Gráfica e Interfaces 1

Alg. para desenho de Segmentos de Recta - Motivação A maior parte das primitivas 2D, desenhadas centenas ou mesmo milhares de vezes por frame são obtidas pelo desenho de segmentos de recta. Mesmo o desenho 3D em wiredframe é obtido por segmentos de recta 2D. A optimização destes algoritmos resulta num aumento de eficiência da aplicação. 2

Alg. para desenho de Segmentos de Recta - Requisitos O algoritmo tem de obter coordenadas inteiras, porque só pode endereçar coordenadas (x,y) inteiras no raster display. Quando é criada uma imagem, os algoritmos que trabalham ao nível do pixel são chamados centenas ou milhares de vezes -> têm de ser eficientes. Os algoritmos devem criar linhas com aspecto visual satisfatório: Devem parecer rectas Terminar com precisão Brilho constante 3

Alg. para desenho de Segmentos de Recta y 1 y 2 Equação da recta: y = m. x + b Declive: m = y = x y x 2 2 y x 1 1 x 1 x 2 Podemos observar que: Se m<1 então x avança sempre de uma unidade; y pode repetir o valor anterior. Se m>1 então y avança sempre de uma unidade; x pode repetir o valor anterior. A equação pode ser simplificada para: y i+1 =m.x i+1 + b = m(x i + x) + b = y i + m. x Fazendo x = 1, y i+1 = y i + m Algoritmo Básico para desenhar o segmento de recta (m<1) 1. Incrementar x de 1 em cada passo, partindo do ponto mais à esquerda. 2. y i+1 =y i +m 3. O ponto da recta será: (x i+1, round(y i+1 ) ) O pixel mais próximo da recta real, i.e. cuja distância é a menor. 4

DDA Digital Differential Analyser void DDA(int X0, int Y0, int X1, int Y1) { //considerando -1 <=m <=1 e X0<X1 int x; float dy, dx, y, m; } dy = Y1 Y0; dx = X1 X0; m = dy/dx; y = Y0; for (x=x0; x<=x1;x++) { WritePixel(x, (int)(y + 0.5)); y += m; } Problemas do algoritmo: 1. Operações em vírgula flutuante -> menor eficiência do que com inteiros 2. O valor de y evoluí pelo incremento sucessivo de m. Variáveis reais têm precisão limitada -> soma acumulada de um valor inexacto pode originar um desvio do valor real pretendido round(y i ). 5

DDA Digital Differential Analyser Exercício: Quais os pontos que vão pertencer ao segmento de recta entre (6,9) e (11,12)? m =? 13 12 11 10 9 6 7 8 9 10 11 12 13 6

DDA Digital Differential Analyser Os pontos calculados são: (6,9), (7,9.6), (8,10.2), (9,10.8), (10,11.4), (11,12) 13 12 11 10 9 6 7 8 9 10 11 12 13 7

Algoritmo de Midpoint Supor que se pretende desenhar um segmento de recta entre os pontos (0,0) e (a,b) 0 <= m <= 1 A equação da recta fica em y = m.x sendo m = b/a b a y = (b/a)x + 0 f(x,y) = bx - ay = 0 é também uma equação da recta. 8

Algoritmo de Midpoint Para rectas no primeiro octante, o ponto seguinte a P será E ou NE. Escolher o ponto mais próximo da recta real: f(x,y) = bx - ay = 0 =(x p +1,y p +1) Estratégia do algoritmo MidPoint: 1. Verificar de que lado fica M 2. Se M acima da recta escolhe E 3. Se M abaixo da linha escolhe NE (x p +1,y p +½+e)= =(x p +1,y p +½) =(x p +1,y p ) O erro será sempre inferior a ½. e=q-m 9

Algoritmo de Midpoint/Bresenham O ponto médio entre E e NE é(x p + 1, y p + ½). Façamos e a distância entre o ponto onde a recta intersecta entre E e NE e o ponto médio. Se e for positivo -> escolhe-se NE Se e for negativo -> escolhe-se E e P NE M E Conclui-se que para escolher o ponto correcto apenas é necessário saber o sinal de e. f(x p + 1, y p + ½ + e) = 0 (ponto pertence à recta) = b(x p + 1) - a(y p + ½ + e) = b(x p + 1) - a(y p + ½) ae = f(x p + 1, y p + ½) - ae d p = f(x p + 1, y p + ½) = ae; d p é designado de variável de decisão. No entanto, sendo a > 0 d p tem o mesmo sinal de e apenas é necessário calcular o sinal de d p para escolher o próximo ponto. 10

Algoritmo de Midpoint Calcular d p = f(x p + 1, y p + ½) em cada etapa requer pelo menos duas adições, uma subtracção e duas multiplicações ineficiente Algoritmo: // Calcular d 0 directamente. Para cada i >= 0: if d i 0 then Plot (x i + 1, y i + 1) // Escolhe NE como próximo ponto d i+1 = f(x i+1 + 1, y i+1 + ½) = f(x i + 1 + 1, y i + 1 + ½) = b(x i + 1 + 1) - a(y i + 1 + ½) = f(x i + 1, y i + ½) + b - a = d i + b - a else Plot(x i + 1, y i ) // Escolhe E como próximo ponto d i+1 = f(x i+1 + 1, y i+1 + ½) = f(x i + 1 + 1, y i + ½) = b(x i + 1 + 1) - a(y i + ½) = f(x i + 1, y i + ½) + b = d i + b Conclusão: Sabendo d i, apenas temos de somar um valor constante para saber d i+1 11

Algoritmo de Midpoint O valor d 0 pode ser obtido por: d 0 = f(0 + 1, 0 + 1/2) = b(1) - a(1/2) = b - a/2 Sendo a um número ímpar d 0 assumiria valores não inteiros. Uma vez que só nos interessa conhecer o sinal de d i em cada etapa, podemos multiplicar toda a equação por 2 que não alteramos em nada o funcionamento do algoritmo. MidPoint(int X0, int Y0, int X1, int X2) { int a, b, d, inc1, inc2, x, y; a = X1 X0; b = Y1 Y0; inc1 = 2*(b-a); inc2 = 2*b; d = 2*b a; x = X0; y=y0; for(i=0; i<a; i++) { plot(x,y); x = x+1; if (d >= 0) { y=y+1; d=d+inc1; } else{d=d+inc2; } } } // Para rectas no primeiro octante e 0<=m<=1 Vantagens: -Apenas aritmética inteira. -Permite o cálculo incremental dos pontos, i.e. obter (x i+1,y i+1 ) a partir de (x i,y i ). 12

Algoritmo de Midpoint Vantagens: Apenas aritmética inteira. Permite o cálculo incremental dos pontos, i.e. obter (x i+1,y i+1 ) a partir de (x i,y i ). Exercícios: 1. Generalize o algoritmo para funcionar com qualquer declive m. 2. Implemente o código no programa do trabalho 1. 13 12 11 10 9 3. Utilize o algoritmo de Midpoint para obter a tabela de pontos e o valor de d i em cada etapa para o caso da figura. 6 7 8 9 10 11 12 13 13

Algoritmo de Midpoint para desenho de circunferências Algumas propriedades das circunferências: 1. Calcular a circunferência pela sua equação (x-x c ) 2 +(y-y c ) 2 = r 2 não é eficiente. y c r x c 2. A simetria da circunferência pode ser explorada: Obtendo (x,y) obtém-se também: (-x,y) (-x,-y) (x, -y) (y,x) (-y,x) (-y,-x) (y, -x) Calcula-se apenas o segundo octante x=0 até x=y=r/sqrt(2) 3. Se centro em (0,0) f(x,y)=x 2 +y 2 -r 2 f(x,y) < 0 então (x,y) está dentro da circunferência = 0 então (x,y) está sobre a circunferência > 0 então (x,y) está fora da circunferência 14

Algoritmo de Midpoint para desenho de circunferências Da mesma forma que foi feito para a recta define-se a variável de decisão d: d p = f(x p + 1, y p -½)= (x p +1) 2 +(y p -½) 2 -r 2 Subtracção 15

Algoritmo de Midpoint para desenho de circunferências Algoritmo: // Calcular d 0 directamente. Para cada i >= 0: if d i 0 then Plot (x i + 1, y i - 1) // Escolhe SE como próximo ponto d i+1 = f(x i+1 + 1, y i+1 - ½) = f(x i + 1 + 1, y i -1-½) = (x i + 2) 2 + (y i -3/2) 2 r 2 = d i + (2x i -2y i + 5) else Plot(x i + 1, y i ) // Escolhe E as next point d i+1 = f(x i+1 + 1, y i+1 -½) = f(x i + 1 + 1, y i -½) = (x i + 2) 2 + (y i -½) 2 r 2 = d i + (2x i + 3) Conclusão: Podemos obter d i+1 a partir de d i, mas é necessário calcular o incremento em cada etapa. 16

Algoritmo de Midpoint para desenho de circunferências O valor d 0 pode ser obtido considerando o primeiro ponto (0,R): d 0 = f(0 + 1, R - 1/2) = 1 + (R 2 R + ¼) R 2 = 5/4 - R MidPointCircle(int R) { int x, y; float d; } x=0; y=r; d = 5.0/4.0 (float)r; plor(x,y); while(y > x) { if (d >= 0) { d=d+(x-y)*2+5; x++; y--; } else { d=d+2.0*x+3; x++; } plot(x,y); } Observações: - Utiliza aritmética em vírgula flutuante. - Minimiza as operações efectuadas em vírgula flutuante 17