import java.awt.Color;
import java.awt.Graphics;
import java.awt.Polygon;
/**
* 数码管
*/
public class Digital {
// 单个字符的默认宽度
private static final int DEFAULT_WIDTH = 50;
// 单个字符的默认高度
private static final int DEFAULT_HEIGHT = 90;
// 默认背景色
private static final Color DEFAULT_BACKGROUND = Color.BLACK;
// 默认前景色
private static final Color DEFAULT_FOREGROUND = Color.RED;
private static int bits[][];
private static int polygon[][][];
private Color background;
private Color foreground;
private int width;
private int height;
private int gap;
private int offset;
private Polygon polygonArray[] = new Polygon[9];
static {
bits = new int[][] { { '0', 0x03F }, { '1', 0x018 }, { '2', 0x06E }, { '3', 0x07C }, { '4', 0x059 }, { '5', 0x075 }, { '6', 0x077 }, { '7', 0x01C }, { '8', 0x07F }, { '9', 0x07D }, { 'A', 0x05F }, { 'B', 0x073 }, { 'C', 0x027 }, { 'D', 0x07A }, { 'E', 0x067 }, { 'F', 0x047 }, { 'T', 0x184 }, { 'P', 0x04F }, { 'M', 0x19F }, { ':', 0x180 }, { '-', 0x040 }, { -1, 0x0 }, };
int p1[][] = { { 0, 0, 10, 10 }, { 2, 43, 38, 12 } };
int p2[][] = { { 0, 0, 10, 10 }, { 46, 88, 78, 52 } };
int p3[][] = { { 2, 48, 38, 12 }, { 0, 0, 10, 10 } };
int p4[][] = { { 50, 50, 40, 40 }, { 2, 43, 38, 12 } };
int p5[][] = { { 50, 50, 40, 40 }, { 46, 88, 77, 52 } };
int p6[][] = { { 2, 48, 38, 12 }, { 90, 90, 80, 80 } };
int p7[][] = { { 2, 12, 38, 48, 38, 12 }, { 45, 40, 40, 45, 50, 50 } };
int p8[][] = { { 20, 20, 30, 30 }, { 12, 38, 38, 12 } };
int p9[][] = { { 20, 20, 30, 30 }, { 52, 78, 78, 52 } };
polygon = new int[][][] { p1, p2, p3, p4, p5, p6, p7, p8, p9, };
}
/**
* 创建一个数字管的实例。初始化为默认的宽度、高度、前景色、背景色(50,90, red, black)。 其中的宽度为单个字符的宽度。
*/
public Digital() {
this(DEFAULT_WIDTH, DEFAULT_HEIGHT);
}
/**
* 创建一个数字管的实例。初始化为指定的宽度、高度和默认的前景色、背景色 (red, black)。 其中的宽度为单个字符的宽度。
*/
public Digital(int width, int height) {
this(width, height, DEFAULT_FOREGROUND, DEFAULT_BACKGROUND);
}
/**
* 创建一个数字管的实例。初始化为指定的宽度、高度、前景色、背景色。 其中的宽度为单个字符的宽度。
*/
public Digital(int width, int height, Color foreground, Color background) {
this.width = width;
this.height = height;
this.foreground = foreground;
this.background = background;
this.gap = 10;
this.offset = 0;
for (int i = 0; i < polygonArray.length; ++i) {
polygonArray[i] = new Polygon(polygon[i][0], polygon[i][1], polygon[i][0].length);
}
resetRatio();
}
/**
* 在指定位置画一个字符串。
* @param g 图形设备
* @param x 起始 X 坐标
* @param y 起始 X 坐标
* @param str 需要绘制的字符串。
*/
public void draw(Graphics g, int x, int y, String str) {
if (str == null || str.equals("")) {
return;
}
int strCount = str.length();
int strWidth = strCount * width + (strCount - 1) * gap + Math.abs(offset);
int rectX = offset > 0 ? x : x + offset;
Color oldColor = g.getColor();
g.setColor(background);
g.fillRect(rectX, y, strWidth, height);
//
for (int i = 0; i < str.length(); ++i) {
drawChar(g, x, y, str.charAt(i));
x += gap + width;
}
g.setColor(oldColor);
}
/**
* 在指定位置画一个字符。
* @param g 图形设备
* @param x 起始 X 坐标
* @param y 起始 X 坐标
* @param str 需要绘制的字符。
*/
public void drawChar(Graphics g, int x, int y, char ch) {
int bits = getBits(ch);
for (int i = 0; i < 9; ++i) {
if (((bits >> i) & 1) != 0) {
drawPloygon(g, polygonArray[i], x, y);
}
}
}
/**
* 重新设置单个字符的宽度
*/
public void setWidth(int w) {
this.width = w;
resetRatio();
}
/**
* 重新设置单个字符的高度
*/
public void setHeight(int h) {
this.height = h;
resetRatio();
}
/**
* 重新设置前景色
*/
public void setForeground(Color fg) {
foreground = fg;
}
/**
* 重新设置背景色
*/
public void setBackground(Color bg) {
background = bg;
}
/**
* 设置字符的倾斜偏移
*/
public void setOffset(int o) {
this.offset = o;
resetRatio();
}
/**
* 设置字符之间的间隔
*/
public void setGap(int gap) {
this.gap = gap;
}
private void drawPloygon(Graphics g, Polygon p1, int x, int y) {
g.translate(x, y);
g.setColor(foreground);
g.fillPolygon(p1);
g.setColor(background);
g.drawPolygon(p1);
g.translate(-x, -y);
}
private int getBits(char ch) {
if (ch >= 'a' && ch <= 'z') {
ch = (char) ('A' + (ch - 'a'));
}
bits[bits.length - 1][0] = ch;
int i = 0;
while (bits[i][0] != ch) {
++i;
}
return bits[i][1];
}
private void resetRatio() {
double wRatio = (double) width / (double) DEFAULT_WIDTH;
double hRatio = (double) height / (double) DEFAULT_HEIGHT;
double offsetRatio = (double) offset / (double) DEFAULT_HEIGHT;
for (int j = 0; j < polygonArray.length; ++j) {
Polygon p = polygonArray[j];
for (int i = 0; i < p.xpoints.length; ++i) {
p.ypoints[i] = (int) (hRatio * polygon[j][1][i]);
p.xpoints[i] = (int) (wRatio * polygon[j][0][i]) + (int) (offsetRatio * (height - p.ypoints[i]));
}
}
}
}