import java.awt.*;
import java.awt.image.*;
import java.io.*;

// Edge detection with VR operators (angle distance)
public class vr3_edge extends edgeFilter
{
	float min_edge;
	int indent;
	
	// Creates object and initializes data
	public vr3_edge(float min, int size)
	{
		min_edge = min;
		masksize = size;
		maskIndex = new int[masksize*masksize];
		array = new double[masksize*masksize];
		indent = (int) Math.floor(masksize/2);
	}
	
	// Runs algorithm
	public void performEffect()
	{
		float max_intensity = 0;
		int pointOffset,counter;
		int newPixels[] = new int[width*height];
		double edge[] = new double[width*height];
		
		// Moves through the input array pixel by pixel
		for (int y=indent;y<height-indent;y++)
		{
			for (int x=indent;x<width-indent;x++)
			{
				// Location of centre of mask
				pointOffset = y*width+x;
				
				// Calculate Index for mask
				counter = 0;
				for (int i=-indent;i<=indent;i++)
				{
					for (int j=-indent;j<=indent;j++)
					{
						maskIndex[counter] = (y+i)*width+(x+j);
						counter++;
					}
				}

				// Sorts pixels in mask by sum of distances
				calc_angle();
				b_sort(masksize*masksize);
				
				// Sets edge value equal to distance between pixel with smallest
				// sum of distances and pixel with greatest
				edge[pointOffset] =
				vect_dist(pixels[maskIndex[0]],pixels[maskIndex[(masksize*masksize)-1]]);
				
				// Find the greatest distance value in the image			
				if (edge[pointOffset] > max_intensity)
					max_intensity = (float)edge[pointOffset];
			}
		}
		
		// Place the edges on an output array
		if (max_intensity > 0.0)
		{
			// Run through image pixel by pixel
			for (int y=0; y<height;y++)
			{
				for (int x=0; x<width; x++)
				{
					// Position of centre pixel
					pointOffset = y*width+x;
					
					edge[pointOffset] = edge[pointOffset]/max_intensity;
					
					// Set to grey if edge
					if (edge[pointOffset] >= min_edge)
					{
						newPixels[pointOffset] = 0xff000000 +
						(0x010101*(255-(int)(edge[pointOffset]*255)));
					}
					// Set to white
					else
					{
						newPixels[pointOffset] = 0x01010101*255;
					}
				}
			}
		}
		this.pixels = newPixels;
	}
}
