--- a/jdk/src/share/demo/applets/MoleculeViewer/Matrix3D.java Fri Mar 25 17:55:34 2011 +0100
+++ b/jdk/src/share/demo/applets/MoleculeViewer/Matrix3D.java Fri Mar 25 17:56:52 2011 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -29,22 +29,23 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-/*
- */
/** A fairly conventional 3D matrix object that can transform sets of
- 3D points and perform a variety of manipulations on the transform */
+3D points and perform a variety of manipulations on the transform */
class Matrix3D {
+
float xx, xy, xz, xo;
float yx, yy, yz, yo;
float zx, zy, zz, zo;
static final double pi = 3.14159265;
+
/** Create a new unit matrix */
- Matrix3D () {
+ Matrix3D() {
xx = 1.0f;
yy = 1.0f;
zz = 1.0f;
}
+
/** Scale by f in all dimensions */
void scale(float f) {
xx *= f;
@@ -60,6 +61,7 @@
zz *= f;
zo *= f;
}
+
/** Scale along each axis independently */
void scale(float xf, float yf, float zf) {
xx *= xf;
@@ -75,12 +77,14 @@
zz *= zf;
zo *= zf;
}
+
/** Translate the origin */
void translate(float x, float y, float z) {
xo += x;
yo += y;
zo += z;
}
+
/** rotate theta degrees about the y axis */
void yrot(double theta) {
theta *= (pi / 180);
@@ -106,6 +110,7 @@
zy = Nzy;
zz = Nzz;
}
+
/** rotate theta degrees about the x axis */
void xrot(double theta) {
theta *= (pi / 180);
@@ -131,6 +136,7 @@
zy = Nzy;
zz = Nzz;
}
+
/** rotate theta degrees about the z axis */
void zrot(double theta) {
theta *= (pi / 180);
@@ -156,6 +162,7 @@
xy = Nxy;
xz = Nxz;
}
+
/** Multiply this matrix by a second: M = M*R */
void mult(Matrix3D rhs) {
float lxx = xx * rhs.xx + yx * rhs.xy + zx * rhs.xz;
@@ -204,10 +211,11 @@
zy = 0;
zz = 1;
}
+
/** Transform nvert points from v into tv. v contains the input
- coordinates in floating point. Three successive entries in
- the array constitute a point. tv ends up holding the transformed
- points as integers; three successive entries per point */
+ coordinates in floating point. Three successive entries in
+ the array constitute a point. tv ends up holding the transformed
+ points as integers; three successive entries per point */
void transform(float v[], int tv[], int nvert) {
float lxx = xx, lxy = xy, lxz = xz, lxo = xo;
float lyx = yx, lyy = yy, lyz = yz, lyo = yo;
@@ -216,11 +224,13 @@
float x = v[i];
float y = v[i + 1];
float z = v[i + 2];
- tv[i ] = (int) (x * lxx + y * lxy + z * lxz + lxo);
+ tv[i] = (int) (x * lxx + y * lxy + z * lxz + lxo);
tv[i + 1] = (int) (x * lyx + y * lyy + z * lyz + lyo);
tv[i + 2] = (int) (x * lzx + y * lzy + z * lzz + lzo);
}
}
+
+ @Override
public String toString() {
return ("[" + xo + "," + xx + "," + xy + "," + xz + ";"
+ yo + "," + yx + "," + yy + "," + yz + ";"
--- a/jdk/src/share/demo/applets/MoleculeViewer/XYZApp.java Fri Mar 25 17:55:34 2011 +0100
+++ b/jdk/src/share/demo/applets/MoleculeViewer/XYZApp.java Fri Mar 25 17:56:52 2011 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -29,37 +29,43 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-/*
- */
+
+import java.applet.Applet;
+import java.awt.Image;
+import java.awt.Graphics;
+import java.awt.Dimension;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.net.URL;
+import java.awt.image.IndexColorModel;
+import java.awt.image.MemoryImageSource;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.StreamTokenizer;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
/*
* A set of classes to parse, represent and display Chemical compounds in
* .xyz format (see http://chem.leeds.ac.uk/Project/MIME.html)
*/
+/** The representation of a Chemical .xyz model */
+final class XYZChemModel {
-import java.applet.Applet;
-import java.awt.Image;
-import java.awt.Event;
-import java.awt.Graphics;
-import java.awt.Dimension;
-import java.io.*;
-import java.net.URL;
-import java.util.Hashtable;
-import java.awt.image.IndexColorModel;
-import java.awt.image.ColorModel;
-import java.awt.image.MemoryImageSource;
-import java.awt.event.*;
-
-/** The representation of a Chemical .xyz model */
-class XYZChemModel {
float vert[];
Atom atoms[];
int tvert[];
int ZsortMap[];
int nvert, maxvert;
+ static final Map<String, Atom> atomTable = new HashMap<String, Atom>();
+ static Atom defaultAtom;
- static Hashtable atomTable = new Hashtable();
- static Atom defaultAtom;
static {
atomTable.put("c", new Atom(0, 0, 0));
atomTable.put("h", new Atom(210, 210, 210));
@@ -70,77 +76,72 @@
atomTable.put("hn", new Atom(150, 255, 150)); /* !!*/
defaultAtom = new Atom(255, 100, 200);
}
-
boolean transformed;
Matrix3D mat;
-
float xmin, xmax, ymin, ymax, zmin, zmax;
-
- XYZChemModel () {
+ XYZChemModel() {
mat = new Matrix3D();
mat.xrot(20);
mat.yrot(30);
}
-
- /** Create a Cehmical model by parsing an input stream */
- XYZChemModel (InputStream is) throws Exception
- {
- this();
- StreamTokenizer st = new StreamTokenizer(
- new BufferedReader(new InputStreamReader(is, "UTF-8")));
- st.eolIsSignificant(true);
- st.commentChar('#');
- int slot = 0;
+ /** Create a Chemical model by parsing an input stream */
+ XYZChemModel(InputStream is) throws Exception {
+ this();
+ StreamTokenizer st = new StreamTokenizer(
+ new BufferedReader(new InputStreamReader(is, "UTF-8")));
+ st.eolIsSignificant(true);
+ st.commentChar('#');
- try
- {
-scan:
- while (true)
- {
- switch ( st.nextToken() )
- {
- case StreamTokenizer.TT_EOF:
- break scan;
- default:
- break;
- case StreamTokenizer.TT_WORD:
- String name = st.sval;
- double x = 0, y = 0, z = 0;
- if (st.nextToken() == StreamTokenizer.TT_NUMBER)
- {
- x = st.nval;
- if (st.nextToken() == StreamTokenizer.TT_NUMBER)
- {
- y = st.nval;
- if (st.nextToken() == StreamTokenizer.TT_NUMBER)
- z = st.nval;
- }
- }
- addVert(name, (float) x, (float) y, (float) z);
- while( st.ttype != StreamTokenizer.TT_EOL &&
- st.ttype != StreamTokenizer.TT_EOF )
- st.nextToken();
+ try {
+ scan:
+ while (true) {
+ switch (st.nextToken()) {
+ case StreamTokenizer.TT_EOF:
+ break scan;
+ default:
+ break;
+ case StreamTokenizer.TT_WORD:
+ String name = st.sval;
+ double x = 0,
+ y = 0,
+ z = 0;
+ if (st.nextToken() == StreamTokenizer.TT_NUMBER) {
+ x = st.nval;
+ if (st.nextToken() == StreamTokenizer.TT_NUMBER) {
+ y = st.nval;
+ if (st.nextToken() == StreamTokenizer.TT_NUMBER) {
+ z = st.nval;
+ }
+ }
+ }
+ addVert(name, (float) x, (float) y, (float) z);
+ while (st.ttype != StreamTokenizer.TT_EOL
+ && st.ttype != StreamTokenizer.TT_EOF) {
+ st.nextToken();
+ }
- } // end Switch
+ } // end Switch
- } // end while
+ } // end while
- is.close();
+ is.close();
- } // end Try
- catch( IOException e) {}
+ } // end Try
+ catch (IOException e) {
+ }
- if (st.ttype != StreamTokenizer.TT_EOF)
- throw new Exception(st.toString());
+ if (st.ttype != StreamTokenizer.TT_EOF) {
+ throw new Exception(st.toString());
+ }
} // end XYZChemModel()
/** Add a vertex to this model */
int addVert(String name, float x, float y, float z) {
int i = nvert;
- if (i >= maxvert)
+ if (i >= maxvert) {
if (vert == null) {
maxvert = 100;
vert = new float[maxvert * 3];
@@ -154,8 +155,11 @@
System.arraycopy(atoms, 0, na, 0, atoms.length);
atoms = na;
}
- Atom a = (Atom) atomTable.get(name.toLowerCase());
- if (a == null) a = defaultAtom;
+ }
+ Atom a = atomTable.get(name.toLowerCase());
+ if (a == null) {
+ a = defaultAtom;
+ }
atoms[i] = a;
i *= 3;
vert[i] = x;
@@ -166,29 +170,32 @@
/** Transform all the points in this model */
void transform() {
- if (transformed || nvert <= 0)
+ if (transformed || nvert <= 0) {
return;
- if (tvert == null || tvert.length < nvert * 3)
+ }
+ if (tvert == null || tvert.length < nvert * 3) {
tvert = new int[nvert * 3];
+ }
mat.transform(vert, tvert, nvert);
transformed = true;
}
-
/** Paint this model to a graphics context. It uses the matrix associated
- with this model to map from model space to screen space.
- The next version of the browser should have double buffering,
- which will make this *much* nicer */
+ with this model to map from model space to screen space.
+ The next version of the browser should have double buffering,
+ which will make this *much* nicer */
void paint(Graphics g) {
- if (vert == null || nvert <= 0)
+ if (vert == null || nvert <= 0) {
return;
+ }
transform();
int v[] = tvert;
int zs[] = ZsortMap;
if (zs == null) {
ZsortMap = zs = new int[nvert];
- for (int i = nvert; --i >= 0;)
+ for (int i = nvert; --i >= 0;) {
zs[i] = i * 3;
+ }
}
/*
@@ -209,24 +216,26 @@
flipped = true;
}
}
- if (!flipped)
+ if (!flipped) {
break;
+ }
}
- int lg = 0;
int lim = nvert;
- Atom ls[] = atoms;
- if (lim <= 0 || nvert <= 0)
+ if (lim <= 0 || nvert <= 0) {
return;
+ }
for (int i = 0; i < lim; i++) {
int j = zs[i];
int grey = v[j + 2];
- if (grey < 0)
+ if (grey < 0) {
grey = 0;
- if (grey > 15)
+ }
+ if (grey > 15) {
grey = 15;
+ }
// g.drawString(names[i], v[j], v[j+1]);
- atoms[j/3].paint(g, v[j], v[j + 1], grey);
+ atoms[j / 3].paint(g, v[j], v[j + 1], grey);
// g.drawImage(iBall, v[j] - (iBall.width >> 1), v[j + 1] -
// (iBall.height >> 1));
}
@@ -234,47 +243,55 @@
/** Find the bounding box of this model */
void findBB() {
- if (nvert <= 0)
+ if (nvert <= 0) {
return;
+ }
float v[] = vert;
- float xmin = v[0], xmax = xmin;
- float ymin = v[1], ymax = ymin;
- float zmin = v[2], zmax = zmin;
+ float _xmin = v[0], _xmax = _xmin;
+ float _ymin = v[1], _ymax = _ymin;
+ float _zmin = v[2], _zmax = _zmin;
for (int i = nvert * 3; (i -= 3) > 0;) {
float x = v[i];
- if (x < xmin)
- xmin = x;
- if (x > xmax)
- xmax = x;
+ if (x < _xmin) {
+ _xmin = x;
+ }
+ if (x > _xmax) {
+ _xmax = x;
+ }
float y = v[i + 1];
- if (y < ymin)
- ymin = y;
- if (y > ymax)
- ymax = y;
+ if (y < _ymin) {
+ _ymin = y;
+ }
+ if (y > _ymax) {
+ _ymax = y;
+ }
float z = v[i + 2];
- if (z < zmin)
- zmin = z;
- if (z > zmax)
- zmax = z;
+ if (z < _zmin) {
+ _zmin = z;
+ }
+ if (z > _zmax) {
+ _zmax = z;
+ }
}
- this.xmax = xmax;
- this.xmin = xmin;
- this.ymax = ymax;
- this.ymin = ymin;
- this.zmax = zmax;
- this.zmin = zmin;
+ this.xmax = _xmax;
+ this.xmin = _xmin;
+ this.ymax = _ymax;
+ this.ymin = _ymin;
+ this.zmax = _zmax;
+ this.zmin = _zmin;
}
}
+
/** An applet to put a Chemical model into a page */
-public class XYZApp
- extends Applet
- implements Runnable, MouseListener, MouseMotionListener {
+@SuppressWarnings("serial")
+public class XYZApp extends Applet implements Runnable, MouseListener,
+ MouseMotionListener {
+
XYZChemModel md;
boolean painted = true;
float xfac;
int prevx, prevy;
- float xtheta, ytheta;
float scalefudge = 1;
Matrix3D amat = new Matrix3D(), tmat = new Matrix3D();
String mdname = null;
@@ -283,7 +300,6 @@
Graphics backGC;
Dimension backSize;
-
private synchronized void newBackBuffer() {
backBuffer = createImage(getSize().width, getSize().height);
if (backGC != null) {
@@ -293,164 +309,190 @@
backSize = getSize();
}
+ @Override
public void init() {
mdname = getParameter("model");
try {
scalefudge = Float.valueOf(getParameter("scale")).floatValue();
- } catch(Exception e) {
- };
+ } catch (Exception ignored) {
+ }
amat.yrot(20);
amat.xrot(20);
- if (mdname == null)
+ if (mdname == null) {
mdname = "model.obj";
+ }
resize(getSize().width <= 20 ? 400 : getSize().width,
- getSize().height <= 20 ? 400 : getSize().height);
+ getSize().height <= 20 ? 400 : getSize().height);
newBackBuffer();
addMouseListener(this);
addMouseMotionListener(this);
}
+ @Override
public void destroy() {
removeMouseListener(this);
removeMouseMotionListener(this);
}
+ @Override
public void run() {
InputStream is = null;
try {
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
is = new URL(getDocumentBase(), mdname).openStream();
- XYZChemModel m = new XYZChemModel (is);
+ XYZChemModel m = new XYZChemModel(is);
Atom.setApplet(this);
md = m;
m.findBB();
float xw = m.xmax - m.xmin;
float yw = m.ymax - m.ymin;
float zw = m.zmax - m.zmin;
- if (yw > xw)
+ if (yw > xw) {
xw = yw;
- if (zw > xw)
+ }
+ if (zw > xw) {
xw = zw;
+ }
float f1 = getSize().width / xw;
float f2 = getSize().height / xw;
xfac = 0.7f * (f1 < f2 ? f1 : f2) * scalefudge;
- } catch(Exception e) {
- e.printStackTrace();
+ } catch (Exception e) {
+ Logger.getLogger(XYZApp.class.getName()).log(Level.SEVERE, null, e);
md = null;
message = e.toString();
}
try {
- if (is != null)
+ if (is != null) {
is.close();
- } catch(Exception e) {
+ }
+ } catch (Exception ignored) {
}
repaint();
}
+
+ @Override
public void start() {
- if (md == null && message == null)
+ if (md == null && message == null) {
new Thread(this).start();
+ }
}
+
+ @Override
public void stop() {
}
- /* event handling */
- public void mouseClicked(MouseEvent e) {
- }
- public void mousePressed(MouseEvent e) {
- prevx = e.getX();
- prevy = e.getY();
- e.consume();
- }
- public void mouseReleased(MouseEvent e) {
- }
- public void mouseEntered(MouseEvent e) {
- }
- public void mouseExited(MouseEvent e) {
- }
- public void mouseDragged(MouseEvent e) {
- int x = e.getX();
- int y = e.getY();
- tmat.unit();
- float xtheta = (prevy - y) * (360.0f / getSize().width);
- float ytheta = (x - prevx) * (360.0f / getSize().height);
- tmat.xrot(xtheta);
- tmat.yrot(ytheta);
- amat.mult(tmat);
- if (painted) {
- painted = false;
- repaint();
+ /* event handling */
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ }
+
+ @Override
+ public void mousePressed(MouseEvent e) {
+ prevx = e.getX();
+ prevy = e.getY();
+ e.consume();
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseEntered(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseExited(MouseEvent e) {
}
- prevx = x;
- prevy = y;
- e.consume();
- }
- public void mouseMoved(MouseEvent e) {
- }
+ @Override
+ public void mouseDragged(MouseEvent e) {
+ int x = e.getX();
+ int y = e.getY();
+ tmat.unit();
+ float xtheta = (prevy - y) * (360.0f / getSize().width);
+ float ytheta = (x - prevx) * (360.0f / getSize().height);
+ tmat.xrot(xtheta);
+ tmat.yrot(ytheta);
+ amat.mult(tmat);
+ if (painted) {
+ painted = false;
+ repaint();
+ }
+ prevx = x;
+ prevy = y;
+ e.consume();
+ }
+
+ @Override
+ public void mouseMoved(MouseEvent e) {
+ }
+
+ @Override
public void update(Graphics g) {
- if (backBuffer == null)
+ if (backBuffer == null) {
g.clearRect(0, 0, getSize().width, getSize().height);
+ }
paint(g);
}
+ @Override
public void paint(Graphics g) {
if (md != null) {
md.mat.unit();
md.mat.translate(-(md.xmin + md.xmax) / 2,
- -(md.ymin + md.ymax) / 2,
- -(md.zmin + md.zmax) / 2);
+ -(md.ymin + md.ymax) / 2,
+ -(md.zmin + md.zmax) / 2);
md.mat.mult(amat);
// md.mat.scale(xfac, -xfac, 8 * xfac / getSize().width);
md.mat.scale(xfac, -xfac, 16 * xfac / getSize().width);
md.mat.translate(getSize().width / 2, getSize().height / 2, 8);
md.transformed = false;
if (backBuffer != null) {
- if (!backSize.equals(getSize()))
+ if (!backSize.equals(getSize())) {
newBackBuffer();
+ }
backGC.setColor(getBackground());
- backGC.fillRect(0,0,getSize().width,getSize().height);
+ backGC.fillRect(0, 0, getSize().width, getSize().height);
md.paint(backGC);
g.drawImage(backBuffer, 0, 0, this);
+ } else {
+ md.paint(g);
}
- else
- md.paint(g);
setPainted();
} else if (message != null) {
g.drawString("Error in model:", 3, 20);
g.drawString(message, 10, 40);
}
}
+
private synchronized void setPainted() {
painted = true;
notifyAll();
}
- private synchronized void waitPainted()
- {
- while (!painted)
- {
- try
- {
- wait();
- }
- catch (InterruptedException e) {}
- }
- painted = false;
+ @Override
+ public String getAppletInfo() {
+ return "Title: XYZApp \nAuthor: James Gosling \nAn applet to put"
+ + " a Chemical model into a page.";
}
- public String getAppletInfo() {
- return "Title: XYZApp \nAuthor: James Gosling \nAn applet to put a Chemical model into a page.";
- }
-
- public String[][] getParameterInfo() {
- String[][] info = {
- {"model", "path string", "The path to the model to be displayed in .xyz format (see http://chem.leeds.ac.uk/Project/MIME.html). Default is model.obj."},
- {"scale", "float", "Scale factor. Default is 1 (i.e. no scale)."}
- };
- return info;
- }
+ @Override
+ public String[][] getParameterInfo() {
+ String[][] info = {
+ { "model", "path string", "The path to the model to be displayed"
+ + " in .xyz format "
+ + "(see http://chem.leeds.ac.uk/Project/MIME.html)."
+ + " Default is model.obj." },
+ { "scale", "float", "Scale factor. Default is 1 (i.e. no scale)." }
+ };
+ return info;
+ }
} // end class XYZApp
+
class Atom {
+
private static Applet applet;
private static byte[] data;
private final static int R = 40;
@@ -459,7 +501,6 @@
private final static int bgGrey = 192;
private final static int nBalls = 16;
private static int maxr;
-
private int Rl;
private int Gl;
private int Bl;
@@ -475,24 +516,29 @@
int x = X + hx;
int y = Y - R + hy;
int r = (int) (Math.sqrt(x * x + y * y) + 0.5);
- if (r > mr)
+ if (r > mr) {
mr = r;
+ }
data[p++] = r <= 0 ? 1 : (byte) r;
}
}
maxr = mr;
}
+
static void setApplet(Applet app) {
applet = app;
}
+
Atom(int Rl, int Gl, int Bl) {
this.Rl = Rl;
this.Gl = Gl;
this.Bl = Bl;
}
- private final int blend(int fg, int bg, float fgfactor) {
+
+ private int blend(int fg, int bg, float fgfactor) {
return (int) (bg + (fg - bg) * fgfactor);
}
+
private void Setup() {
balls = new Image[nBalls];
byte red[] = new byte[256];
@@ -502,7 +548,7 @@
byte blue[] = new byte[256];
blue[0] = (byte) bgGrey;
for (int r = 0; r < nBalls; r++) {
- float b = (float) (r+1) / nBalls;
+ float b = (float) (r + 1) / nBalls;
for (int i = maxr; i >= 1; --i) {
float d = (float) i / maxr;
red[i] = (byte) blend(blend(Rl, 255, d), bgGrey, b);
@@ -510,11 +556,12 @@
blue[i] = (byte) blend(blend(Bl, 255, d), bgGrey, b);
}
IndexColorModel model = new IndexColorModel(8, maxr + 1,
- red, green, blue, 0);
+ red, green, blue, 0);
balls[r] = applet.createImage(
- new MemoryImageSource(R*2, R*2, model, data, 0, R*2));
+ new MemoryImageSource(R * 2, R * 2, model, data, 0, R * 2));
}
}
+
void paint(Graphics gc, int x, int y, int r) {
Image ba[] = balls;
if (ba == null) {