📄 painterpanel.java
字号:
if(Flag == 1)
x = x + sx;
else y = y + sy;
NError = NError - 2 * dx;
}
if (Flag == 1)
y = y + sy;
else x = x + sx;
NError = NError + 2 * dy;
}
if(display == 1){
PainterOutput.ResultOut("直线Bresenham算法结束");
display = 0;
}
}
public void MidPointCircle(Graphics g){
int radius = (int)Math.sqrt((Math.pow(point[1].getX() - point[0].getX(), 2) +
Math.pow(point[1].getY() - point[0].getY(), 2) ) );
radius = radius / tranScale;
if(display == 1) PainterOutput.ResultOut("圆的中点算法:");
if(display == 1) PainterOutput.ResultOut("");
int x = 0;
int y = radius;
int d = 1 - radius;
int dt = 3;
int db = - 2 * radius + 5;
while(y>=x){
if(display == 1) PainterOutput.ResultOut("以点(" + x + "," + y + ")生成");
drawCirclePoint(g, x, y);
if(d<0){
d += dt;
dt += 2;
db += 2;
}
else{
d += db;
dt += 2;
db += 4;
y --;
}
x ++;
}
if(display == 1){
PainterOutput.ResultOut("圆的中点算法结束");
display = 0;
}
}
public void BresenhamCircle(Graphics g){
int radius = (int)Math.sqrt((Math.pow(point[1].getX() - point[0].getX(), 2) +
Math.pow(point[1].getY() - point[0].getY(), 2) ) );
radius = radius / tranScale;
if(display == 1) PainterOutput.ResultOut("圆的Bresenham算法:");
int x = 0;
int y = radius;
int d = 3 - 2 * radius;
while(x<=y){
if(display == 1) PainterOutput.ResultOut("以点(" + x + "," + y + ")生成");
drawCirclePoint(g, x, y);
if(d<=0)
d += 4 * x + 6;
else{
d += 4 * (x - y) + 10;
y = y - 1;
}
x = x + 1;
}
if(display == 1){
PainterOutput.ResultOut("圆的Bresenham算法结束");
display = 0;
}
}
public void MidPointEllipse(Graphics g, int px, int py, int width, int height){
int a = (int) (getRound((double)width / tranScale) / 2);
int b = (int) (getRound((double)height / tranScale) / 2);
int x = 0;
int y = b;
if(display == 1) PainterOutput.ResultOut("椭圆的中点算法:");
double d = b * b - a * a * (b - 0.25);
if(display == 1) PainterOutput.ResultOut("以首点(" + x + "," + y + ")生成");
drawEcllipsePoint(g, x, y);
while(a * a * (y - 0.5) > b * b * (x + 1)){
if(d<0)
d += b * b * (2 * x + 3);
else{
d += b * b * (2 * x + 3) + a * a * ( -2 * y + 2);
y --;
}
x++;
if(display == 1) PainterOutput.ResultOut("以点(" + x + "," + y + ")生成");
drawEcllipsePoint(g, x, y);
}
d = b * b * (x + 0.5) * (x + 0.5) + a * a * (y - 1) * (y - 1) - a * a * b * b;
while(y>=0){
if(d<0){
d += b * b * (2 * x + 2) + a * a * (-2 * y + 3);
x ++;
}
else
d += a * a * (-2 * y + 3);
y --;
if(display == 1) PainterOutput.ResultOut("以点(" + x + "," + y + ")生成");
drawEcllipsePoint(g, x, y);
}
if(display == 1){
PainterOutput.ResultOut("椭圆的中点算法结束");
display = 0;
}
}
public void drawEcllipsePoint(Graphics g, int x, int y){
Point centre = new Point((point[0].x + point[1].x)/2, (point[0].y + point[1].y)/2);
int shiftX = ((int) getRound(getNewX(centre))) * tranScale;
int shiftY = ((int) getRound(getNewY(centre))) * tranScale;
int outputx, outputy;
if(display == 1){
outputx = x + getRound(getNewX(centre));
outputy = y - getRound(getNewY(centre));
PainterOutput.ResultOut(outputx + "," + outputy);
}
Point temp = getOldPoint(x, y);
temp.x += shiftX;
temp.y += shiftY;
drawPixel(g, temp, 8.0F);
if(display == 1){
outputx = -x + getRound(getNewX(centre));
outputy = y - getRound(getNewY(centre));
PainterOutput.ResultOut(outputx + "," + outputy);
}
temp = getOldPoint(-x, y);
temp.x += shiftX;
temp.y += shiftY;
drawPixel(g, temp, 8.0F);
if(display == 1){
outputx = x + getRound(getNewX(centre));
outputy = -y - getRound(getNewY(centre));
PainterOutput.ResultOut(outputx + "," + outputy);
}
temp = getOldPoint(x, -y);
temp.x += shiftX;
temp.y += shiftY;
drawPixel(g, temp, 8.0F);
if(display == 1){
outputx = -x + getRound(getNewX(centre));
outputy = -y - getRound(getNewY(centre));
PainterOutput.ResultOut(outputx + "," + outputy);
}
temp = getOldPoint(-x, -y);
temp.x += shiftX;
temp.y += shiftY;
drawPixel(g, temp, 8.0F);
}
public void drawCirclePoint(Graphics g, int x, int y){
int shiftX = ((int) getRound(getNewX(point[0]))) * tranScale;
int shiftY = ((int) getRound(getNewY(point[0]))) * tranScale;
int outputx, outputy;
if(display == 1){
outputx = x + getRound(getNewX(point[0]));
outputy = y - getRound(getNewY(point[0]));
PainterOutput.ResultOut(outputx + "," + outputy);
}
Point temp = getOldPoint(x, y);
temp.x += shiftX;
temp.y += shiftY;
drawPixel(g, temp, 8.0F);
if(display == 1){
outputx = y + getRound(getNewX(point[0]));
outputy = x - getRound(getNewY(point[0]));
PainterOutput.ResultOut(outputx + "," + outputy);
}
temp = getOldPoint(y, x);
temp.x += shiftX;
temp.y += shiftY;
drawPixel(g, temp, 8.0F);
if(display == 1){
outputx = y + getRound(getNewX(point[0]));
outputy = -x - getRound(getNewY(point[0]));
PainterOutput.ResultOut(outputx + "," + outputy);
}
temp = getOldPoint(y, -x);
temp.x += shiftX;
temp.y += shiftY;
drawPixel(g, temp, 8.0F);
if(display == 1){
outputx = x + getRound(getNewX(point[0]));
outputy = -y - getRound(getNewY(point[0]));
PainterOutput.ResultOut(outputx + "," + outputy);
}
temp = getOldPoint(x, -y);
temp.x += shiftX;
temp.y += shiftY;
drawPixel(g, temp, 8.0F);
if(display == 1){
outputx = -x + getRound(getNewX(point[0]));
outputy = -y - getRound(getNewY(point[0]));
PainterOutput.ResultOut(outputx + "," + outputy);
}
temp = getOldPoint(-x, -y);
temp.x += shiftX;
temp.y += shiftY;
drawPixel(g, temp, 8.0F);
if(display == 1){
outputx = -y + getRound(getNewX(point[0]));
outputy = -x - getRound(getNewY(point[0]));
PainterOutput.ResultOut(outputx + "," + outputy);
}
temp = getOldPoint(-y, -x);
temp.x += shiftX;
temp.y += shiftY;
drawPixel(g, temp, 8.0F);
if(display == 1){
outputx = -y + getRound(getNewX(point[0]));
outputy = x - getRound(getNewY(point[0]));
PainterOutput.ResultOut(outputx + "," + outputy);
}
temp = getOldPoint(-y, x);
temp.x += shiftX;
temp.y += shiftY;
drawPixel(g, temp, 8.0F);
if(display == 1){
outputx = -x + getRound(getNewX(point[0]));
outputy = y - getRound(getNewY(point[0]));
PainterOutput.ResultOut(outputx + "," + outputy);
}
temp = getOldPoint(-x, y);
temp.x += shiftX;
temp.y += shiftY;
drawPixel(g, temp, 8.0F);
}
public int getRound(double dSource){
int iRound;
//BigDecimal的构造函数参数类型是double
BigDecimal deSource = new BigDecimal(dSource);
//deSource.setScale(0,BigDecimal.ROUND_HALF_UP) 返回值类型 BigDecimal
//intValue() 方法将BigDecimal转化为int
iRound= deSource.setScale(0,BigDecimal.ROUND_HALF_UP).intValue();
return iRound;
}
public void drawShape(int shape){
this.shape=shape;
point[0].x = -1;
point[0].y = -1;
point[1].x = -1;
point[1].y = -1;
if(shape == 1)
JOptionPane.showMessageDialog(null,
"实现的Bresenham算法中, 终点需要在起点的右下方", "注意", JOptionPane.INFORMATION_MESSAGE);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -