公共靜態void main(String[] args){
五角星筆=新五角星(10,0,' ','★');
draw . print canvas(pen . get pentagram());
}
}//Pentagram.java五角星
類五角星形{
私有final char FILL _ CHAR//填充字符
私有final char SPACE _ CHAR//中性字符
私有final int R;//五角星外接圓的半徑
私人最終浮動輪換;//五角星逆時針旋轉的角度
private final int X;//用於生成繪圖數組。
私人最終int Y;//用於生成繪圖數組/* *
*構建壹個五角星形對象
*
* @param半徑
*五角星的半徑
* @param旋轉
*五角星的逆時針旋轉角度
* @param spaceChar
*用字符填充畫布上的空白區域。
* @param fillChar
*畫布上的線條充滿了字符。
*/
公共五角星形(int radius,float rotation,char spaceChar,char fillChar) {
這個。R =半徑;
這個。旋轉=旋轉;
這個。FILL _ CHAR = fillChar
這個。SPACE _ CHAR = spaceChar
這個。x = 2 * R+1;
這個。y = 2 * R+1;
} public char[][] getPentagram() {
char[][]canvas = init canvas();
Draw Draw = new Draw(FILL _ CHAR);
//設五角星最右邊的點為A,逆時針選擇點B~E。
//通過圓的極坐標公式,可以得出:
//獲取以下點的坐標
// A點坐標(0.951R,0.309R)
// B點坐標(0,R)
// C點坐標(-0.951R,0.309R)
// D點坐標(-0.588R,-0.809R)
// E點坐標(0.588R,-0.809R)
//畫壹條線段CA
draw . drawline(mcos(162)* R,msin(162) * R,mcos(18) * R,msin(18) * R,
畫布);
//畫壹條線段DA
draw.drawLine(mcos(234) * R,msin(234) * R,mcos(18) * R,msin(18) * R,
畫布);
//畫壹條線段CE
draw . drawline(mcos(162)* R,msin(162) * R,mcos(306) * R,msin(306)
* R,畫布);
//畫壹條線段DB
draw.drawLine(mcos(234) * R,msin(234) * R,mcos(90) * R,msin(90) * R,
畫布);
//畫壹條線段BE
draw.drawLine(mcos(90) * R,msin(90) * R,mcos(306) * R,msin(306) * R,
畫布);
返回畫布;
}//指定兩點在方形字符數組中畫線。
//初始化圖形數組並填空。
private char[][] initCanvas() {
char[][]canvas = new char[Y][X];
for(int I = 0;我& lty;i++) {
for(int j = 0;j & ltx;j++) {
canvas[I][j]= SPACE _ CHAR;
}
}
返回畫布;
}//根據角度求正弦值,保留兩位小數。
私有雙精度msin(浮點a) {
return((int)(math . sin(math . tora dians(a+ROTATION))* 100))/100.0;
}//根據角度求余弦值,保留兩位小數。
私有雙mco(浮動a) {
return((int)(math . cos(math . tora dians(a+ROTATION))* 100))/100.0;
}
}//Draw.java繪圖工具類
班級抽簽{
private char fillChar公共抽獎(char fillChar) {
this . fill char = fill char;
} /**
*根據兩個點在二維字符數組上畫壹條線。
*
* @param x1
* @param y1
* @param x2
* @param y2
* @param畫布
*/
公共無效繪制線(雙x1,雙y1,雙x2,雙y2,
char[][] canvas) {
int radius =(canvas . length-1)/2;
//從X方向填充
if(x 1 & gt;x2) {
雙t = x 1;
x 1 = x2;
x2 = t;
t = y 1;
y 1 = y2;
y2 = t;
}
//獲得線性方程的兩個系數
雙a =(y 1-y2)/(x 1-x2);
雙b = y 1-a * x 1;
//根據X方向的值求Y值,填圖。
for(int I =(int)math . round(x 1);我& lt=(int)math . round(x2);i++) {
//根據線性方程y = ax+b,求y。
int y =(int)math . round(a* I+b);
//因為y和I計算的結果可能是負數,
//為了使用數組表示坐標,進行了以下轉換。
// c[R][R]是坐標原點。
//c [r] [0...r]是X方向的負半軸。
//c [r] [r+1...2 * r]是X方向的正半軸。
// c[0..R][R]是Y方向的正半軸。
//C [R+1...2 * R] [R]是Y方向的負半軸。
int YY = radius-y;
int xx = radius+I;
yy = yy & lt0 ?0:YY;
yy = yy & gt2 *半徑?2 *半徑:YY;
xx = xx & lt0 ?0:xx;
xx = xx & gt2 *半徑?2 *半徑:xx;
canvas[YY][xx]= fill char;
}
//從Y方向填充,方便減少間距問題造成的字符間隙。
if(y 1 & gt;y2) {
雙t = x 1;
x 1 = x2;
x2 = t;
t = y 1;
y 1 = y2;
y2 = t;
}
//根據Y方向的值求X值,填圖。
for(int I =(int)math . round(y 1);我& lt=(int)math . round(y2);i++) {
//根據x = (y-b)/a,求x。
int y =(int)math . round((I-b)/a);
int YY = radius-I;
int xx =半徑+y;
yy = yy & lt0 ?0:YY;
yy = yy & gt2 *半徑?2 *半徑:YY;
xx = xx & lt0 ?0:xx;
xx = xx & gt2 *半徑?2 *半徑:xx;
canvas[YY][xx]= fill char;
}
} /**
*將繪圖後的畫布輸出到控制臺。
*
* @param畫布
*/
public static void print canvas(char[][]canvas){
for(int I = 0;我& lt畫布.長度;i++) {
for(int j = 0;j & lt畫布[i]。長度;j++) {
system . out . print(canvas[I][j]);
}
system . out . println();
}
}
}