package ddddbb.math;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Composite;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
public class D2Graphics implements D2GraphicsIF {
private Graphics2D g;
private double xcm;
private double ycm;
FontMetrics fm;
public D2Graphics(Graphics2D _g,double _xcm, double _ycm) {
g = _g;
fm = g.getFontMetrics();
xcm = _xcm;
ycm = _ycm;
}
public void proj(Point2d p,D2Tupel s) {
s.x1 = (int)Math.round(p.x1*xcm);
s.x2 = -(int)Math.round(p.x2*ycm);
}
public void drawString(String s,Point2d p) {
D2Tupel pi = new D2Tupel();
proj(p,pi);
g.drawString(s,pi.x1,pi.x2);
}
public void drawStringEast(String s, Point2d p) {
D2Tupel pi = new D2Tupel();
proj(p,pi);
g.drawString(s,pi.x1+1,pi.x2);
}
public void drawStringNorth(String s, Point2d p) {
D2Tupel pi = new D2Tupel();
proj(p,pi);
int descent = fm.getDescent();
int w = fm.stringWidth(s);
g.drawString(s,pi.x1-w/2,pi.x2-descent);
}
public void drawStringSouth(String s, Point2d p) {
D2Tupel pi = new D2Tupel();
proj(p,pi);
int ascent = fm.getAscent();
int w = fm.stringWidth(s);
g.drawString(s, pi.x1-w/2, pi.x2+ascent);
}
public void drawStringWest(String s, Point2d p) {
D2Tupel pi = new D2Tupel();
proj(p,pi);
int w = fm.stringWidth(s);
g.drawString(s, pi.x1-w-1, pi.x2);
}
public void drawString(String s,double x,double y) {
drawString(s,new Point2d(x,y));
}
public void drawLine(Point2d a,Point2d b) {
D2Tupel ai = new D2Tupel();
D2Tupel bi = new D2Tupel();
proj(a,ai);
proj(b,bi);
g.drawLine(ai.x1,ai.x2,bi.x1,bi.x2);
}
public void drawThickLine(Point2d a, Point2d b) {
D2Tupel ai = new D2Tupel();
D2Tupel bi = new D2Tupel();
proj(a,ai);
proj(b,bi);
g.setStroke(new BasicStroke(2));
g.drawLine(ai.x1,ai.x2,bi.x1,bi.x2);
}
private static int blobRadius = 3;
public void drawBlob(Point2d a) {
D2Tupel ai = new D2Tupel();
proj(a,ai);
g.fillOval(ai.x1-blobRadius,ai.x2-blobRadius,2*blobRadius,2*blobRadius);
}
public void drawLine(double ax,double ay,double bx,double by) {
drawLine(new Point2d(ax,ay),new Point2d(bx,by));
}
/** draws rectangle where a must be the left lower corner and b must be the right upper corner */
public void drawRect(Point2d a,Point2d b) {
D2Tupel ai = new D2Tupel();
D2Tupel bi = new D2Tupel();
proj(a,ai);
proj(b,bi);
g.drawRect(ai.x1,bi.x2,bi.x1-ai.x1,ai.x2-bi.x2);
}
public void clearRect(Point2d a,Point2d b) {
D2Tupel ai = new D2Tupel();
D2Tupel bi = new D2Tupel();
proj(a,ai);
proj(b,bi);
g.clearRect(ai.x1,bi.x2,bi.x1-ai.x1,ai.x2-bi.x2);
}
public void drawRect(double x0,double y0,double w,double h) {
drawRect(new Point2d(x0,y0),new Point2d(x0+w,y0+h));
}
public void setColor(Color c) {
g.setColor(c);
}
public Color getBackground() {
return g.getBackground();
}
public void setBackground(Color c) {
g.setBackground(c);
}
public void setComposite(Composite c) {
g.setComposite(c);
}
public void translate(double x, double y) {
Point2d a = new Point2d(x,y);
D2Tupel ai = new D2Tupel();
proj(a,ai);
g.translate(ai.x1,ai.x2);
}
public Graphics2D getGraphics() {
return g;
}
public void setGraphics(Graphics2D _g) {
Composite c = g.getComposite();
g = _g;
g.setComposite(c);
}
}