package fr.unistra.pelican.algorithms.draw;
import java.awt.Color;
import java.awt.Point;
import fr.unistra.pelican.Algorithm;
import fr.unistra.pelican.AlgorithmException;
import fr.unistra.pelican.Image;
/**
* This class draws a circle on a 2D-picture using Bresenham algorithm. Colored or not
*
*/
public class DrawCircleBresenham extends Algorithm {
/**
* Image to be processed
*/
public Image inputImage;
/**
* Center of the circle
*/
public Point center;
/**
* Size of the circle
*/
public Integer size;
/**
* Color of the circle
*/
public Color color=Color.WHITE;
/**
* Resulting picture
*/
public Image outputImage;
/**
* Constructor
*/
public DrawCircleBresenham(){
super();
super.inputs="inputImage,center,size";
super.options="color";
super.outputs="outputImage";
}
public void launch() throws AlgorithmException {
outputImage=inputImage.copyImage(true);
for(int t=0; t<inputImage.tdim;t++){
Integer x=0;
Integer y=size;
Integer m = 5-4*size;
while(y>=x){
tracerPixel( x+center.x , y+center.y , t );
tracerPixel( y+center.x , x+center.y , t );
tracerPixel( -x+center.x, y+center.y , t );
tracerPixel( -y+center.x, x+center.y , t );
tracerPixel( x+center.x , -y+center.y, t );
tracerPixel( y+center.x , -x+center.y, t );
tracerPixel( -x+center.x, -y+center.y, t );
tracerPixel( -y+center.x, -x+center.y, t );
if (m>0){y=y-1; m=m-8*y;}
x=x+1;
m=m+8*x+4;
}
}
}
public void tracerPixel(Integer x, Integer y,Integer t){
if(inputImage.getBDim()==3)
{
outputImage.setPixelXYZTBByte(x,y,0,t,0,color.getRed());
outputImage.setPixelXYZTBByte(x,y,0,t,1,color.getGreen());
outputImage.setPixelXYZTBByte(x,y,0,t,2,color.getBlue());
}
else
{
for(int i=0;i<inputImage.getBDim();i++) outputImage.setPixelXYZTBByte(x,y,0,t,i,255);
}
}
/**
* Draws a circle on a 2D-picture using Bresenham algorithm
*
* @param inputImage image to be processed
* @param center center of the circle
* @param size size of the circle
* @return image with the circle drawn
*/
public static Image exec(Image inputImage,Point center,Integer size){
return (Image) new DrawCircleBresenham().process(inputImage,center,size);
}
/**
* Draws a circle on a 2D-picture using Bresenham algorithm
*
* @param inputImage image to be processed
* @param center center of the circle
* @param size size of the circle
* @param cOlor color of the circle
* @return image with the circle drawn
*/
public static Image exec(Image inputImage,Point center,Integer size,Color cOlor){
return (Image) new DrawCircleBresenham().process(inputImage,center,size,cOlor);
}
}