gpt4 book ai didi

java - 递归标尺刻度小程序

转载 作者:行者123 更新时间:2023-11-30 03:40:34 27 4
gpt4 key购买 nike

首先,这是家庭作业,所以我不要求答案,只是询问如何继续我正在做的事情。

我必须制作一个递归小程序,从标尺上绘制测量刻度,如下所示:


(来源: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,我尝试过类似的方法,但有一组线总是倾斜的:

我没有更改我的方法 header ,但我以类似的方式组织了我的数据:

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

<小时/>

Oooooo 我找到了斜线的来源,我没有使用相同的 y 坐标作为基线。糟糕。这是现在的样子:

if(( rightX - leftX ) <= STOP )
{
drawingArea.drawLine( leftX, bottomY, rightX, bottomY );
}

还有:

最佳答案

让我们看看是否可以为您提供一些有用的思考内容,而无需提供太多:

递归的工作方式是,在每一步中,您都执行与之前相同的操作,但(通常)数据的较小版本。在您发布的代码中,您将绘图区域分为两半,并在右半部分和左半部分递归,在其中的某处绘制线条。好的。递归函数有两个部分:1)递归步骤,即循环,做一些工作,然后将问题分成两半;2)基本情况,即停止递归的点,因为问题无法拆分任何更小的。那么,您需要思考的问题是:

1) 在递归步骤中,在进行递归调用之前,是否要画一条线?如果有的话在哪里,多高?

2)在基本情况下,当你已经到达递归的底部并且问题无法再分割时,你想画一条线吗?如果有的话在哪里,多高?

提示 1:您可能首先需要将 x 轴分成 8 个“1 英寸” block ,然后分别对每个 block 进行递归。

提示2:Graphics.drawLine()具有以下定义:

drawLine(int x1, int y1, int x2, int y2)
Draws a line, using the current color, between the points (x1, y1) and (x2, y2) in this graphics context's coordinate system.

因此,如果你想要垂直线,请确保 x1 == x2,如果你想要水平线,请确保 y1 == y2,其他任何内容都会给出倾斜线。

提示 3(这很有趣!):尝试将其用作递归步骤,看看会发生什么[您必须将方法 header 调整为 drawRuler(leftX, rightX, topY,底部Y)]

else
{
drawingArea.drawLine( midX, bottomY, midX, topY );

drawRuler( leftX, midX, topY/2, bottomY, drawingArea );
drawRuler( midX, rightX, topY/2, bottomY, drawingArea );
}

关于java - 递归标尺刻度小程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26891227/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com