📄 drawcube.jsp
字号:
<!--
Fig. 6.04_08: drawCube.jsp
功能:绘制立方体
-->
<%@ page language="java" contentType="image/png;charset=GB2312"
import="java.awt.image.*"
import="java.awt.*"
import="javax.imageio.*"
%>
<%!
int baseXPts = 10, baseYPts = 200; // 缺省的立方体基准点坐标
int width = 100; // 缺省的立方体的宽度
int height = 120; // 缺省的立方体的高度
int thickness = 30; // 缺省的立方体的厚度
int alpha = 45; // 缺省的平行四边形的夹角
int offsetX = 0; // 偏移量X
int offsetY = 0; // 偏移量Y
final int PARALLELOGRAM_POINT_NUMBER = 4; // 平行四边形的端点数目
// 顶部平行四边形端点的X坐标数组
int[] pTopX = new int[PARALLELOGRAM_POINT_NUMBER];
// 顶部平行四边形端点的Y坐标数组
int[] pTopY = new int[PARALLELOGRAM_POINT_NUMBER];
// 右侧面平行四边形端点的X坐标数组
int[] pRightX = new int[PARALLELOGRAM_POINT_NUMBER];
// 右侧面平行四边形端点的Y坐标数组
int[] pRightY = new int[PARALLELOGRAM_POINT_NUMBER];
// 立方体的方向
//final int UP = 1, RIGHT = 2, DOWN = 3, LEFT = 4;
// 立方体的绘制风格
final int OUTLINE = 1, FILL = 2, MIXED = 3;
Color rFrontFillColor = new Color(178, 0, 0); // 缺省的填充颜色
Color pTopFillColor = Color.RED; // 缺省的填充颜色
Color pRightFillColor = new Color(124, 0, 0); // 缺省的填充颜色
Color outlineColor = Color.LIGHT_GRAY; //缺省的立方体轮廓颜色
// 设置整个立方体的轮廓颜色
public void setOutlineColor(Color outlineColor)
{
this.outlineColor = outlineColor;
}
// 设置正面实心矩形的填充颜色
public void setFrontFillColor(Color rFrontFillColor)
{
this.rFrontFillColor = rFrontFillColor;
}
// 设置顶部实心平行四边形的填充颜色
public void setPTopFillColor(Color pTopFillColor)
{
this.pTopFillColor = pTopFillColor;
}
// 设置右侧面实心平行四边形的填充颜色
public void setPRightFillColor(Color pRightFillColor)
{
this.pRightFillColor = pRightFillColor;
}
// 设置基准点的坐标
public void setBasePoint(int baseXPts, int baseYPts)
{
this.baseXPts = baseXPts;
this.baseYPts = baseYPts;
}
// 设置立方体的宽度
public void setWidth(int width)
{
this.width = width;
}
// 设置立方体的高度
public void setHeight(int height)
{
this.height = height;
}
// 设置立方体的厚度
public void setThickness(int thickness)
{
this.thickness = thickness;
}
// 设置平行四边形的夹角alpha
public void setAngle(int alpha)
{
this.alpha = alpha;
}
// 计算offsetX和offsetY的值
public void calculateOffset()
{
offsetX = (int)(Math.cos(alpha * Math.PI / 180) * thickness + 0.5);
offsetY = (int)(Math.sin(alpha * Math.PI / 180) * thickness + 0.5);
}
// 设置绘制正面矩形所需的数据
public void buildRFront()
{
pRightX[0] = baseXPts + width;
pRightY[0] = baseYPts;
pRightX[1] = pRightX[0];
pRightY[1] = baseYPts - height;
pTopX[0] = baseXPts;
pTopY[0] = pRightY[1];
}
// 设置绘制顶部平行四边形所需的数据
public void buildPTop()
{
pTopX[1] = pRightX[1];
pTopY[1] = pRightY[1];
pTopX[2] = pTopX[1] + offsetX;
pTopY[2] = pTopY[1] - offsetY;
pTopX[3] = pTopX[0] + offsetX;
pTopY[3] = pTopY[2];
}
// 设置绘制右侧面平行四边形所需的数据
public void buildPRight()
{
pRightX[2] = pTopX[2];
pRightY[2] = pTopY[2];
pRightX[3] = pRightX[2];
pRightY[3] = pRightY[2] + height;
}
// 绘制立方体
public void drawCube(int cubeStyle, Graphics g)
{
calculateOffset();
buildRFront();
buildPTop();
buildPRight();
switch (cubeStyle)
{
case 1:
g.setColor(outlineColor);
g.drawPolygon(pTopX, pTopY, PARALLELOGRAM_POINT_NUMBER);
g.drawRect(pTopX[0], pTopY[0], width, height);
g.drawPolygon(pRightX, pRightY, PARALLELOGRAM_POINT_NUMBER);
break;
case 2:
g.setColor(pTopFillColor);
g.fillPolygon(pTopX, pTopY, PARALLELOGRAM_POINT_NUMBER);
g.setColor(rFrontFillColor);
g.fillRect(pTopX[0], pTopY[0], width, height);
g.setColor(pRightFillColor);
g.fillPolygon(pRightX, pRightY, PARALLELOGRAM_POINT_NUMBER);
break;
case 3:
g.setColor(pTopFillColor);
g.fillPolygon(pTopX, pTopY, PARALLELOGRAM_POINT_NUMBER);
g.setColor(rFrontFillColor);
g.fillRect(pTopX[0], pTopY[0], width, height);
g.setColor(pRightFillColor);
g.fillPolygon(pRightX, pRightY, PARALLELOGRAM_POINT_NUMBER);
g.setColor(outlineColor);
g.drawPolygon(pTopX, pTopY, PARALLELOGRAM_POINT_NUMBER);
g.drawRect(pTopX[0], pTopY[0], width, height);
g.drawPolygon(pRightX, pRightY, PARALLELOGRAM_POINT_NUMBER);
break;
}
}
%>
<%
// 清空缓冲区
response.reset();
// 注意这里的MIME类型
response.setContentType("image/png");
// 创建一个 640X480 的图像
int width = 640, height = 480;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
// 填充背景
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
g.setColor(Color.BLACK);
// 设置字体
g.setFont(new Font("汉真广标", Font.PLAIN, 35));
g.drawString("立方体的画法", 10, 35);
// 绘制默认立方体
drawCube(FILL, g);
// 绘制立方体2
setBasePoint(150, 300);
setWidth(80);
setHeight(220);
setThickness(40);
setAngle(60);
setPTopFillColor(new Color(0, 0, 255));
setFrontFillColor(new Color(0, 0, 178));
setPRightFillColor(new Color(0, 0, 124));
drawCube(FILL, g);
// 绘制立方体3
setBasePoint(280, 300);
setOutlineColor(Color.ORANGE);
drawCube(OUTLINE, g);
// 绘制立方体4
setBasePoint(400, 280);
setWidth(120);
setHeight(180);
setThickness(20);
setAngle(30);
setPTopFillColor(Color.GREEN);
setFrontFillColor(Color.MAGENTA);
setPRightFillColor(Color.PINK);
setOutlineColor(Color.BLACK);
drawCube(MIXED, g);
// 部署图形
g.dispose();
// 利用ImageIO类的write方法对图像进行编码
ServletOutputStream sos = response.getOutputStream();
ImageIO.write(image, "PNG", sos);
sos.close();
%>
<%
/**************************************************************************
* (C) Copyright 2004-2005 by Jingkui Zhong(钟京馗) and Huan Tang(唐桓). *
* All Rights Reserved. *
* *
* DISCLAIMER: The authors of this code have used their *
* best efforts in preparing the code. These efforts include the *
* development, research, and testing of the theories and programs *
* to determine their effectiveness. The authors and publisher make *
* no warranty of any kind, expressed or implied, with regard to these *
* programs or to the documentation contained in these codes. The authors *
* shall not be liable in any event for incidental or consequential *
* damages in connection with, or arising out of, the furnishing, *
* performance, or use of these programs. *
**************************************************************************/
%>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -