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

public class puntoRette extends JPanel
{
	int tempX = 0, tempY = 0;
	Cerchio[] cerchi;
	int ccx, ccy;
	
	public puntoRette()
	{
		cerchi = new Cerchio[4];
		for (int k = 0; k < cerchi.length; k++)
			cerchi[k] = new Cerchio((int)(Math.random()*300), (int)(Math.random()*300),50);
		
		addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e)
			{
				for (int k = 0; k < cerchi.length; k++)
					if (cerchi[k].cliccato(e.getX(), e.getY()))
					{
						tempX = e.getX() - cerchi[k].x;
						tempY = e.getY() - cerchi[k].y;
						cerchi[k].clicked = true;
					}
			}
			public void mouseReleased(MouseEvent e) 
			{
				for (int k = 0; k < cerchi.length; k++)
					cerchi[k].clicked = false; 
			}});
				
		addMouseMotionListener(new MouseMotionAdapter(){ 
			public void mouseDragged(MouseEvent e) 
			{
				for (int k = 0; k < cerchi.length; k++)
					if (cerchi[k].clicked)
					{
						cerchi[k].x = e.getX() - tempX; 
						cerchi[k].y = e.getY() - tempY;
						repaint();
					}
			}});
	}
	
	public void paint(Graphics g)
	{
		super.paintComponent(g);

//		for (int k = 0; k < cerchi.length; k++)
//			cerchi[k].rimbalza(getWidth(), getHeight());
		
		g.drawLine(cerchi[0].x , cerchi[0].y, cerchi[1].x, cerchi[1].y);
		g.drawLine(cerchi[2].x , cerchi[2].y, cerchi[3].x, cerchi[3].y);
		
		// CALCOLO L'INTERSEZIONE COL PUNTO A
		mostraPuntoIntersezioneRetteCon4Punti(g,
			new Punto(cerchi[0].x,cerchi[0].y),
			new Punto(cerchi[1].x,cerchi[1].y),
			new Punto(cerchi[2].x,cerchi[2].y),
			new Punto(cerchi[3].x,cerchi[3].y) );
			
		for (int k = 0; k < cerchi.length; k++)
			cerchi[k].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;
	}
}
