2

再帰を使用してピタゴラスの木をペイントする必要がある割り当てがあります。ツリーは正方形のABCDで始まり、ポイントAとBはマウスクリックで定義されます。ツリーの左部分または右部分のいずれかをペイントできる再帰に到達するまで、すべてが機能しているように見えますが、両方をペイントすることはできません。問題が発生していると思われるところにコメントを付けました。

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;

public class PythagorasTree extends JFrame
{
    public static void main(String[] args)
    {
        new PythagorasTree();
    }

    PythagorasTree()
    {
        super("Pythagoras Tree");
        setSize(800,800);
        add("Center", new DrawingPanel());
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

class DrawingPanel extends JPanel
{
    Random random = new Random();

    int centerX;
    int centerY;
    int clickCount = 0;
    float pixelSize;
    float rWidth = 10.0F;
    float rHeight = 7.5F;
    float red, green, blue;

    Point a = new Point();
    Point b = new Point();
    Point c = new Point();
    Point d = new Point();
    Point e = new Point();
    Point u = new Point();


    DrawingPanel()
    {
        addMouseListener(new MouseAdapter()
        {
            public void mousePressed(MouseEvent click)
            {
                clickCount++;
                 if (clickCount == 1)
                 {
                     a.x = fx(click.getX());
                     a.y = fy(click.getY());
                     repaint();                 
                 }

                 if (clickCount == 2)
                 {
                    b.x = fx(click.getX());
                    b.y = fy(click.getY()); 
                    repaint();
                 }

            }
        });
    }

    void initgr()
    {
        Dimension d = getSize();
        int maxX = d.width - 1;
        int maxY = d.height - 1;
        pixelSize = Math.max(rWidth/maxX, rHeight/maxY);
        centerX = maxX/2; 
        centerY = maxY/2;
    }

    int iX(float x){return Math.round(centerX + x/pixelSize);}
    int iY(float y){return Math.round(centerY - y/pixelSize);}
    float fx(int x){return (x - centerX) * pixelSize;}
    float fy(int y){return (centerY - y) * pixelSize;}

    public void paintComponent(Graphics g)
    {
        initgr();
        super.paintComponent(g);
        setBackground(Color.white);
        g.setColor(Color.red);

        if (clickCount == 1)
            g.drawLine(iX(a.x), iY(a.y), iX(a.x), iY(a.y));

        if (clickCount > 1)     
            drawTree(g,a,b);        
    }

    public void drawTree(Graphics g, Point first, Point second)
    {

        float xSquared = (float) Math.pow((second.x-first.x),2);  
        float ySquared = (float) Math.pow((second.y-first.y),2);
        float length = (float) Math.sqrt(xSquared + ySquared);



        if ( length > .001)
        {
            u.x = second.x - first.x;
            u.y = second.y - first.y;   

            a.x = first.x;
            a.y = first.y;

            b.x = second.x;
            b.y = second.y;

            d.x = first.x + (u.y * -1);
            d.y = first.y + u.x;

            c.x = d.x + u.x;
            c.y = d.y + u.y;

            e.x = d.x + .5F * (u.x + (u.y*-1));
            e.y = d.y + .5F * (u.y + u.x);



            Polygon square = new Polygon();
            Polygon triangle = new Polygon();

            square.addPoint(iX(a.x), iY(a.y));
            square.addPoint(iX(b.x), iY(b.y));
            square.addPoint(iX(c.x), iY(c.y));
            square.addPoint(iX(d.x), iY(d.y));

            red = random.nextFloat();
            green = random.nextFloat();
            blue = random.nextFloat();      
            g.setColor(new Color(red, green, blue));

            g.fillPolygon(square);

            triangle.addPoint(iX(c.x), iY(c.y));
            triangle.addPoint(iX(d.x), iY(d.y));
            triangle.addPoint(iX(e.x), iY(e.y));

            red = random.nextFloat();
            green = random.nextFloat();
            blue = random.nextFloat();      
            g.setColor(new Color(red, green, blue));

            g.fillPolygon(triangle);    


            /* Problem code is here, tree will draw Left or Right depending on              which recursive call
             * is first in the code, but will never reach the 2nd call.
             */


            drawTree(g,d,e);  //Draw tree left
            drawTree(g,e,c);  //Draw tree right
        }



    }


}

class Point
{
    public float x;
    public float y;

    public Point()
    {

    }
}
4

1 に答える 1