Bresenham Círculo > Arco

0 respostas
Ricardo_Alexsander

Pessoal, estou tentanto transformar o algoritmo do nosso amigo Bresenham pra desenhar um arc ao invéz de um círculo, alguém poderia me ajudar?

import java.awt.*;

class MeuCanvas extends Canvas
{
	private Graphics g;
	
	private void putpixel (int x, int y, int r, int ai, int af )
	{
		float xai, yai, xaf, yaf, cosx, siny;
		
		xai = Math.round(Math.cos(Math.toRadians(ai)));
		yai = Math.round(Math.sin(Math.toRadians(ai)));
		xaf = Math.round(Math.cos(Math.toRadians(af)));
		yaf = Math.round(Math.sin(Math.toRadians(af)));
		
		cosx = ((float)(x-100)/r);
		siny = ((float)(y-100)/r);
		
		//System.out.println(xai);
		//System.out.println(yai);
		//System.out.println(xaf);
		//System.out.println(yaf);
		//System.out.println((float)siny);
		
		
		//o comando g.drawLine(x,y,x,y) é o que vai fazer o ponto
		//a idéia é compara o coseno do X e Y com o coseno do angulo inicial (ai)
		//aki é que o problema acontece, tem que desenvolver uma condição pro saber o ângulo
		
		if(siny>=0)
			if(cosx<=xai)
				g.drawLine(x,y,x,y);
		
		if(siny<=0)
			if(cosx<xai)
				g.drawLine(x,y,x,y);
	}
	
	private void plotcircle ( int x, int y, int x1, int y1, int r, int ai, int af ) 
	{ 
		putpixel ( x + x1, y + y1, r, ai, af ) ; 
		putpixel ( x - x1, y + y1, r, ai, af ) ; 
		putpixel ( x + x1, y - y1, r, ai, af ) ; 
		putpixel ( x - x1, y - y1, r, ai, af ) ; 
		putpixel ( x + y1, y + x1, r, ai, af ) ; 
		putpixel ( x - y1, y + x1, r, ai, af ) ; 
		putpixel ( x + y1, y - x1, r, ai, af ) ; 
		putpixel ( x - y1, y - x1, r, ai, af ) ; 
		
		try
		{
			Thread.sleep(10);
		} 
		
		catch(InterruptedException e)
		{
		}
	}
	
	private void desenhaCirculo(int x, int y, int r, int ai, int af)
	{
		int i, x1, y1, p ; 
		double xai, yai, xaf, yaf;
		x1 = 0 ; 
		y1 = r ; 
		
		p = 3 - 2 * r ; 
		
		while ( x1 < y1 ) 
		{ 
			plotcircle ( x, y, x1, y1, r, ai, af ) ; 
			if ( p < 0 ) 
				p = p + 4 * x1 + 6 ; 
			else 
			{ 
				p = p + 4 * ( x1 - y1 ) + 10 ; 
				y1 = y1 - 1 ; 
			} 
			
			x1 = x1 + 1 ; 
		
		} 
		
		if ( x1 == y1 ) 
		
		plotcircle ( x, y, x1, y1, r, ai, af ) ; 
		
		xai = x + (Math.cos(Math.toRadians(ai))*r);
		yai = y + (Math.sin(Math.toRadians(ai))*r);
		xaf = x + (Math.cos(Math.toRadians(af))*r);
		yaf = y + (Math.sin(Math.toRadians(af))*r);
		
		System.out.println(Math.cos(Math.toRadians(ai)));
		System.out.println(xai);
		System.out.println(yai);
		
		//Aki vai gerar as linhas, só pra ter como base o inicial e o final
		g.drawLine(x,y,Math.round(Math.round(xai)),Math.round(Math.round(yai)));
		g.drawLine(x,y,Math.round(Math.round(xaf)),Math.round(Math.round(yaf)));
		
	}
	
	public void paint(Graphics g)
	{
		this.g=g;
		//aki vc muda o X central, Y central, RAIO, GRAU INICIAL, GRAU FINAL
		desenhaCirculo(100,100,75,90,0);
	}
}

public class Circulo extends Frame
{
	public static void main(String a[])
	{
		Frame f= new Circulo();
		f.add(new MeuCanvas());
		f.setSize(300,300);
		f.setVisible(true);
	}
}
Criado 2 de maio de 2005
Respostas 0
Participantes 1