Desenho de Segmentos de Recta

Documentos relacionados
Desenho de Segmentos de Recta

Primitivos gráficos - algoritmos

Primitivos gráficos - algoritmos

Conversão por Varrimento

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

Rasterização de primitivas 2D

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

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

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

ALGORITMOS PARA DESENHAR RETAS E CÍRCULOS

Computação Gráfica Rasterização de Curvas

Visualização 2D: - Transformação window to viewport - Clipping

Computação Gráfica. Prof. MSc André Yoshimi Kusumoto

Sumário. Traçado de Retas. Antialiasing e OpenGL. 1 Introdução. 2 Conversão Segmento de Reta. 3 Algoritmo DDA. 4 Algoritmo de Bresenham

Algoritmos de Rasterização e Recorte

Computação Gráfica 04

Algoritmos de Varrimento para Desenho de Primitivas 2D

Pipeline de Visualização 2D

ALGORITMO DE BRESENHAM: O USO MICROCONTROLADORES PARA TRAÇAR RETAS EM LCDs

ANÁLISE MATEMÁTICA III A TESTE 2 31 DE OUTUBRO DE :10-16H. Duração: 50 minutos

Representação de números Conversão de base b para base 10

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

Universidade Portucalense Departamento de Inovação, Ciência e Tecnologia Curso Satélite - Módulo I - Matemática

Aula 4 ESTRUTURAS DE REPETIÇÃO (FOR)

Prof. Dr. Leandro Alves Neves. Conceitos Fundamentais. Algoritmos de Conversão Matricial.

ESCOLA SECUNDÁRIA DE ALBERTO SAMPAIO

Definição: Uma função de uma variável x é uma função polinomial complexa se pudermos escrevê-la na forma n

Divisão e conquista. Eficiência de divisão e conquista

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

3 Cálculo Integral em R n

Integral Triplo. Seja M um subconjunto limitado de 3.

ALGA - Eng. Civil e Eng. Topográ ca - ISE / Geometria Analítica 89. Geometria Analítica

Derivadas. Derivadas. ( e )

Computação Gráfica. Rasterização. Aula 4. Engenharia de Computação. CEFET/RJ campus Petrópolis. Prof. Luis Retondaro

ALGA /09 - Geometria Analítica 78. Geometria Analítica

BANCO DE EXERCÍCIOS - 24 HORAS

Símbolo Nome lê-se como Categoria = 10 significa que se se somar 4 a 6, a soma, ou resultado, é 10.

CCI-22 LISTA DE EXERCÍCIOS

Aritmética em Bases Não Decimais

Desenho de casos de teste

ADA 1º BIMESTRE CICLO I 2018 MATEMÁTICA 2ª SÉRIE DO ENSINO MÉDIO

Programação Mestrado Integrado em Engenharia Aeronáutica 1º ano, 1º semestre. T. 04 Algoritmos e Programação Estruturada

Equações Diferenciais Noções Básicas

Equações Diferenciais Noções Básicas

Curso Satélite de. Matemática. Sessão n.º 1. Universidade Portucalense

Organização de Computadores

Resolução das Questões Discursivas

QUADRADO DA SOMA DE DOIS TERMOS

DCC008 - Cálculo Numérico

Preliminares de Cálculo

Representação de números - Conversão de base b para base 10

Resolução do Exame Tipo

Grupo A Exercícios Básicos. 1. Comente o resultado de cada um dos programas abaixo:

Integral de funções de uma variável

Análise Matemática 2 - Semana 2: 8 de Março, 2010

Rasterização de primitivas 2D e Pipeline 2D. Soraia Raupp Musse

TÉCNICO DE INFORMÁTICA - SISTEMAS

EXERCICIOS RESOLVIDOS - INT-POLIN - MMQ - INT-NUMERICA - EDO

Colectânea de Exercícios, Testes e Exames de Matemática, para Economia e Gestão

Iteração e Pontos Fixos

1 Raízes de equações. 1.1 Equações transcendentes

1 A Equação Fundamental Áreas Primeiras definições Uma questão importante... 7

Unidade I MATEMÁTICA. Prof. Celso Ribeiro Campos

a = bq + r e 0 r < b.

ERRO DE ARREDONDAMENTO E TRUNCAMENTO

Agenda do Dia Aula 14 (19/10/15) Sistemas Lineares: Introdução Classificação

Sabendo que f(x) é um polinômio de grau 2, utilize a formula do trapézio e calcule exatamente

Complexidade de Algoritmos

3 3. Variáveis Aleatórias

GABARITO. 01) a) c) VERDADEIRA P (x) nunca terá grau zero, pelo fato de possuir um termo independente de valor ( 2).

3. Linguagem de Programação C

ANÁLISE MATEMÁTICA III CURSOS: LEAB, LEB, LEMG, LEMAT, LEN, LEQ, LQ. disponível em acannas/amiii

Cálculo Vetorial. Funções de duas variáveis Prof. Vasco Ricardo Aquino da Silva

1ª Lista de Exercícios

3 Equações diferenciais

Capítulo 1 - Erros e Aritmética Computacional

SEBENTA de Sistemas de Numeração

5. Expressões aritméticas

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 2 Equação da recta: Declive: x 1 x 2 y m. x b m y 2 1 y 1 x x2 x1 y y Podemos observar que: Se m<1 então x avança sempre de uma unidade; y repete, ou não, o valor anterior. Se m>1 então y avança sempre de uma unidade; x repete, ou não, 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 evolui 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 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

Para rectas no primeiro octante, o ponto seguinte a P será E ou NE. Algoritmo Midpoint 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 recta 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 Q M 9

Algoritmo Midpoint 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) ) = 0 b(x p + 1) - a(y p + ½) a.e = 0 f(x p + 1, y p + ½) a.e = 0 f(x p + 1, y p + ½) = a.e Sendo a > 0 sign( e ) = sign( a.e ) = sign( f(x p + 1, y p + ½) ) = sign( d p ) Designemos uma variável de decisão d p como: apenas é necessário d = +1 +½) calcular o sinal de d para p f(x p 1, y p p escolher o próximo ponto. 10

Algoritmo 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 Para optimizar esse cálculo, podemos calcular o valor da variável de decisão de uma iteração d i+1 com base no seu valor anterior d i, e no caminho (NE ou E) seguido. Genericamente, d i+1 =f(x i+1 +1 1, y i+1 +½) Sendo que, para d i >= 0 (movimento para NE), x i+1 = x i + 1 e y i+1 = y i + 1 Enquanto que, para d i < 0 (movimento para E), x i+1 = x i + 1 e y i+1 = y i 11

Algoritmo Midpoint O algoritmo pode ser então composto da seguinte forma: // 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 else 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 Plot(x i + 1, y i ) d i+1 = f(x i+1 + 1, y i+1 + ½) = f( (x i + 1) + 1, y i + ½) // Escolhe E como próximo ponto = 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 ; o valor a somar pode ser (d i + b a) ou (d i + b), dependendo de se ter avançado para NE ou para E. 12

O valor d 0 pode ser obtido por: Algoritmo Midpoint d 0 = f(x 0 + 1, y 0 + 1/2) = f(0 + 1, 0 + 1/2) = b.1 a.1/2 = b - a/2 Quando a é um número ímpar d 0 assume 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: Inicialização de d: D 0 = 2.(b - a/2) = 2b a Actualização de D quando movimento é para NE: D i+1 = D i + 2.(b a) Actualização de D quando movimento é para E: D i+1 = D i + 2.b 13

Algoritmo Midpoint MidPoint(int X0, int Y0, int X1, int Y1) { int a, b, d, inc1, inc2, x, y; a = X1 X0; b = Y1 Y0; inc2 = 2*b; d = inc2 a; // d = 2*b a; inc1 = d - a; // inc1 = 2*(b-a); x = X0; y=y0; for(i=0; i<a; i++) Vantagens: { plot(x,y); - Apenas aritmética inteira (+ e *2). x = x+1; - Permite o cálculo incremental dos pontos, i.e. obter (x if (d >= 0) i+1,y i+1 ) a partir de (x i,y i ). { y=y+1; d=d+inc1; } else{d=d+inc2; } } } // Para rectas no primeiro octante e 0<=m<=1 14

Vantagens: Algoritmo Midpoint 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 prático. 13 12 11 10 9 6 7 8 9 10 11 12 13 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. 15

Algoritmo Midpoint para desenho de circunferências y c Algumas propriedades das circunferências: 1. Calcular a circunferência pela sua equação (x-x x 2 +(y-y 2 = 2 c ) y c ) r não é eficiente. 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 16

Algoritmo 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 17

Algoritmo: Algoritmo Midpoint para desenho de circunferências // Calcular d 0 directamente. Para cada i >= 0: if d i 0 then Plot (x i + 1, y i - 1) else d i+1 = f(x i+1 +1 1, y i+1 - ½) = f(x i +1+1 + 1, y i - 1 - ½) = (x i + 2) 2 + (y i -3/2) 2 r 2 = d i + (2x i -2y i + 5) // Escolhe SE como próximo ponto 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 +2) +(y i 2 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. 18

Algoritmo Midpoint para desenho de circunferências O valor d 0 pode ser obtido considerando o primeiro ponto (0,R): d = + - = + 2 + 2 0 f(0 1, R 1/2) 1 (R R ¼) R = 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 19

Algoritmo optimizado: Algoritmo Midpoint para desenho de circunferências MidPointCircle(int R) { int x, y, p, inc_e, inc_se; x=0; y=r; p=1-r; inc_e=3; inc_se=5-2*r; plot(x,y); } while(y > x) { if (p<0) { p=p+inc_e; inc_e=inc_e+2; inc_se=inc_se+2; x++; } else { p=p+inc_se; inc_e=inc_e+2; inc_se=inc_se+4; _ x++; y--; } plot(x,y); } { if (p<0) Observações: - Utiliza aritmética de inteiros - Faz uso de incrementos de segunda ordem 20