我在使用我的代码时遇到了一些麻烦。在我的代码中,嵌套的右等腰三角形被假设为这样绘制:
我不确定我的代码是否会起作用,因为一旦我运行它,就不会绘制三角形。我收到了这个错误
线程中的异常" AWT-EventQueue-0" java.lang.StackOverflowError的
我不确定如何修复它。救命?
import java.awt.*;
import javax.swing.*;
public class Ornament extends JPanel
{
public void paintComponent( Graphics g )
{
super.paintComponent( g ); // Call JPanel's paintComponent method
// to paint the background
drawTriangles( g, 100, 80, 64 );
}
/**
* Draws an ornament made of triangles in Graphics g with the base midpoint
* at (x, y) and base half-length r
*/
public void drawTriangles( Graphics g, int x, int y, int r )
{
g.drawLine( x + r, y, x - r, y );
g.drawLine( x + r, y, x, y - r );
g.drawLine( x - r, y, x, y - r );
if ( r == 4 )
{
drawTriangles( g, x-r , y, r );
drawTriangles( g, x-r , y, r );
}
else {
drawTriangles( g, 36+r , y, r );
r --;
}
}
public static void main( String[] args )
{
JFrame w = new JFrame( "Triangles" );
w.setBounds( 300, 300, 200, 120 );
w.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
Ornament panel = new Ornament();
panel.setBackground( Color.WHITE );
Container c = w.getContentPane();
c.add( panel );
w.setResizable( false );
w.setVisible( true );
}
}
答案 0 :(得分:1)
如果您致drawTriangles
r
不等于4,则会使用相同的r
一次又一次地呼叫自己。永远不会达到r--
。
尝试在else子句中的递归调用之前放置r--
。
答案 1 :(得分:1)
一旦达到4
(您的基本情况),您就不想继续,因此您可以将if
声明写为
if (r != 4) {
drawTriangles(g, 36 + r , y, r - 1);
}
这不会产生原始描述中所示的图形输出,但会阻止SOE
答案 2 :(得分:0)
您正在创建无限循环。 这是第一系列迭代中发生的事情:
drawTriangles( g, 100, 80, 64 );
// draw lines
drawTriangles( g, 136 , 80, 64 );
// draw lines
drawTriangles( g, 172 , 80, 64 );
// draw lines
drawTriangles(g, 208, 80, 64);
r--;
r --;
r--;
等等。 但是r--永远不会到达,因为你先进入下一级递归。 如果你交换drawTriangles和r--,至少r会变小,虽然不是很快。我本来期待r / 2或那里的东西。