教女朋友Java时,让她做经典的空心菱形输出的题目。忽然想到写个用字符画各种图形的程序让她练习,于是就写了这个程序让她参考。
DrawCharShape.java
public class DrawCharShape


{
public static void main(String[] args)

{
Screen sc=new Screen('.');
DrawShape ds=new DrawShape(sc,0.5);
ds.DrawCircle(new Point(30,18),18);
ds.DrawCircle(new Point(10,10),10);
ds.DrawCircle(new Point(23,15),8);
ds.DrawLine(new Point(0,0),new Point(0,38));
ds.DrawLine(new Point(0,0),new Point(79,0));
ds.DrawLine(new Point(10,10),new Point(70,30));
ds.DrawCircle(new Point(79,0),20);
ds.DrawRect(new Point(10,10),new Point(65,25));
sc.PrintScreen();
}
}
class DrawShape //画图类


{
private Screen screen;
private double linewidth;
public DrawShape(Screen screen)

{
this(screen,1);
}
public DrawShape(Screen screen,double linewidth)

{
this.screen=screen;
this.linewidth=linewidth;
}
public void DrawLine(Point a,Point b)

{
if(b.x==a.x) //如果是竖线,直接画

{
if(a.y>b.y)

{
int temp;
temp=a.y;
a.y=b.y;
b.y=temp;
}
for(int i=a.y;i<b.y;i++)
screen.setPoint(a.x,i);
return;
}
if(b.y==a.y) //如果是横线,直接画

{
if(a.x>b.x)

{
int temp;
temp=a.x;
a.x=b.x;
b.x=temp;
}
for(int i=a.x;i<b.x;i++)
screen.setPoint(i,a.y);
return;
}
//斜线,纵坐标分成小数步长。
double ystep=((double)b.y-a.y)/((double)b.x-a.x);
if(a.x>b.x)

{
Point temp;
temp=a;
a=b;
b=temp;
}
//横坐标以1为单位,纵坐标以小数步长为单位。
for(double i=a.x,j=a.y;i<b.x;i++,j+=ystep)
screen.setPoint((int)i,(int)j);
}
public void DrawCircle(Point o,int r)

{
for(int i=0;i<80;i++)
for(int j=0;j<39;j++)
if(Math.abs(o.getDistanceFrom(new Point(i,j))-r)<this.linewidth) //如果某点与圆心间的距离,与半径之差小于线宽,则把该点点亮以画圆。
screen.setPoint(i,j);
}
public void DrawRect(Point lefttop,Point rightbottom) //画矩形

{
for(int i=lefttop.x;i<=rightbottom.x;i++) //画上下两条边

{
screen.setPoint(i,lefttop.y);
screen.setPoint(i,rightbottom.y);
}
for(int i=lefttop.y;i<=rightbottom.y;i++) //画左右两条边

{
screen.setPoint(lefttop.x,i);
screen.setPoint(rightbottom.x,i);
}
}
}
class Point //点类


{
int x;
int y;
public Point()

{
this(0,0);
}
public Point(int x,int y)

{
this.x=x;
this.y=y;
}
public double getDistanceFrom(Point another) //得到与另一点之间的距离,平面几何中。点与点的距离为:开根((x1-x2)平方+(y1-y2)平方)

{
return Math.sqrt(Math.pow(another.x-this.x,2)+Math.pow(another.y-this.y,2));
}
}
class Screen //虚拟屏幕类


{
private char[][] screen; //屏幕上的点
private char pointchar;
public Screen(char point)

{
this.pointchar=point;
screen=new char[39][80]; //规定,虚拟屏幕上,共有39x80个点。(和Dos屏幕点对点)左上角点为(0,0)
}
public void setPoint(int x,int y) //把屏幕的某一点点亮

{
screen[y][x]=pointchar;
}
public void setPoint(Point p)

{
this.setPoint(p.x,p.y);
}
public void clearPoint(int x,int y) //把屏幕的某一点熄灭

{
screen[y][x]=' ';
}
public void clearPoint(Point p)

{
this.clearPoint(p.x,p.y);
}
public void PrintScreen() //将虚拟屏幕内容输出到Dos控制台屏幕。

{
for(int i=0;i<39;i++)
for(int j=0;j<80;j++)
System.out.print(screen[i][j]);
}
}