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