package nbtool.gui.logviews.images; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Shape; import java.awt.geom.AffineTransform; import java.awt.geom.Ellipse2D; import java.awt.image.BufferedImage; import nbtool.data.SExpr; import nbtool.data.log.Block; import nbtool.data.log.Log; import nbtool.gui.logviews.misc.ViewParent; import nbtool.gui.logviews.misc.VisionView; import nbtool.images.Y8Image; import nbtool.io.CommonIO.IOFirstResponder; import nbtool.io.CommonIO.IOInstance; import nbtool.util.SharedConstants; import nbtool.util.Utility; public class BallView extends VisionView { BufferedImage original; BufferedImage orange; Block balls = null; @Override protected void setupVisionDisplay() { original = this.getOriginal().toBufferedImage(); } @Override public void paintComponent(Graphics g) { if(orange == null) return; g.drawImage(original, 0, 0, original.getWidth(), original.getHeight(), null); drawBlobs(); g.drawImage(orange, 0, original.getHeight(), orange.getWidth(), orange.getHeight(), null); } public void drawBlobs() { if (orange == null) return; Graphics2D graph = orange.createGraphics(); graph.setColor(Color.RED); String b = "blob"; if (balls == null) return; SExpr tree = balls.parseAsSExpr(); for (int i=0; ; i++) { SExpr bl = tree.find(b+i); if (!bl.exists()) { break; } SExpr blob = bl.get(1); drawBlob(graph, blob); } graph.setColor(Color.GREEN); b = "ball"; for(int i=0; ;i++) { SExpr ball = tree.find(b+i); if (!ball.exists()){ break; } SExpr blob = ball.get(1).find("blob").get(1); double diam = ball.get(1). find("expectedDiam").get(1).valueAsDouble(); SExpr loc = blob.find("center").get(1); int x = (int) Math.round(loc.get(0).valueAsDouble()); int y = (int) Math.round(loc.get(1).valueAsDouble()); graph.draw(new Ellipse2D.Double(x - diam/2, y - diam/2, diam, diam)); } } private void drawBlob(Graphics2D g, SExpr blob) { SExpr loc = blob.find("center").get(1); int x = (int) Math.round(loc.get(0).valueAsDouble()); int y = (int) Math.round(loc.get(1).valueAsDouble()); double len1 = blob.find("len1").get(1).valueAsDouble(); double len2 = blob.find("len2").get(1).valueAsDouble(); double ang1 = blob.find("ang1").get(1).valueAsDouble(); double ang2 = blob.find("ang2").get(1).valueAsDouble(); int firstXOff = (int)Math.round(len1 * Math.cos(ang1)); int firstYOff = (int)Math.round(len1 * Math.sin(ang1)); int secondXOff = (int)Math.round(len2 * Math.cos(ang2)); int secondYOff = (int)Math.round(len2 * Math.sin(ang2)); g.drawLine(x - firstXOff, y - firstYOff, x + firstXOff, y + firstYOff); g.drawLine(x - secondXOff, y - secondYOff, x + secondXOff, y + secondYOff); Ellipse2D.Double ellipse = new Ellipse2D.Double(x-len1, y-len2, len1*2, len2*2); Shape rotated = (AffineTransform.getRotateInstance(ang1, x, y).createTransformedShape(ellipse)); g.draw(rotated); } @Override public void ioFinished(IOInstance instance) {} @Override public void ioReceived(IOInstance inst, int ret, Log... out) { Block oB = this.getOrangeBlock(); if (oB != null) { Y8Image o = new Y8Image(this.originalWidth() / 4, this.originalHeight() / 2, oB.data); orange = new BufferedImage(o.width, o.height, BufferedImage.TYPE_3BYTE_BGR); Graphics2D g = orange.createGraphics(); g.drawImage(o.toBufferedImage(), 0, 0, null); //drawBlobs(); } balls = this.getBallBlock(); } }