Re: Changing coordinates
In article <hvhh02$vb5$1@speranza.aioe.org>,
Eustace <emfril@gmail.ccom> wrote:
On 2010-06-17 10:42 John B. Matthews wrote:
In article <hvc94v$7ep$1@speranza.aioe.org>,
Eustace <emfril@gmail.ccom> wrote:
On 2010-06-16 11:21 Peter Duniho wrote:
[...]
Yes. Use a scaling transform on the Graphics or Graphics2D
instance, just as you've already used a translation transform.
Scale the X coordinates by 1.0, and the Y coordinates by -1.0.
[Thoughtful arc implementation elided.]
Anyway, the decisive drawback against using
scale(1.0, -1.0)
is that if you then want to use
painter2D.draw(String, x, y)
the string appears in the right place but upside down. There may be ways
to correct this, but would make programming more complicated than
flowing with the flow, so that settles the issue.
One can always preserve and restore the graphics transform:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import javax.swing.JFrame;
import javax.swing.JPanel;
/** @author John B. Matthews */
public class SineTest extends JPanel implements Runnable {
private static final int SIZE = 400;
private AffineTransform at;
public static void main(String[] args) {
EventQueue.invokeLater(new SineTest());
}
@Override
public void run() {
JFrame f = new JFrame("ArcTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public SineTest() {
this.setPreferredSize(new Dimension(640, 480));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int w = getWidth();
int h = getHeight();
g2d.setColor(Color.gray);
g2d.drawLine(w / 2, 0, w / 2, h);
g2d.drawLine(0, h / 2, w, h / 2);
at = g2d.getTransform();
g2d.translate(w / 2, h / 2);
g2d.scale(1, -1);
g2d.setColor(Color.blue);
double r = SIZE / 2;
double q = -Math.PI / 2;
double d = Math.PI / 180d;
int x1 = (int) Math.round(q * r);
int y1 = (int) Math.round(Math.sin(q) * r);
int x2, y2;
for (int i = 0; i < 180; i++) {
q += d;
x2 = (int) Math.round(q * r);
y2 = (int) Math.round(Math.sin(q) * r);
g2d.drawLine(x1, y1, x2, y2);
x1 = x2;
y1 = y2;
}
g2d.setTransform(at);
g2d.setColor(Color.blue);
g2d.drawString("y = sin(x)", 100, 100);
}
}
I will be checking the projection library (as well as your website).
Excellent!
--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>