From: Michael T H. <mic...@us...> - 2003-06-09 17:42:10
|
Update of /cvsroot/jmol/Jmol/src/org/openscience/jmol/render In directory sc8-pr-cvs1:/tmp/cvs-serv32752/src/org/openscience/jmol/render Modified Files: ArrowLine.java BondRenderer.java Log Message: groundwork for triangle filling Index: ArrowLine.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/render/ArrowLine.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- ArrowLine.java 5 Jun 2003 07:19:44 -0000 1.11 +++ ArrowLine.java 9 Jun 2003 17:42:06 -0000 1.12 @@ -87,7 +87,8 @@ public void paint(Graphics25D g25d, DisplayControl control) { - g25d.setColor(control.getColorVector()); + Color color = control.getColorVector(); + g25d.setColor(color); double arrowLengthScale = control.getArrowLengthScale(); double arrowHeadRadius = control.getArrowHeadRadius(); @@ -107,16 +108,16 @@ ); } if (arrowStart) { - paintArrowHead(g25d, 0.0, false, arrowHeadSize, arrowHeadRadius); + paintArrowHead(g25d, color, 0.0, false, arrowHeadSize, arrowHeadRadius); } if (arrowEnd) { - paintArrowHead(g25d, offset + magnitude * arrowLengthScale, true, + paintArrowHead(g25d, color, offset + magnitude * arrowLengthScale, true, arrowHeadSize, arrowHeadRadius); } } - public void paintArrowHead(Graphics25D g25d, double lengthOffset, - boolean forwardArrow, + public void paintArrowHead(Graphics25D g25d, Color color, + double lengthOffset, boolean forwardArrow, double arrowHeadSize, double arrowHeadRadius) { double directionSign = 1.0; @@ -146,7 +147,8 @@ xpoints[3] = (int) (x1 + rx * ctheta - ry * stheta); ypoints[3] = (int) (y1 + rx * stheta + ry * ctheta); - g25d.fillPolygon(xpoints, ypoints, null, 4); + // FIXME mth 2003 06 09 + g25d.fillPolygon4(color, color, xpoints, ypoints, null); } } Index: BondRenderer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/render/BondRenderer.java,v retrieving revision 1.31 retrieving revision 1.32 diff -u -r1.31 -r1.32 --- BondRenderer.java 7 Jun 2003 17:10:11 -0000 1.31 +++ BondRenderer.java 9 Jun 2003 17:42:06 -0000 1.32 @@ -312,32 +312,15 @@ } void polyBond1(byte styleBond, Color color, Color outline) { - g25d.setColor(color); switch(styleBond) { case DisplayControl.BOX: - g25d.drawPolygon(axPoly, ayPoly, azPoly, 4); + g25d.drawPolygon4(color, axPoly, ayPoly, azPoly); break; case DisplayControl.SHADING: - if (width1 > 4) { - boolean firstPass = true; - Color[] shades = getShades(color, Color.black); - int numPasses = calcNumShadeSteps(); - for (int i = numPasses; --i >= 0; ) { - Color shade = shades[i * maxShade / numPasses]; - if (firstPass) { - drawInside(g25d, shade, 2, axPoly, ayPoly, azPoly); - firstPass = false; - } else { - stepPolygon(); - g25d.setColor(shade); - } - g25d.fillPolygon(axPoly, ayPoly, azPoly, 4); - } - break; - } // else fall into QUICKDRAW + g25d.fillCylinder4(color, axPoly, ayPoly, azPoly); + break; case DisplayControl.QUICKDRAW: - g25d.fillPolygon(axPoly, ayPoly, azPoly, 4); - drawInside(g25d, outline, 2, axPoly, ayPoly, azPoly); + g25d.fillPolygon4(outline, color, axPoly, ayPoly, azPoly); break; } } @@ -357,110 +340,6 @@ g25d.fillCircleCentered(outline, color, x, y, z, diameter); } - int offset1, offset2, doffset; - - void drawInside(Graphics25D g25d, Color color, int width, - int[] ax, int[] ay, int[] az) { - // mth dec 2002 - // I am not happy with this implementation, but for now it is the most - // effective kludge I could come up with to deal with the fact that - // the brush is offset to the lower right of the point when drawing - if (color == null) - return; - g25d.setColor(color); - int iNW = 0; - int iNE = 1; - int iSE = 2; - int iSW = 3; - int iT; - boolean top = false; - if (ax[iNE] < ax[iNW]) { - iT = iNE; iNE = iNW; iNW = iT; - iT = iSE; iSE = iSW; iSW = iT; - top = !top; - } - drawInside1(g25d, top, ax[iNW], ay[iNW], az[iNW], - ax[iNE], ay[iNE], az[iNE]); - if (width > 1) - drawInside1(g25d, !top, ax[iSW], ay[iSW], az[iSW], - ax[iSE], ay[iSE], az[iSE]); - } - - private final static boolean applyDrawInsideCorrection = true; - void drawInside1(Graphics25D g25d, boolean top, - int x1, int y1, int z1, int x2, int y2, int z2) { - if (!applyDrawInsideCorrection) { - drawLineInside(g25d, x1, y1, z1, x2, y2, z2); - return; - } - int dx = x2 - x1, dy = y2 - y1; - if (dy >= 0) { - if (dy == 0) { - if (top) { - --x2; - } else { - --y1; --x2; --y2; - } - } else if (3*dy < dx) { - if (top) { - ++y1; --x2; - } else { - --x2; --y2; - } - } else if (dy < dx) { - if (! top) { - --x2; --y2; - } - } else if (dx == 0) { - if (top) { - --x1; --x2; --y2; - } else { - --y2; - } - } else if (3*dx < dy) { - if (top) { - --x1; --x2; --y2; - } else { - --y2; - } - } else if (dx == dy) { - if (top) { - ++y1; --x2; - g25d.drawLine(x1, y1, z1, x2, y2, z2); - --x1; --x2; - } else { - g25d.drawLine(x1+1, y1, z1, x2, y2-1, z2); - --x2; --y2; - } - } - } else { - if (dx == 0) { - if (top) { - --y1; - } else { - --x1; --y1; --x2; - } - } else if (3*dx < -dy) { - if (top) { - --y1; - } else { - --x1; --y1; --x2; - } - } else if (dx > -dy*3) { - if (top){ - --x2; ++y2; - } else { - --y1; --x2; - } - } else if (dx == -dy) { - if (!top) { - --x2; ++y2; - } - } - } - g25d.drawLine(x1, y1, z1, x2, y2, z2); - } - private final static boolean applyLineInsideCorrection = true; void drawLineInside(Graphics25D g25d, @@ -707,95 +586,6 @@ coords[2] = x + (1 - lambda) * dxA + lambda * dxB; coords[3] = y + (1 - lambda) * dyA + lambda * dyB; return 2; - } - - - int pctLight = 50; - - void calcLightPoint(int dxSlope, int dySlope) { - /* - mth - Well, I tried for a while and could not figure it out, - maybe some other day ... or somebody else - - we need to calculate the factor as a percentage of where - the brightest spot on the bond cylinder is located - - I guess that I also need to know the orientation in the - z dimension to be able to calculate this ... maybe that - is my problem - - double mag = Math.sqrt(dxSlope*dxSlope + dySlope*dySlope); - double cos = dxSlope / mag; - double angle = Math.acos(cos); - angle += Math.PI / 4; - factorTop = 50 + (int)(Math.cos(angle) * 40); - System.out.println(" dxSlope="+dxSlope+ - " dySlope="+dySlope+ - " factorTop="+factorTop); - */ - } - - int xL, yL, dxL, dyL; - int dxLTop, dyLTop, dxLBot, dyLBot; - int xR, yR, dxR, dyR; - int dxRTop, dyRTop, dxRBot, dyRBot; - int step, lenMax; - - int calcNumShadeSteps() { - int dxSlope = axPoly[1] - axPoly[0]; - int dySlope = ayPoly[1] - ayPoly[0]; - calcLightPoint(dxSlope, dySlope); - if (dxSlope < 0) dxSlope = -dxSlope; - if (dySlope < 0) dySlope = -dySlope; - - xL = axPoly[0]; yL = ayPoly[0]; - dxL = axPoly[3] - xL; dyL = ayPoly[3] - yL; - int lenL = (int)Math.sqrt(dxL*dxL + dyL*dyL); - int lenLTop = lenL * pctLight / 100; - int lenLBot = lenL - lenLTop; - dxLTop = dxL * pctLight / 100; - dxLBot = dxL - dxLTop; - dyLTop = dyL * pctLight / 100; - dyLBot = dyL - dyLTop; - - xR = axPoly[1]; yR = ayPoly[1]; - dxR = axPoly[2] - xR; dyR = ayPoly[2] - yR; - int lenR = (int)Math.sqrt(dxR*dxR + dyR+dyR); - int lenRTop = lenR * pctLight / 100; - int lenRBot = lenR - lenRTop; - dxRTop = dxR * pctLight / 100; - dxRBot = dxR - dxRTop; - dyRTop = dyR * pctLight / 100; - dyRBot = dyR - dyRTop; - - step = 0; - lenMax = Math.max(Math.max(lenLTop, lenLBot), Math.max(lenRTop, lenRBot)); - if (lenMax < 1) - control.logError("BondRenderer calculation error #3465 :^)"); - return lenMax; - } - - void stepPolygon() { - ++step; - int dxStepLTop = dxLTop * step / lenMax; - int dyStepLTop = dyLTop * step / lenMax; - int dxStepLBot = dxLBot * step / lenMax; - int dyStepLBot = dyLBot * step / lenMax; - - int dxStepRTop = dxRTop * step / lenMax; - int dyStepRTop = dyRTop * step / lenMax; - int dxStepRBot = dxRBot * step / lenMax; - int dyStepRBot = dyRBot * step / lenMax; - - axPoly[0] = xL + dxStepLTop; - ayPoly[0] = yL + dyStepLTop; - axPoly[1] = xR + dxStepRTop; - ayPoly[1] = yR + dyStepRTop; - axPoly[2] = xR + dxR - dxStepRBot; - ayPoly[2] = yR + dyR - dyStepRBot; - axPoly[3] = xL + dxL - dxStepLBot; - ayPoly[3] = yL + dyL - dyStepLBot; } } |