public class Main {
public static void main
(String[] args
) { VirtualScreen screen = new VirtualScreen(40, 10);
screen.box('+', 3, 0, 20, 9);
screen.line('#', 5, 2, 3, 9);
screen.line('#', 7, 2, 10, 9);
screen.line('#', 9, 1, 9, 3);
screen.line('#', 11, 1, 11, 3);
screen.line('#', 14, 2, 19, 2);
screen.line('#', 18, 2, 19, 9);
screen.line('#', 19, 8, 17, 8);
screen.line('#', 16, 1, 13, 9);
screen.circle('*', 28, 5, 4);
screen.circle('*', 28, 5, 2);
screen.print();
}
}
class VirtualScreen {
protected int width;
protected int height;
VirtualScreen() {
this(80, 25);
}
VirtualScreen(int width, int height) {
this(' ', width, height);
}
VirtualScreen(char ch, int width, int height) {
reset(ch, width, height);
}
public void reset(char ch, int width, int height) {
this.width = width;
this.height = height;
this.
lines = new String[height
]; for (int i = 0; i < height; ++i) {
lines[i] = "";
for (int j = 0; j < width; ++j) {
lines[i] = lines[i] + ch;
}
}
}
public void print() {
for (int y = 0; y < height; ++y) {
}
}
public void setPixel(char ch, int x, int y) {
if (x < 0 || width <= x)
return;
if (y < 0 || height <= y)
return;
lines[y] = str.substring(0, x) + ch + str.substring(x + 1);
}
public void fillBox(char ch, int left, int top, int right, int bottom) {
for (int y = top; y <= bottom; ++y) {
for (int x = left; x <= right; ++x) {
setPixel(ch, x, y);
}
}
}
public void line(char ch, int x0, int y0, int x1, int y1) {
int dx = x1 - x0, dy = y1 - y0;
if (dy < 0) {
for (int y = y1; y < y0; ++y) {
int x = x1 + (y - y1) * dx / dy;
setPixel(ch, x, y);
}
} else if (dy > 0) {
for (int y = y0; y < y1; ++y) {
int x = x0 + (y - y0) * dx / dy;
setPixel(ch, x, y);
}
}
} else {
if (dx < 0) {
for (int x = x1; x < x0; ++x) {
int y = y1 + (x - x1) * dy / dx;
setPixel(ch, x, y);
}
} else if (dx > 0) {
for (int x = x0; x < x1; ++x) {
int y = y0 + (x - x0) * dy / dx;
setPixel(ch, x, y);
}
}
}
}
public void box(char ch, int x0, int y0, int x1, int y1) {
line(ch, x0, y0, x1, y0);
line(ch, x1, y0, x1, y1);
line(ch, x1, y1, x0, y1);
line(ch, x0, y1, x0, y0);
}
public void circle(char ch, int x, int y, double r) {
if (r == 0) {
return;
}
for(double t
= 0; t
< 2 * Math.
PI; t
+= 1 / (2 * Math.
PI * r
)) { double px
= x
+ r
* Math.
cos(t
); double py
= y
+ r
* Math.
sin(t
); setPixel(ch, round(px), round(py));
}
}
protected int round(double d) {
return (int)Math.
round(d
); }
}
CnB1YmxpYyBjbGFzcyBNYWluIHsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBWaXJ0dWFsU2NyZWVuIHNjcmVlbiA9IG5ldyBWaXJ0dWFsU2NyZWVuKDQwLCAxMCk7CgogICAgICAgIHNjcmVlbi5ib3goJysnLCAzLCAwLCAyMCwgOSk7CgogICAgICAgIHNjcmVlbi5saW5lKCcjJywgNSwgMiwgMywgOSk7CiAgICAgICAgc2NyZWVuLmxpbmUoJyMnLCA3LCAyLCAxMCwgOSk7CgogICAgICAgIHNjcmVlbi5saW5lKCcjJywgOSwgMSwgOSwgMyk7CiAgICAgICAgc2NyZWVuLmxpbmUoJyMnLCAxMSwgMSwgMTEsIDMpOwoKICAgICAgICBzY3JlZW4ubGluZSgnIycsIDE0LCAyLCAxOSwgMik7CiAgICAgICAgc2NyZWVuLmxpbmUoJyMnLCAxOCwgMiwgMTksIDkpOwogICAgICAgIHNjcmVlbi5saW5lKCcjJywgMTksIDgsIDE3LCA4KTsKCiAgICAgICAgc2NyZWVuLmxpbmUoJyMnLCAxNiwgMSwgMTMsIDkpOwoKICAgICAgICBzY3JlZW4uY2lyY2xlKCcqJywgMjgsIDUsIDQpOwogICAgICAgIHNjcmVlbi5jaXJjbGUoJyonLCAyOCwgNSwgMik7CgogICAgICAgIHNjcmVlbi5wcmludCgpOwogICAgfQp9CgpjbGFzcyBWaXJ0dWFsU2NyZWVuIHsKICAgIHByb3RlY3RlZCBpbnQgd2lkdGg7CiAgICBwcm90ZWN0ZWQgaW50IGhlaWdodDsKICAgIHByb3RlY3RlZCBTdHJpbmdbXSBsaW5lczsKCiAgICBWaXJ0dWFsU2NyZWVuKCkgewogICAgICAgIHRoaXMoODAsIDI1KTsKICAgIH0KICAgIFZpcnR1YWxTY3JlZW4oaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgdGhpcygnICcsIHdpZHRoLCBoZWlnaHQpOwogICAgfQogICAgVmlydHVhbFNjcmVlbihjaGFyIGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICAgICByZXNldChjaCwgd2lkdGgsIGhlaWdodCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgcmVzZXQoY2hhciBjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOwogICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgIHRoaXMubGluZXMgPSBuZXcgU3RyaW5nW2hlaWdodF07CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgewogICAgICAgICAgICBsaW5lc1tpXSA9ICIiOwogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHdpZHRoOyArK2opIHsKICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gbGluZXNbaV0gKyBjaDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgdm9pZCBwcmludCgpIHsKICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihsaW5lc1t5XSk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldFBpeGVsKGNoYXIgY2gsIGludCB4LCBpbnQgeSkgewogICAgICAgIGlmICh4IDwgMCB8fCB3aWR0aCA8PSB4KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKHkgPCAwIHx8IGhlaWdodCA8PSB5KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgU3RyaW5nIHN0ciA9IGxpbmVzW3ldOwogICAgICAgIGxpbmVzW3ldID0gc3RyLnN1YnN0cmluZygwLCB4KSArIGNoICsgc3RyLnN1YnN0cmluZyh4ICsgMSk7CiAgICB9CgogICAgcHVibGljIHZvaWQgZmlsbEJveChjaGFyIGNoLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7CiAgICAgICAgZm9yIChpbnQgeSA9IHRvcDsgeSA8PSBib3R0b207ICsreSkgewogICAgICAgICAgICBmb3IgKGludCB4ID0gbGVmdDsgeCA8PSByaWdodDsgKyt4KSB7CiAgICAgICAgICAgICAgICBzZXRQaXhlbChjaCwgeCwgeSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHZvaWQgbGluZShjaGFyIGNoLCBpbnQgeDAsIGludCB5MCwgaW50IHgxLCBpbnQgeTEpIHsKICAgICAgICBpbnQgZHggPSB4MSAtIHgwLCBkeSA9IHkxIC0geTA7CiAgICAgICAgaWYgKE1hdGguYWJzKGR4KSA8PSBNYXRoLmFicyhkeSkpIHsKICAgICAgICAgICAgaWYgKGR5IDwgMCkgewogICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IHkxOyB5IDwgeTA7ICsreSkgewogICAgICAgICAgICAgICAgICAgIGludCB4ID0geDEgKyAoeSAtIHkxKSAqIGR4IC8gZHk7CiAgICAgICAgICAgICAgICAgICAgc2V0UGl4ZWwoY2gsIHgsIHkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGR5ID4gMCkgewogICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IHkwOyB5IDwgeTE7ICsreSkgewogICAgICAgICAgICAgICAgICAgIGludCB4ID0geDAgKyAoeSAtIHkwKSAqIGR4IC8gZHk7CiAgICAgICAgICAgICAgICAgICAgc2V0UGl4ZWwoY2gsIHgsIHkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGR4IDwgMCkgewogICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IHgxOyB4IDwgeDA7ICsreCkgewogICAgICAgICAgICAgICAgICAgIGludCB5ID0geTEgKyAoeCAtIHgxKSAqIGR5IC8gZHg7CiAgICAgICAgICAgICAgICAgICAgc2V0UGl4ZWwoY2gsIHgsIHkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGR4ID4gMCkgewogICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IHgwOyB4IDwgeDE7ICsreCkgewogICAgICAgICAgICAgICAgICAgIGludCB5ID0geTAgKyAoeCAtIHgwKSAqIGR5IC8gZHg7CiAgICAgICAgICAgICAgICAgICAgc2V0UGl4ZWwoY2gsIHgsIHkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyB2b2lkIGJveChjaGFyIGNoLCBpbnQgeDAsIGludCB5MCwgaW50IHgxLCBpbnQgeTEpIHsKICAgICAgICBsaW5lKGNoLCB4MCwgeTAsIHgxLCB5MCk7CiAgICAgICAgbGluZShjaCwgeDEsIHkwLCB4MSwgeTEpOwogICAgICAgIGxpbmUoY2gsIHgxLCB5MSwgeDAsIHkxKTsKICAgICAgICBsaW5lKGNoLCB4MCwgeTEsIHgwLCB5MCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgY2lyY2xlKGNoYXIgY2gsIGludCB4LCBpbnQgeSwgZG91YmxlIHIpIHsKICAgICAgICBpZiAociA9PSAwKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yKGRvdWJsZSB0ID0gMDsgdCA8IDIgKiBNYXRoLlBJOyB0ICs9IDEgLyAoMiAqIE1hdGguUEkgKiByKSkgewogICAgICAgICAgICBkb3VibGUgcHggPSB4ICsgciAqIE1hdGguY29zKHQpOwogICAgICAgICAgICBkb3VibGUgcHkgPSB5ICsgciAqIE1hdGguc2luKHQpOwogICAgICAgICAgICBzZXRQaXhlbChjaCwgcm91bmQocHgpLCByb3VuZChweSkpOwogICAgICAgIH0KICAgIH0KCiAgICBwcm90ZWN0ZWQgaW50IHJvdW5kKGRvdWJsZSBkKSB7CiAgICAgICAgcmV0dXJuIChpbnQpTWF0aC5yb3VuZChkKTsKICAgIH0KfQo=