如何用JAVA画一个菱形

jckzhang 2008-07-05 09:46:32
RT 各位可否赐教一下编程的思路
...全文
2241 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kurt17 2011-12-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bao110908 的回复:]
Java code
public class Test {

public static void main(String[] args) {
printDiamond(7, true);
System.out.println();
printDiamond(7, false);
}

/**
*……
[/Quote]
太强悍了,顶
cw_tkong 2010-10-05
  • 打赏
  • 举报
回复
顶一个 强
ocaicai 2010-05-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bao110908 的回复:]
Java code
public class Test {

public static void main(String[] args) {
printDiamond(7, true);
System.out.println();
printDiamond(7, false);
}

/**
*……
[/Quote]

个人觉得火龙果非常的诚恳非常的细致非常的大气,火龙果回答过我的那个打印图形的问题。真的让我耳目一新,图形还可以这么来打印啊!
用自己的语言来说就是:函数在矩阵中的隐性应用,当然我那天的那个图形打印是一次函数在矩阵中的隐性应用啦!
函数在矩阵中的隐性应用这种方法,我们再来看看这个哥们儿的菱形打印就变得非常的简单明了了。
代码最有说服力

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哈哈~


jckzhang 2008-07-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 FL1429 的回复:]
界面实现方法是新建一个Canvas类..然后在canvas上画图..

调用Graphics中方法..你看下draw...

至于如何实现哪就是算法的问题了.
[/Quote]不用界面,直接在控制台窗口中实现
FL1429 2008-07-05
  • 打赏
  • 举报
回复
界面实现方法是新建一个Canvas类..然后在canvas上画图..

调用Graphics中方法..你看下draw...

至于如何实现哪就是算法的问题了.
jckzhang 2008-07-05
  • 打赏
  • 举报
回复
代码

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++;
}
}
}
jckzhang 2008-07-05
  • 打赏
  • 举报
回复
找到这样一段代码,各位可否解释一下,一点都看不懂
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++;
}
}
}
apples_009 2008-07-05
  • 打赏
  • 举报
回复
回去看一下awt或swing 的draw类吧...
chendabian 2008-07-05
  • 打赏
  • 举报
回复
谢谢 你的解释
  • 打赏
  • 举报
回复
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 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 时
才输出 *,否则输出空格。

因此,这样我们就利用于图形的对称性完成了菱形的输出。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧