import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class puntoRette extends JPanel
{
	int tempX = 0, tempY = 0;
	Cerchio cerchio;
	int yRetta = 400;
	int Ax = 0, Ay = 600, Bx = 600, By = 600;
	
	public puntoRette()
	{
		cerchio = new Cerchio(300,300,50);
		addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e)
			{
				if (cerchio.cliccato(e.getX(), e.getY()))
				{
					tempX = e.getX() - cerchio.x;
					tempY = e.getY() - cerchio.y;
					cerchio.clicked = true;
				}
			}
			public void mouseReleased(MouseEvent e) 
			{
				cerchio.clicked = false; 
			}});
				
		addMouseMotionListener(new MouseMotionAdapter(){ 
			public void mouseDragged(MouseEvent e) 
			{
				if (cerchio.clicked)
				{
					cerchio.x = e.getX() - tempX; 
					cerchio.y = e.getY() - tempY;
					//if (cerchio.y > yRetta) cerchio.y = yRetta;
					repaint();
				}
			}});
	}
	
	public void paint(Graphics g)
	{
		super.paintComponent(g);

		cerchio.rimbalza(getWidth(), getHeight());
		
		g.drawLine(Ax , Ay, cerchio.x, cerchio.y);
		g.drawLine(cerchio.x, cerchio.y, Bx, By);
		g.drawLine(0,yRetta,600,yRetta);
		// CALCOLO L'INTERSEZIONE COL PUNTO A
		mostraPuntoIntersezioneRetteCon4Punti(g,
			new Punto(Ax,Ay),
			new Punto(cerchio.x, cerchio.y),
			new Punto(0,yRetta),
			new Punto(600,yRetta) );
		mostraPuntoIntersezioneRetteCon4Punti(g,
			new Punto(Bx,By),
			new Punto(cerchio.x, cerchio.y),
			new Punto(0,yRetta),
			new Punto(600,yRetta) );
		cerchio.mostra(g);
		repaint();
	}
	
	public void mostraPuntoIntersezioneRetteCon4Punti(Graphics g, Punto A, Punto B, Punto C, Punto D)
	{
		// intersezione tra due rette (R1, R2) con:
		// R1 retta passante per A e B
		// R2 retta passante per C e D
		// y = mx + q - equazione di una retta
		// m = (y1 - y2)/(x1 - x2) - coefficiente angolare per una retta fra due punti
		float m = (A.y -  B.y)/(A.x - B.x);
		float q = B.y - m*B.x;
		float m1 = (C.y -  D.y)/(C.x - D.x);
		float q1 = D.y - m1*D.x;
		float x = (q1 - q)/(m - m1);
		float y = m*x + q;
		g.fillOval((int)x-5, (int)y-5, 10,10);
	}
	
	public static void main(String[] a) 
	{
		JFrame f = new JFrame();
		f.setSize(600,600);
		f.setTitle("Punto Rette");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.add(new puntoRette());
		f.setVisible(true); 
	}
}

class Cerchio
{
	int x, y, dim;
	int step = 1, VX=1, VY=1;
	boolean clicked = false;
	
	public Cerchio(int x, int y, int dim)
	{
		this.x = x;
		this.y = y;
		this.dim = dim;
	}
	public boolean cliccato(int cx, int cy)
	{
		if (cx > x - dim/2 && cx < x+dim/2 && cy > y-dim/2 && cy < y+dim/2)
			return true;
		else
			return false;
	}
	
	public void mostra(Graphics g)
	{
		g.fillOval(x-dim/2,y-dim/2, dim, dim);
	}
	
	public void rimbalza(int w, int h)
	{
		x += step*VX;
		y += step*VY;
		if (x < 0 || x > w) VX = VX*(-1);
		if (y < 0 || y > h) VY = VY*(-1);	
	}
}

class Punto
{
	float x, y;
	public Punto(int x, int y)
	{
		this.x = (float)x;
		this.y = (float)y;
	}
}
