package de.gaalop.vis2d.drawing; import de.gaalop.vis2d.Stretch2d; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Stroke; import java.awt.geom.Line2D; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; /** * * @author Christian Steinmetz */ public class DrawVisitorGraphics implements DrawVisitor { protected Rectangle2D world; private Graphics graphics; protected int dimension; protected double scale; public DrawVisitorGraphics(Rectangle2D world, int width, int height) { this.world = world; scale = Math.min(width/world.getWidth(),height/world.getHeight()); dimension = (int) Math.round(world.getWidth()*scale); } public void setGraphics(Graphics graphics) { this.graphics = graphics; graphics.setFont(new Font("Arial", Font.PLAIN, 12)); } private Point transformPoint(double x, double y) { return new Point((int) Math.round((x-world.getMinX())*scale),(int) Math.round(dimension-(y-world.getMinY())*scale)); } private double transformLength(double length) { return transformPoint(0, 0).distance(transformPoint(0, length)); } public Point2D.Double transformPointBack(int x, int y) { return new Point2D.Double( world.getMinX() + x/scale, world.getMinY() - (y-dimension)/scale ); } @Override public void visitCircle2d(Circle2d circle2d) { graphics.setColor(circle2d.color); int ovalWidth = (int) Math.round(transformLength(circle2d.radius*2)); Point location = transformPoint(circle2d.centerX, circle2d.centerY); graphics.drawOval(location.x-ovalWidth/2, location.y-ovalWidth/2, ovalWidth, ovalWidth); } @Override public void visitCircleDashed2d(CircleDashed2d circleDashed2d) { Graphics2D g = (Graphics2D) graphics; Stroke s = g.getStroke(); float dash1[] = {10.0f}; BasicStroke dashed = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dash1, 0.0f); g.setStroke(dashed); graphics.setColor(circleDashed2d.color); int ovalWidth = (int) Math.round(transformLength(circleDashed2d.radius*2)); Point location = transformPoint(circleDashed2d.centerX, circleDashed2d.centerY); graphics.drawOval(location.x-ovalWidth/2, location.y-ovalWidth/2, ovalWidth, ovalWidth); g.setStroke(s); } @Override public void visitGerade2d(Gerade2d gerade2d) { graphics.setColor(gerade2d.color); Line2D line = gerade2d.getLineOnRectangle(world); if (line != null) { Point start = transformPoint(line.getX1(), line.getY1()); Point end = transformPoint(line.getX2(), line.getY2()); graphics.drawLine(start.x,start.y,end.x,end.y); } } @Override public void visitPoint2d(Point2d point2d) { graphics.setColor(point2d.color); Point p = transformPoint(point2d.centerX, point2d.centerY); graphics.fillOval(p.x-3,p.y-3,6,6); } @Override public void visitPointpair2d(Pointpair2d pointpair2d) { graphics.setColor(pointpair2d.color); Point p1 = transformPoint(pointpair2d.p1X, pointpair2d.p1Y); graphics.fillOval(p1.x-3,p1.y-3,6,6); Point p2 = transformPoint(pointpair2d.p2X, pointpair2d.p2Y); graphics.fillOval(p2.x-3,p2.y-3,6,6); } @Override public void drawKOS() { double dx = world.getWidth()/10; double dy = world.getHeight()/10; for (double x=0;x>=world.getMinX();x-=dx) { visitGerade2d(new Gerade2d(x, 0, 0, 1, Color.lightGray)); visitText2d(new Text2d(x,0,x+"", Color.lightGray)); } for (double x=0;x<=world.getMaxX();x+=dx) { visitGerade2d(new Gerade2d(x, 0, 0, 1, Color.lightGray)); visitText2d(new Text2d(x,0,x+"", Color.lightGray)); } for (double y=0;y>=world.getMinY();y-=dy) { visitGerade2d(new Gerade2d(0, y, 1, 0, Color.lightGray)); visitText2d(new Text2d(0,y,y+"", Color.lightGray)); } for (double y=0;y<=world.getMaxY();y+=dy) { visitGerade2d(new Gerade2d(0, y, 1, 0, Color.lightGray)); visitText2d(new Text2d(0,y,y+"", Color.lightGray)); } visitGerade2d(new Gerade2d(0, 0, 0, 1, Color.darkGray)); visitGerade2d(new Gerade2d(0, 0, 1, 0, Color.darkGray)); } @Override public void visitText2d(Text2d text2d) { graphics.setColor(text2d.color); Point p = transformPoint(text2d.x, text2d.y); graphics.drawString(text2d.text, p.x, p.y); } @Override public void visitStretch2d(Stretch2d stretch2d) { graphics.setColor(stretch2d.color); Point start = transformPoint(stretch2d.x1, stretch2d.y1); Point end = transformPoint(stretch2d.x2, stretch2d.y2); graphics.drawLine(start.x,start.y,end.x,end.y); } }