【发布时间】:2014-11-12 15:58:29
【问题描述】:
首先,这是作业,所以我不是在寻求答案,只是一些关于如何继续我正在做的事情的建议。
我必须制作一个递归小程序,从尺子上绘制测量刻度,就像下面的尺子一样:
(来源:myonlineruler.com)
到目前为止,我已经能够获得最高的线条,但中间的标记并没有缩小:
这是我的代码:
import java.applet.Applet;
import java.awt.*
public class RulerOfTheWorld extends Applet
{
private Image display;
private Graphics drawingArea;
public void init()
{
setSize( 600, 400 );
int height = getSize().height;
int width = getSize().width;
display = createImage( width, height );
drawingArea = display.getGraphics();
drawRuler( 0, height / 2, width, height / 2, drawingArea );
}
public void paint( Graphics g )
{
g.drawImage( display, 0, 0, null );
}
public static void drawRuler( int leftX,
int leftY,
int rightX,
int rightY,
Graphics drawingArea )
{
final int STOP = 40;
int midX = ( leftX + rightX ) / 2;
int midY = ( leftY + rightY ) / 2;
if(( rightX - leftX ) <= STOP )
{
drawingArea.drawLine( midX, leftY, midX, midY / 2 );
drawingArea.drawLine( leftX, leftY, rightX, rightY );
}
else
{
drawRuler( leftX, leftY, midX, midY, drawingArea );
drawRuler( midX, midY, rightX, rightY, drawingArea );
}
}
}
我一直在戳东西以查看对事物绘制方式的影响,但我似乎无法想出任何可行的方法;我的台词歪了。尝试将递归调用中的“顶部”y 坐标除以 2 时:
if(( rightX - leftX ) <= STOP )
{
drawingArea.drawLine( midX, leftY, midX, midY / 2 );
drawingArea.drawLine( leftX, leftY, rightX, rightY );
}
else
{
drawRuler( leftX, leftY, midX, midY/2, drawingArea );
drawRuler( midX, midY, rightX, rightY/2, drawingArea );
}
我明白了:
如果我尝试将“初始”y 坐标除以 2
drawRuler( leftX, leftY/2, midX, midY, drawingArea );
drawRuler( midX, midY/2, rightX, rightY, drawingArea );
我明白了:
似乎在我不理解的小程序中绘制图形有一些基本的东西。我们在课堂上没有涵盖任何此类内容,然后就把这个作业丢给了我们。
就像我说的,我不是在寻找答案,只是对我正在尝试的内容提出一些建议或更正。谢谢。
编辑 1
我应该注意到,我的导师说我们应该能够通过查看书中有关制作“随机分形线”的示例来完成此操作。这是书中的例子:
import java.applet.Applet;
import java.awt.*;
public class Fractal extends Applet
{
private Image display;
private Graphics drawingArea;
public void init()
{
int height = getSize().height;
int width = getSize().width;
display = createImage( width, height );
drawingArea = display.getGraphics();
randomFractal( 0, height/2, width, height/2, drawingArea );
}
public void paint( Graphics g )
{
g.drawImage( display, 0, 0, null );
}
public static void randomFractal( int leftX,
int leftY,
int rightX,
int rightY,
Graphics drawingArea )
{
final int STOP = 4;
int midX, midY;
int delta;
if(( rightX - leftX ) <= STOP )
{
drawingArea.drawLine( leftX, leftY, rightX, rightY );
}
else
{
midX = ( leftX + rightX ) / 2;
midY = ( leftY + rightY ) / 2;
delta = ( int ) (( Math.random() - 0.5 ) * ( rightX - leftX ) );
midY += delta;
randomFractal( leftX, leftY, midX, midY, drawingArea );
randomFractal( midX, midY, rightX, rightY, drawingArea );
}
}
}
编辑 2
@Mike Ounsworth,我尝试过类似的方法,但有一组线总是倾斜的:
我没有更改我的方法标题,但我以类似的方式组织了我的数据:
public static void drawRuler( int leftX,
int bottomY,
int rightX,
int topY,
Graphics drawingArea )
{
final int STOP = 40;
int midX = ( leftX + rightX ) / 2;
if(( rightX - leftX ) <= STOP )
{
drawingArea.drawLine( leftX, bottomY, rightX, topY );
}
else
{
drawingArea.drawLine( midX, bottomY, midX, topY );
drawRuler( leftX, bottomY, midX, topY / 2, drawingArea );
drawRuler( midX, bottomY, rightX, topY / 2, drawingArea );
}
}
编辑 3
哦,我找到了斜线的来源,我没有使用相同的 y 坐标作为基线。哎呀。这是它现在的样子:
if(( rightX - leftX ) <= STOP )
{
drawingArea.drawLine( leftX, bottomY, rightX, bottomY );
}
还有:
【问题讨论】:
标签: java recursion graphics applet