2012-08-08 36 views
0

这是我在java书中找到的练习。我无法解决它。使用抽象类绘制功能图

public abstract class AbstractDrawFunction extends JPanel { 
    /** Polygon to hold the points */ 
    private Polygon p = new Polygon(); 
    protected AbstractDrawFunction() { 
    drawFunction(); 
    } 
    /** Return the y-coordinate */ 
    abstract double f(double x); 
    /** Obtain points for x-coordinates 100, 101, ..., 300 */ 
    public void drawFunction() { 
    for (int x = -100; x <= 100; x++) { 
    p.addPoint(x + 200, 200 - (int)f(x)); 
    } 
    } 
    /** Implement paintComponent to draw axes, labels, and 
    * connecting points 
    */ 
    protected void paintComponent(Graphics g) { 
    // To be completed by you 
    } 
    } 

Test the class with the following functions: 
f(x) = x2; 
f(x) = sin(x); 
f(x) = cos(x); 
f(x) = tan(x); 
f(x) = cos(x) + 5sin(x); 
f(x) = 5cos(x) + sin(x); 
f(x) = log(x) + x2; 

对于每个功能,创建扩展AbstractDrawFunction 类并实现在方法F的类。

+0

你做了什么? – 2012-08-08 18:55:50

+0

我无法在Jframe中添加Jpanel。 – 2012-08-08 19:00:07

+2

S.L.Barth解释如何做到这一点.. – 2012-08-08 19:03:13

回答

3

实现子类是很简单的部分。只需扩展课程并实施该方法;我想你已经知道并了解如何做到这一点。如果不是,请在书中查找“派生类”。

paintComponent部分有点困难,但前提是它假设您将函数按比例缩放。看起来该方法应该在200 x 200窗口中绘制图形,功能范围从-100到100.所以不需要缩放,但是看不到很多正弦和余弦函数。
事实上,您不必缩放也意味着绘制轴很容易;注意坐标系从-100到100,这应该给你足够的线索。

请注意tan!它没有为所有输入值定义。其他功能之一也是如此,这可能就是他们为什么要参加这个练习。

该方法使用Polygon有一个小陷阱。一个Polygon可以简单地绘制一个电话Graphics.drawPolygon,但该方法将关闭它:最后一点将与第一个连接。
对此有一些解决方法,例如添加额外的点并强制将该额外的线完全绘制在轴上。但它们不适用于所有的公式,我不认为这是你应该做的。练习可能只是使用Polygon,因此您可以拨打drawPolygon进行实际渲染。

要将JPanel添加到JFrame,请使用JFrame.add(subclass)JFrame.setContentPane(subclass)

+2

这是一个很好的解释。如果您(@dr_mak)在尝试了这些想法后卡住了,请添加您的问题,让我们知道您所做的事情。 – 2012-08-08 19:11:24

+0

其实我的朋友问我这个问题。 我couln't弄清楚,所以我张贴在这里。我把这个答案传给了他。 会回复回复 – 2012-08-10 09:56:23