📄 drawbufferedparallelogram.java
字号:
// Fig. 2.11_04: DrawBufferedParallelogram.java
// 利用双缓冲绘制立方体
import java.awt.*; // 引入 java.awt包中所有的类
import javax.swing.*; // 引入 javax.swing包中所有的类
public class DrawBufferedParallelogram extends JApplet
{
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; //缺省的立方体轮廓颜色
Image offImage;
Graphics offGraphics;
int appletWidth = 550, appletHeight = 320;
// 初始化绘图缓冲区
public void init()
{
offImage = createImage(appletWidth, appletHeight);
offGraphics = offImage.getGraphics();
}
// 设置整个立方体的轮廓颜色
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 drawParallelogram(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;
}
}
public void paint(Graphics g)
{
// 调用父类的 paint 方法
super.paint(g);
update(g);
} // paint 方法结束
public void update(Graphics g) {
//offGraphics.setColor(getBackground());
//offGraphics.fillRect(0,0,aw,ah);
// 设置字体
offGraphics.setColor(Color.BLACK);
offGraphics.setFont(new Font("汉真广标", Font.PLAIN, 35));
offGraphics.drawString("圆柱体画法", 10, 35);
// 绘制默认立方体
drawParallelogram(FILL, offGraphics);
// 绘制立方体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));
drawParallelogram(FILL, offGraphics);
// 绘制立方体3
setBasePoint(280, 300);
setOutlineColor(Color.ORANGE);
drawParallelogram(OUTLINE, offGraphics);
// 绘制立方体4
setBasePoint(400, 280);
setWidth(120);
setHeight(180);
setThickness(20);
setAngle(30);
setPTopFillColor(Color.GREEN);
setFrontFillColor(Color.MAGENTA);
setPRightFillColor(Color.PINK);
setOutlineColor(Color.BLACK);
drawParallelogram(MIXED, offGraphics);
g.drawImage(offImage, 0, 0, null);
}
} // DrawBufferedParallelogram 类结束
/**************************************************************************
* (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 + -