Tracker.java

See Capacitor.java


Tracker.java

// Tracker.java
import java.awt.*;
import java.util.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;

public class Tracker extends JPanel implements MouseMotionListener
{
    final static int  resolution = 96;
    AffineTransform tf;
    Capacitor c1;
    JLabel status = new JLabel(" ");
    double xoffset, yoffset;

    Tracker()
    {
	c1 = new Capacitor();
        c1.setPosition(0.0,1.0);
        c1.setAngle(30.0);
        c1.color = Color.BLUE;
	c1.name = "C1";
	status.setBackground(Color.WHITE);
	status.setOpaque(true);
	status.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));

     	addMouseMotionListener( this );
    }


    protected void show_size(Graphics g)
    {
	int width = getWidth();
	int height = getHeight();
	String str = String.format("width %d height %d",width,height);
	FontMetrics fm = g.getFontMetrics();
	Rectangle2D rect = fm.getStringBounds(str,g);
	width -= rect.getWidth();
	height -= rect.getHeight();
	g.drawString(str,width/2,height/2);
    }

    protected void draw_grid(Graphics g)
    {
	Graphics2D g2 = (Graphics2D) g;
	AffineTransform saveXform = g2.getTransform();
	Paint savePaint = g2.getPaint();
	g2.setPaint(new Color(220,220,255));
	Stroke saveStroke = g2.getStroke();
	g2.setStroke(new BasicStroke(1.0f/resolution));
	double u = 4.0;
	for (int i=-4; i<=4; i++) {
		double v = i;			
		g2.draw(new Line2D.Double(-u,v,4,v));
		g2.draw(new Line2D.Double(v,-u,v,u));
	}
	// locate origin
	boolean show_origin = false;
	if (show_origin) {
  	   g2.setPaint(Color.BLACK);
	   u = 0.05;
	   g2.draw(new Line2D.Double(-u,u,u,-u));
	   g2.draw(new Line2D.Double(-u,-u,u,u));
	}
	g2.setStroke(saveStroke);
	g2.setTransform(saveXform);
    }

    public void paintComponent(Graphics g)
    {
	super.paintComponent( g );
	Graphics2D g2 = (Graphics2D) g;
	AffineTransform saveXform = g2.getTransform();
	Paint savePaint = g2.getPaint();
	int width = getWidth();
	int height = getHeight();
	g2.translate(width/2,height/2);
	g2.scale(resolution,resolution);
	try {
	  tf = g2.getTransform().createInverse();
	}
	catch(Exception e) {
	  System.err.println("Exception " + e);
	}

	draw_grid(g);
	Stroke saveStroke = g2.getStroke();
	g2.setStroke(new BasicStroke(2.0f/resolution,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));

	c1.draw(g);

	g2.setTransform(saveXform);
	g2.setPaint(savePaint);
	g2.setStroke(saveStroke);
	// show_size(g);
    }

    public void mouseDragged( MouseEvent e )
   {
	mouseMoved(e);
   }

   public void mouseMoved( MouseEvent e )
   {
	Point2D src = new Point2D.Double(e.getX(),e.getY());
	Point2D dst = new Point2D.Double();
	tf.transform(src,dst);
	Point2D dst1 = new Point2D.Double();
	boolean inside = false;
	String str = String.format("Grid  [ %.2g, %.2g]",dst.getX(),-dst.getY());
	inside = c1.getLocation(src,dst1); 
	if (inside) str = String.format("inside %s: [%.2g %.2g]",c1.name, dst1.getX(),-dst1.getY());
        status.setText( str );
   }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(() -> {
		Tracker panel = new Tracker();
		JFrame application = new JFrame("Tracker");
		application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		application.add(panel);
		application.add(panel.status,BorderLayout.SOUTH);
		application.setSize(496,400);
		application.setVisible(true);
	});
    }
}


Maintained by John Loomis, updated Thu Feb 28 10:20:10 2019