import java.awt.*;
import java.awt.image.*;

public class MyPaintContext implements PaintContext {
	
	double mx;double my; //MIttelpunkt d. Verlaufs
	
	public MyPaintContext( double mx, double my )  //Konstruktor
	{
		super();
		this.mx = mx; 
		this.my = my;
	}
	
	
	//PaintContext-Methoden: ----------------------------------------------
	
	//Raster wird in getRaster dyn. erzeugt, also nichts zum Löschen
	public void dispose() {
	}
	
	//wir arbeiten mit dem Standard-RGB-Modell
 	public ColorModel getColorModel() {
 		return ColorModel.getRGBdefault();
 	}
 	
	//das Raster für den radialen Farbverlauf für das Rechteck, dessen linke
	//obere Ecke bei (x,y) liegt und das w Pixel breit und h Pixel hoch ist
 	public Raster getRaster(int x, int y, int w, int h) {
 		
 		//für unser Farbmodell geeignetes Raster erstellen
 		WritableRaster wr = getColorModel().createCompatibleWritableRaster(
                                                w,
                                                h);
		
		//Array für die Rasterdaten: *4, weil ein Pixel 3 Farbwerte und
		//einen Alpha-Wert hat, die jew. in einem int gespeichert werden
		int[] data=new int[(w*h*4)];

		//für jeden einzelnen Punkt wird berechnet:
		double dx; //x-Entfernung zum Mittelpunkt, kann neg. sein
		double dy; //y-Entfernung zum Mittelpunkt, kann neg. sein
		double d; //abs. Entfernung zum Mittelpunkt
		double winkel;  //Winkel, den die Strecke zum Mittelpunkt
				//mit der Strecke zwischen Mittelpunkt
				//und linkem Bildrand bildet
		double anteil; //für Transparenz des jew. Pixels
		
		//Iterieren über alle möglichen Koordinatenpaare (x,y)
		for (int py=0;py<h;py++) { // y
			for (int px=0;px<w;px++) { // x
				
				dx=px-mx; //berechne x-Entfernung
				dy=py-my; //berechne y-Entfernung
		
				//berechne abs. Entfernung
				d=Math.sqrt(dx*dx + dy*dy);

				if(d==0)d=1; //Div by 0 abfangen
				
				// Winkel bestimmen: ---------------------------
				winkel = (Math.abs(Math.asin(dy/d))/(2*Math.PI))*360;
				
				// Winkel an Quadranten anpassen, weil Sinus
				// mehrdeutig
				if (dx>=0 && dy<=0) winkel=180-winkel; //Q1
				else if (dx>=0 && dy>0) winkel=180+winkel; //Q4
				else if (dx<0 && dy>=0) winkel=360-winkel; //Q3
				
				//System.out.println("X: "+px+"/Y:"+py+"Winkel:"+winkel);

				//Anteil des Winkels an 360° berechnen				
				anteil = winkel/360;

				//Farbe ist vorgegeben, nur Transparenz berechnen
				data[4*(py*w+px) + 0]= 244; //R
				data[4*(py*w+px) + 1]= 20;  //G
				data[4*(py*w+px) + 2]= 210; //B
				data[4*(py*w+px) + 3]= (int)(anteil*255);
				//Transparenz je nach Winkel
			}
		}
		
		//Rasterdaten setzen mit Arraydaten
		wr.setPixels(0,0,w,h,data);
		
		//Raster zurück geben
		return wr;	


}	
	

}
