import java.awt.*;
import java.applet.*;
import java.lang.Math;
import java.awt.event.*;

//Author:H.Hakan GENÇ - 2001-2002 - Turkiye
//GSM: +905052610452, E-mail:hasanhakangenc@hotmail.com

public class dogrultucu extends Applet
{

	CerceveliPanel panel;
	KontrolPaneli kontrolPaneli;
	String zeminRenk, onRenk;
	
	public void init(){
		zeminRenk = getParameter("zeminrenk");
		onRenk = getParameter("onrenk");
		
		if ((zeminRenk == null) ||
			(onRenk == null))
		{
			zeminRenk = "f0f0f0";
			onRenk = "000000";
		}
		
		setBackground(stringToColor(zeminRenk));
		setForeground(stringToColor(onRenk));
		
		setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
		
		CizimAlani cizimAlani = new CizimAlani(zeminRenk);
		kontrolPaneli = new KontrolPaneli(cizimAlani);
	
		panel = new CerceveliPanel();
		
		panel.setLayout(new BorderLayout());

		setBackground(Color.white);
		setLayout(new FlowLayout(FlowLayout.LEFT,5,5));
		
		add(cizimAlani);
		add(kontrolPaneli);
	}
	
	private Color stringToColor(String paramDeger)
	{
		int red;
		int green;
		int blue;

		red = (Integer.decode("0x" + paramDeger.substring(0,2))).intValue();
		green = (Integer.decode("0x" + paramDeger.substring(2,4))).intValue();
		blue = (Integer.decode("0x" + paramDeger.substring(4,6))).intValue();

		return new Color(red,green,blue);
	}
	
	public void start(){
		setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
	}
	
	public void stop(){
		remove(panel);
		remove(kontrolPaneli);
	}
	
	public void destroy(){
	}
}

class CerceveliPanel extends Panel{
	public CerceveliPanel(){
		setBackground(Color.lightGray);
	}
	public Insets getInsets(){
		return new Insets(0,0,0,0);
	}
	
	public Dimension getPreferredSize(){
		return new Dimension(200,170);
	}
}

class CizimAlani extends Canvas{
	
	double akim_sinus[] = new double[360];
	double gerilim_sinus[] = new double[360];
	
	int akim_integer_sinus[] = new int[360];
	int gerilim_integer_sinus[] = new int[360];
	
	int ac_genlik = 0, R=1500;
	double  pi,diyot_gerilim, yarim_tam, fark_akimi;
	float id;
	boolean ideal_gercek = true, acik_kapali = false;
	
	Image ekranDisiResim;
	Graphics gBellek;
	String renk;
	
	public CizimAlani(String renk){
		setBackground(Color.decode("#"+renk));
		
		this.renk = renk;
		if(acik_kapali && !ideal_gercek){
			diyot_gerilim = 0.7;
			yarim_tam = 180;
		}
		else if(acik_kapali && ideal_gercek){
			diyot_gerilim = 0;
			yarim_tam = 180;
		}
		else{
			diyot_gerilim = 0;
			yarim_tam = 360;
		}
		if(ac_genlik <=diyot_gerilim) diyot_gerilim = 0;
		
		id = (float)(((ac_genlik-diyot_gerilim)/R)*3000);
		fark_akimi = (diyot_gerilim/R)*3000;
		
		pi = Math.PI;
		
		akim_integer_sinus[0]	= 0;
		gerilim_integer_sinus[0]= 0;

	}
	
	public void cizimAlaniGuncelle(int ac_genlik, boolean ideal_gercek, boolean acik_kapali, int R){
		this.ac_genlik = ac_genlik;
		this.acik_kapali = acik_kapali;
		this.ideal_gercek = ideal_gercek;
		this.R = R;
		
		if(acik_kapali && !ideal_gercek){
			diyot_gerilim = 0.7;
			yarim_tam = 180;
		}
		else if(acik_kapali && ideal_gercek){
			diyot_gerilim = 0;
			yarim_tam = 180;
		}
		else{
			diyot_gerilim = 0;
			yarim_tam = 360;
		}
		
		if(ac_genlik <=diyot_gerilim) diyot_gerilim = 0;
		
		id = (float)(((ac_genlik - diyot_gerilim)/R)*3000);
		fark_akimi = (diyot_gerilim/R)*3000;
		
		
		repaint();
	}
	
	public void paint(Graphics g){
		ekranDisiResim = createImage(this.getSize().width, this.getSize().height);
		gBellek = ekranDisiResim.getGraphics();
		
		String /*akim_dizisi=""*/ akim_stringi;
		
		int yukseklik = this.getSize().height, genislik = this.getSize().width;
		int referans = 16, eksen = 0, b=0;
		
		gBellek.drawString("Süre (t)",200,yukseklik);
		gBellek.drawString("VR (V)",10,yukseklik*2/3 + 20);
		gBellek.drawLine(10,yukseklik*5/6+10,380,yukseklik*5/6+10);
		gBellek.drawLine(10,yukseklik*5/6+9,380,yukseklik*5/6+9);
		gBellek.drawLine(15,yukseklik-5,15,yukseklik*2/3 + 20);
		gBellek.drawLine(16,yukseklik-5,16,yukseklik*2/3 + 20);
		
		gBellek.drawLine(13,yukseklik*2/3 + 24,15,yukseklik*2/3 + 20);// dikey ok çiziliyor
		gBellek.drawLine(18,yukseklik*2/3 + 24,15,yukseklik*2/3 + 20);
		
		gBellek.drawLine(375, yukseklik*5/6+7, 380, yukseklik*5/6+10);// yatay ok çiziliyor
		gBellek.drawLine(375, yukseklik*5/6+12, 380, yukseklik*5/6+10);
					//	ilk eksen çizildi 	
		/*-----------------------------------------------------------------------*/	
					// ikinci eksen çiziliyor.
		
		gBellek.drawString("Akım (mA)",10,yukseklik*1/3 + 20);
		gBellek.drawLine(10,yukseklik/2+10,380,yukseklik/2+10);
		gBellek.drawLine(10,yukseklik/2+9,380,yukseklik/2+9);
		gBellek.drawLine(15,yukseklik*2/3,15,yukseklik*1/3 + 20);
		gBellek.drawLine(16,yukseklik*2/3,16,yukseklik*1/3 + 20);
		
		gBellek.drawLine(13,yukseklik*1/3 + 24,15,yukseklik*1/3 + 20);// dikey ok çiziliyor
		gBellek.drawLine(18,yukseklik*1/3 + 24,15,yukseklik*1/3 + 20);
		
		gBellek.drawLine(375, yukseklik/2+7, 380, yukseklik/2+10);// yatay ok çiziliyor
		gBellek.drawLine(375, yukseklik/2+12, 380, yukseklik/2+10);
		
					// ikinci eksen çizildi
		/*-----------------------------------------------------------------------*/
					// üçüncü eksen çiziliyor
		
		gBellek.drawString("e(t) Volt",10,20);
		gBellek.drawLine(10,yukseklik/6+10,380,yukseklik/6+10);
		gBellek.drawLine(10,yukseklik/6+9,380,yukseklik/6+9);
		gBellek.drawLine(15,yukseklik*1/3,15,20);
		gBellek.drawLine(16,yukseklik*1/3,16,20);
		
		gBellek.drawLine(13,24,15,20);// dikey ok çiziliyor
		gBellek.drawLine(18,24,15,20);
		
		gBellek.drawLine(375, yukseklik/6+7, 380, yukseklik/6+10);// yatay ok çiziliyor
		gBellek.drawLine(375, yukseklik/6+12, 380, yukseklik/6+10);
		
		
		for(int i=1;i<360;i++){
			gerilim_sinus[i]		= Math.sin((pi/180)*i)*(-ac_genlik*3);
			gerilim_integer_sinus[i]= (int)gerilim_sinus[i];
		}
		for(int i=1;i<yarim_tam;i++){
			akim_sinus[i]			= Math.sin((pi/180)*i)*(-((double)id+fark_akimi));
			akim_integer_sinus[i]	= (int)akim_sinus[i];
		}
		if(yarim_tam == 180){
			b = 90;
		}
		/* gerilim kaynağının tepe değeri yazdırılıyor */
		
		gBellek.drawLine(referans-3,yukseklik/6+gerilim_integer_sinus[90]+10,referans+3,
								 yukseklik/6+gerilim_integer_sinus[90]+10);
		gBellek.drawString(Integer.toString(-gerilim_integer_sinus[90]/3),referans-15,yukseklik/6+gerilim_integer_sinus[90]+20);
		
		/* direnç geriliminin tepe değeri yazdırılıyor */
		
		gBellek.drawLine(referans-3,yukseklik*5/6+gerilim_integer_sinus[90]+10+(int)(diyot_gerilim*3),referans+3,
								 yukseklik*5/6+gerilim_integer_sinus[90]+10+(int)(diyot_gerilim*3));
		
		gBellek.drawString(Float.toString((float)(-gerilim_integer_sinus[90]/3-diyot_gerilim)),referans+3,yukseklik*5/6+gerilim_integer_sinus[90]+10);
		
		/* akimin tepe değeri yazdırılıyor */
		
		gBellek.drawLine(referans-3,yukseklik/2+akim_integer_sinus[90]+10+(int)fark_akimi,referans+3,
								 yukseklik/2+akim_integer_sinus[90]+10+(int)fark_akimi);
		
		akim_stringi = Float.toString((id)/3);
	/*	for(int i=0;i<3;i++){
			akim_dizisi += akim_stringi.charAt(i);
		}*/
		gBellek.drawString(akim_stringi,referans+3,yukseklik/2+akim_integer_sinus[90]+10);
		for(int a=0;a<2;a++){
			for(int i=0;i<yarim_tam;i++){
				eksen = (int)(i/2);
				if(i == 179){ diyot_gerilim *= -1;fark_akimi *= -1;}
					gBellek.drawLine(eksen + referans, akim_integer_sinus[i] 
										  + (yukseklik/2+10) + (int)fark_akimi,eksen + referans, akim_integer_sinus[i] + (yukseklik/2+10)+(int)fark_akimi);
					gBellek.drawLine(eksen + referans, gerilim_integer_sinus[i]
						   + (yukseklik*5/6+10) + (int)(diyot_gerilim*3), eksen + referans, gerilim_integer_sinus[i] + (yukseklik*5/6+10) + (int)(diyot_gerilim*3));
			}
			diyot_gerilim *= -1;
			fark_akimi *= -1;
			referans = referans + eksen + b;
		}
		referans = 16;
		for(int a=0;a<2;a++){
			for(int i=0;i<360;i++){
				eksen = (int)(i/2);
				gBellek.drawLine(eksen + referans, gerilim_integer_sinus[i] 
											 + yukseklik/6+10, eksen + referans, gerilim_integer_sinus[i] + yukseklik/6+10);
			}
			referans = referans + eksen;
		}
		gBellek.setColor(Color.decode("#"+renk));
		
		gBellek.fillRect(17,yukseklik*5/6+11,90,45);
		gBellek.fillRect(17,yukseklik/2+11,90,45);
		gBellek.fillRect(105,yukseklik*5/6-36,91,45);
		gBellek.fillRect(105,yukseklik/2-36,91,45);
		
		gBellek.fillRect(195,yukseklik*5/6+11,90,45);
		gBellek.fillRect(195,yukseklik/2+11,90,45);
		gBellek.fillRect(284,yukseklik*5/6-36,91,45);
		gBellek.fillRect(284,yukseklik/2-36,91,45);
		
		//imza
		gBellek.setFont(new Font("Courier",Font.ITALIC,14));
		gBellek.setColor(Color.red);
		gBellek.drawString("H.G.",genislik-50,20);
		
		g.drawImage(ekranDisiResim,0,0,this);
	}
	
	public void update(Graphics g){
		paint(g);
	}
	public Dimension getPreferredSize(){
		return new Dimension(380,450);
	}
}

class KontrolPaneli extends Panel{
	int genlikDegeri, frekansDegeri;
	Slider slider;
	
	public KontrolPaneli(CizimAlani cizimAlani){
		slider = new Slider(cizimAlani);
		setBackground(Color.white);

		add(slider);
	}
	public void paint(Graphics g){
		g.drawRect(1,1,208,176);
		g.drawRect(2,2,206,174);
	}
	public Dimension getPreferredSize(){
		return new Dimension(210,450);
	}
}

class Slider extends CerceveliPanel implements AdjustmentListener, ItemListener, ItemExpandListener{
	int ac_genlik = 0;
	boolean acik_kapali = false, ideal_gercek = true;
	
	Scrollbar ackaynak;
	AnahtarKomponenti anahtar;
	Label ac_baslik, acEtiketi, acik, kapali;
	Panel panel1, panel2, panel3, butun1, butun2, butun3;
	Checkbox ideal, gercek;
	CheckboxGroup grup = new CheckboxGroup();

	private CizimAlani cizimAlani;
	
	public Slider(CizimAlani cizimAlani){
		
		this.cizimAlani = cizimAlani;
		
		ackaynak	= new Scrollbar(Scrollbar.HORIZONTAL,0,1,0,21);
		ideal		= new Checkbox("ideal diyot",true,grup);
		gercek		= new Checkbox("gerçek diyot",false,grup);
		anahtar		= new AnahtarKomponenti();
		
		ideal.setEnabled(false);
		gercek.setEnabled(false);
		
		ac_baslik	= new Label("ac Gerilim (V)  = ");
		acEtiketi	= new Label("0  ");
		acik		= new Label("Açık");
		kapali		= new Label("Kapalı");
		
		ac_baslik.setFont	(new Font("Courier",Font.BOLD,12));
		acEtiketi.setFont	(new Font("Courier",Font.BOLD,12));
		acik.setFont		(new Font("Courier",Font.BOLD,10));
		kapali.setFont		(new Font("Courier",Font.BOLD,10));
		
		panel1 = new Panel();
		panel2 = new Panel();
		panel3 = new Panel();
		
		butun1 = new Panel();
		butun2 = new Panel();
		butun3 = new Panel();
		
		panel2.setLayout(new FlowLayout(FlowLayout.LEFT));
		panel2.add(ideal);
		panel2.add(gercek);
		
		panel3.setLayout(new FlowLayout(FlowLayout.LEFT));
		panel3.add(ac_baslik);
		panel3.add(acEtiketi);
		
		butun2.setLayout(new GridLayout(2,1,0,5));
		butun2.add(acik);
		butun2.add(kapali);

		panel1.setLayout(new FlowLayout(FlowLayout.LEFT));
		panel1.add(new Label("ANAHTAR"));
		panel1.add(anahtar);
		panel1.add(butun2);
		
		butun3.setLayout(new GridLayout(2,1,0,10));
		butun3.add(panel3);
		butun3.add(ackaynak);
		
		setLayout(new GridLayout(3,1));
		add(butun3);
		add(panel2);
		add(panel1);
		
		ackaynak.addAdjustmentListener(this);
		ideal.addItemListener(this);
		gercek.addItemListener(this);
		anahtar.addExpandListener(this);
		
		ackaynak.setBlockIncrement(1);
		ackaynak.setUnitIncrement(1);
		ackaynak.setMaximum(21);
		ackaynak.setMinimum(0);
	
	}
	
	public void adjustmentValueChanged(AdjustmentEvent olay){
		ac_genlik = ackaynak.getValue();
		acEtiketi.setText(Integer.toString(ac_genlik));
		
		cizimAlani.cizimAlaniGuncelle(ac_genlik,ideal_gercek,acik_kapali, 1500);
	}
	
	public void itemStateChanged(ItemEvent olay){
		if(ideal.getState()){
			ideal_gercek = true;
		}
		else ideal_gercek = false;
		
		cizimAlani.cizimAlaniGuncelle(ac_genlik,ideal_gercek,acik_kapali, 1500);
	}
	
	public void itemExpandStateChanged(ItemExpandEvent olay){
		ItemExpandable ie=olay.getItemExpandable();
		Object[] items=ie.getExpandedItems();
		if(items!=null) {
			acik_kapali = true;
			ideal.setEnabled(true);
			gercek.setEnabled(true);
		}
		else {
			acik_kapali = false;
			ideal.setEnabled(false);
			gercek.setEnabled(false);
		}
		
		cizimAlani.cizimAlaniGuncelle(ac_genlik,ideal_gercek,acik_kapali, 1500);
	}
	
}