如何用JAVA画一个菱形 RT 各位可否赐教一下编程的思路 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 此回复为自动发出,仅用于显示而已,并无任何其他特殊作用楼主【jckzhang】截止到2008-07-05 09:46:29的历史汇总数据(不包括此帖):发帖的总数量:8 发帖的总分数:120 结贴的总数量:4 结贴的总分数:40 无满意结贴数:2 无满意结贴分:40 未结的帖子数:4 未结的总分数:80 结贴的百分比:50.00 % 结分的百分比:33.33 % 无满意结贴率:50.00 % 无满意结分率:100.00% 楼主加油 回去看一下awt或swing 的draw类吧... 找到这样一段代码,各位可否解释一下,一点都看不懂class a2{public static void main(String args[]){ int N=5; int i=1,j,k,m; for(m=1;m<=2*N-1;m++) { for(j=1;j<=Math.abs(N-i);j++) System.out.print(' '); k=N-Math.abs(N-i); for(j=1;j<=2*k-1;j++) System.out.print('*'); System.out.println(); i++; }}} 代码class a2{ public static void main(String args[]) { int N=5; int i=1,j,k,m; for(m=1;m <=2*N-1;m++) { for(j=1;j <=Math.abs(N-i);j++) System.out.print(' '); k=N-Math.abs(N-i); for(j=1;j <=2*k-1;j++) System.out.print('*'); System.out.println(); i++; } } } 界面实现方法是新建一个Canvas类..然后在canvas上画图..调用Graphics中方法..你看下draw...至于如何实现哪就是算法的问题了. public class Test { public static void main(String[] args) { printDiamond(7, true); System.out.println(); printDiamond(7, false); } /** * 输出菱形 * @param line 菱形的行数 * @param isSolid 是否为实心 */ private static void printDiamond(int line, boolean isSolid) { line = line % 2 == 0 ? line + 1 : line; for(int k = line / 2, i = -k; i <= k; i++) { for(int j = -k, m = k - Math.abs(i); j <= m; j++) { boolean b; if(isSolid) { b = Math.abs(j) + Math.abs(i) > k; } else { b = Math.abs(j) + Math.abs(i) != k; } System.out.print(b ? " " : "*"); } System.out.println(); } }}分析如下:菱形是一个上下、左右对称的图形,行列可以按照下面的方式来进行循环 j= -3 -2 -1 0 1 2 3i= +---+---+---+---+-3 | | | | * | +---+---+---+---+---+-2 | | | * | * | * | +---+---+---+---+---+---+-1 | | * | * | * | * | * | +---+---+---+---+---+---+---+ 0 | * | * | * | * | * | * | * | +---+---+---+---+---+---+---+ 1 | | * | * | * | * | * | +---+---+---+---+---+---+ 2 | | | * | * | * | +---+---+---+---+---+ 3 | | | | * | +---+---+---+---+行数为 7,则 7/2 = 3,这个数值很有用处,暂且称为 K。i 和 j 的循环起始均为 -K,而 i 的终止循环为 K,j 的终止循环条件理应为 K,注意右边,我特意把它挖空了,因为右边的都是空格,为了优化程序就没有必要输出了,这样 j 的循环终止条件与 i 是有密切关系的,为 K - Math.abs(i),即:当 i = -1 时,K - Math.abs(i) = 2,因此 j 只要从 -3 循环到 2 就可以了。再看看 * 位置上的规律,注意最左边的 *,在 Math.abs(i) + Math.abs(j) > K 时输出的是空格,小于等于 K 时,输出的是 *。在 i = -2, j = -2 坐标上,Math.abs(i) + Math.abs(j) = 4,4 是大于 K 的,因此输出空格若 i = -2, j = -1 坐标上,Math.abs(i) + Math.abs(j) = 3,3 是不大于 K 的,因此输出 *如果需要的是空心菱心,只要把判断条件设为 Math.abs(i) + Math.abs(j) == K 时才输出 *,否则输出空格。因此,这样我们就利用于图形的对称性完成了菱形的输出。 个人觉得火龙果非常的诚恳非常的细致非常的大气,火龙果回答过我的那个打印图形的问题。真的让我耳目一新,图形还可以这么来打印啊!用自己的语言来说就是:函数在矩阵中的隐性应用,当然我那天的那个图形打印是一次函数在矩阵中的隐性应用啦!函数在矩阵中的隐性应用这种方法,我们再来看看这个哥们儿的菱形打印就变得非常的简单明了了。代码最有说服力public class Graphics4 { public static void main(String[] args) { printDiamond(10); } public static void printDiamond(int line) { line = (line % 2 == 0 ? line + 1 : line); System.out.println(line); int k = line / 2 + 1; for (int i = -k; i <= k; i++) { int a = Math.abs(i); for (int j = -k; j <= k; j++) { int b = Math.abs(j); System.out.print((a == k || b == k || a + b < k) ? "* ": " "); //(a+b)与k的关系的变化,可以演变出很多不同的形式 } System.out.println(); } }}结果:11* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *如果要去掉边框,只需把System.out.print((a == k || b == k || a + b < k) ? "* ": " ");中的 a == k || b == k || 去掉。看看去掉边框的结果吧: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 改变菱形的形状:1.可以修改i、j 的上限值,本次是k 2.可以改变 a + b < k中a、b的系数说白了,就是对一个一次函数的ax+by+c=0的修改,从而改变在四个象限的形状(注:x、y取整数)。如果加上一些什么二次函数、特殊函数,那么我们可以搞出很奇妙的图形来哦!试试吧!说这么多,其实只有一个:学习方式。了解了背后才会游刃有余,变幻无穷。就像真正的真理是简单的,是不会难为人的,如果一个东西你觉得很难,那么多半是你还没有更深入,安静下来慢慢研究一下,为自己喝彩!哎,不就是一个图形打印嘛!说了这么多,是不是太自作多情了。拍砖吧!O(∩_∩)O哈哈~ 请教老蒙语如何在java程序中树排并从右向左显示? 关于getactioncommand的用法 如何把Java程序封装成Windws 服务? 弹出对话框 public static void main(String args[]) 里有点不解 测试Timer、TimerTask 类 【求助】关于数组的问题 在JApplet 中提示这个,是什么错误? 请教一条要输出00,这样的字符串应该怎么写??谢谢 这种程序也敢出错,唉………,各位帮看看吧 为什么我用java socket来连接每次都要4到5秒的时间啊 请教Quartz的未触发指令的几个调度策略的具体意思是什么?帮忙解释一下,谢谢!
楼主【jckzhang】截止到2008-07-05 09:46:29的历史汇总数据(不包括此帖):
发帖的总数量:8 发帖的总分数:120
结贴的总数量:4 结贴的总分数:40
无满意结贴数:2 无满意结贴分:40
未结的帖子数:4 未结的总分数:80
结贴的百分比:50.00 % 结分的百分比:33.33 %
无满意结贴率:50.00 % 无满意结分率:100.00%
楼主加油
class a2{
public static void main(String args[])
{
int N=5;
int i=1,j,k,m;
for(m=1;m<=2*N-1;m++)
{
for(j=1;j<=Math.abs(N-i);j++)
System.out.print(' ');
k=N-Math.abs(N-i);
for(j=1;j<=2*k-1;j++)
System.out.print('*');
System.out.println();
i++;
}
}
}
class a2
{
public static void main(String args[])
{
int N=5;
int i=1,j,k,m;
for(m=1;m <=2*N-1;m++)
{
for(j=1;j <=Math.abs(N-i);j++)
System.out.print(' ');
k=N-Math.abs(N-i);
for(j=1;j <=2*k-1;j++)
System.out.print('*');
System.out.println();
i++;
}
}
}
printDiamond(7, true);
System.out.println();
printDiamond(7, false);
} /**
* 输出菱形
* @param line 菱形的行数
* @param isSolid 是否为实心
*/
private static void printDiamond(int line, boolean isSolid) {
line = line % 2 == 0 ? line + 1 : line;
for(int k = line / 2, i = -k; i <= k; i++) {
for(int j = -k, m = k - Math.abs(i); j <= m; j++) {
boolean b;
if(isSolid) {
b = Math.abs(j) + Math.abs(i) > k;
} else {
b = Math.abs(j) + Math.abs(i) != k;
}
System.out.print(b ? " " : "*");
}
System.out.println();
}
}
}分析如下:菱形是一个上下、左右对称的图形,行列可以按照下面的方式来进行循环
j=
-3 -2 -1 0 1 2 3
i= +---+---+---+---+
-3 | | | | * |
+---+---+---+---+---+
-2 | | | * | * | * |
+---+---+---+---+---+---+
-1 | | * | * | * | * | * |
+---+---+---+---+---+---+---+
0 | * | * | * | * | * | * | * |
+---+---+---+---+---+---+---+
1 | | * | * | * | * | * |
+---+---+---+---+---+---+
2 | | | * | * | * |
+---+---+---+---+---+
3 | | | | * |
+---+---+---+---+行数为 7,则 7/2 = 3,这个数值很有用处,暂且称为 K。i 和 j 的循环起始均为 -K,而 i 的终止循环为 K,j 的终止循环条件理应为 K,
注意右边,我特意把它挖空了,因为右边的都是空格,为了优化程序就没有必要输
出了,这样 j 的循环终止条件与 i 是有密切关系的,为 K - Math.abs(i),即:
当 i = -1 时,K - Math.abs(i) = 2,因此 j 只要从 -3 循环到 2 就可以了。再看看 * 位置上的规律,注意最左边的 *,在 Math.abs(i) + Math.abs(j) > K 时
输出的是空格,小于等于 K 时,输出的是 *。在 i = -2, j = -2 坐标上,Math.abs(i) + Math.abs(j) = 4,4 是大于 K 的,因此输出空格
若 i = -2, j = -1 坐标上,Math.abs(i) + Math.abs(j) = 3,3 是不大于 K 的,因此输出 *如果需要的是空心菱心,只要把判断条件设为 Math.abs(i) + Math.abs(j) == K 时
才输出 *,否则输出空格。因此,这样我们就利用于图形的对称性完成了菱形的输出。
个人觉得火龙果非常的诚恳非常的细致非常的大气,火龙果回答过我的那个打印图形的问题。真的让我耳目一新,图形还可以这么来打印啊!
用自己的语言来说就是:函数在矩阵中的隐性应用,当然我那天的那个图形打印是一次函数在矩阵中的隐性应用啦!
函数在矩阵中的隐性应用这种方法,我们再来看看这个哥们儿的菱形打印就变得非常的简单明了了。
代码最有说服力public class Graphics4 {
public static void main(String[] args) {
printDiamond(10);
} public static void printDiamond(int line) {
line = (line % 2 == 0 ? line + 1 : line);
System.out.println(line);
int k = line / 2 + 1;
for (int i = -k; i <= k; i++) {
int a = Math.abs(i);
for (int j = -k; j <= k; j++) {
int b = Math.abs(j);
System.out.print((a == k || b == k || a + b < k) ? "* ": " ");
//(a+b)与k的关系的变化,可以演变出很多不同的形式
}
System.out.println();
}
}
}结果:
11
* * * * * * * * * * * * *
* * *
* * * * *
* * * * * * *
* * * * * * * * *
* * * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * *
* * * * * * * * *
* * * * * * *
* * * * *
* * *
* * * * * * * * * * * * *
如果要去掉边框,只需把System.out.print((a == k || b == k || a + b < k) ? "* ": " ");中的 a == k || b == k || 去掉。
看看去掉边框的结果吧:
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
* * * * * * * * * * *
* * * * * * * * *
* * * * * * *
* * * * *
* * *
*
改变菱形的形状:
1.可以修改i、j 的上限值,本次是k
2.可以改变 a + b < k中a、b的系数
说白了,就是对一个一次函数的ax+by+c=0的修改,从而改变在四个象限的形状(注:x、y取整数)。
如果加上一些什么二次函数、特殊函数,那么我们可以搞出很奇妙的图形来哦!
试试吧!
说这么多,其实只有一个:学习方式。了解了背后才会游刃有余,变幻无穷。就像真正的真理是简单的,是不会难为人的,如果一个东西你觉得很难,那么多半是你还没有更深入,安静下来慢慢研究一下,为自己喝彩!
哎,不就是一个图形打印嘛!说了这么多,是不是太自作多情了。拍砖吧!O(∩_∩)O哈哈~