Как мне заштриховать треугольники Серпинского? - PullRequest
2 голосов
/ 15 февраля 2012

Я создал код треугольника Серпинского.Но я хочу заштриховать треугольники в зависимости от того, сколько треугольников делает код.В моем случае я печатаю только те треугольники, которые не заштрихованы.Я хочу что-то подобное, как это!http://en.wikipedia.org/wiki/File:Sierpinski_triangle_evolution.svg

Группа 2: Kulplex

Ученик: Генри Данг

Что мне делать?

import java.applet.*;
import java.awt.*;

public class Sierpinski extends Applet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    Graphics g;
    Point a1,b1,c1, a2,b2,c2, a3,b3,c3;

    int deep = 0;

    public void paint() {
        setBackground(new Color(255,255,255));
    }

    public boolean mouseDown(Event ev, int x, int y) {
        if (!ev.metaDown()) deep += 1;
        else if (deep>0) deep -= 1;
        repaint();
        return true;
    }


    public void paint(Graphics g) {
        // Create triangle
        int px[] = {20, 400, 210};
        int py[] = {400, 400, 20};
        g.drawPolygon(px, py, 3);

        paintTriangle(g, new Point(20,400),new Point(400,400),new Point(210,20), deep);
    }

    public void paintTriangle(Graphics g, Point a, Point b, Point c, int lvl) {


        if (lvl==0) return;

        lvl -= 1;

        // In the given triangle, amended to include an upside-down triangle
        int px[] = {c.x, (c.x+b.x)/2, (a.x+c.x)/2};
        int py[] = {b.y, (c.y+a.y)/2, (c.y+a.y)/2};

        g.drawPolygon(px, py, 3);

        // 3 new triangles 
        a1 = a;
        b1 = new Point(c.x, b.y);
        c1 = new Point((a.x+c.x)/2, (c.y+a.y)/2);
        paintTriangle(g, a1, b1, c1, lvl);

        a2 = new Point(c.x, b.y);
        b2 = b;
        c2 = new Point((c.x+b.x)/2, (c.y+a.y)/2);
        paintTriangle(g, a2, b2, c2, lvl);

        a3 = new Point((a.x+c.x)/2, (c.y+a.y)/2);
        b3 = new Point((c.x+b.x)/2, (c.y+a.y)/2);
        c3 = c;
        paintTriangle(g, a3, b3, c3, lvl);
    }
}

Ответы [ 3 ]

3 голосов
/ 15 февраля 2012

Разве вы не должны использовать вызов g.drawPolygon(px, py, 3);, только когда вы находитесь в нижней части рекурсивного вызова?

То, как код выглядит для меня прямо сейчас, вы всегда будете рисовать большой треугольник первого уровня, который затеняет рисунок, который вы делаете из меньших слоев.

То, что я пытаюсь сказать, это то, что вы должны звонить на g.drawPolygon(), только если уровень равен нулю, для всех более низких уровней просто повторять, чтобы получить меньшие треугольники. Это если вы пытаетесь нарисовать черные треугольники вместо того, чтобы рисовать пробелы. Немного неясно, чего вы хотите достичь.

Редактировать: Исходя из вашего комментария, вы действительно хотите ЗАПОЛНИТЬ полигоны, я прав? В этом случае замените drawPolygon на fillPolygon, и треугольники будут заполнены.

1 голос
/ 15 февраля 2012

Вы должны начать с черного заполненного треугольника и затем заполнить треугольники белым:

public void paint(Graphics g) {
    // Create triangle
    int px[] = {20, 400, 210};
    int py[] = {400, 400, 20};
    g.setColor(Color.black);
    g.fillPolygon(px, py, 3);
    g.setColor(Color.white);
    paintTriangle(g, new Point(20,400),new Point(400,400),new Point(210,20), deep);
}

Заменить все drawPolygon на fillPolygon.

Не пытайтесь увеличить глубину щелчком мыши.

0 голосов
/ 15 февраля 2012

Это должно работать.

import java.applet.*;
import java.awt.*;

public class Sierpinski extends Applet {

/**
 * 
 */
private static final long serialVersionUID = 1L;
Graphics g;
Point a1,b1,c1, a2,b2,c2, a3,b3,c3;

int deep = 0;

public void paint() {
    setBackground(new Color(255,255,255));
}

public boolean mouseDown(Event ev, int x, int y) {
    if (!ev.metaDown()) deep += 1;
    else if (deep>0) deep -= 1;
    repaint();
    return true;
}


public void paint(Graphics g) {
    // Create triangle
    int px[] = {20, 400, 210};
    int py[] = {400, 400, 20};
    g.fillPolygon(px, py, 3);

    paintTriangle(g, new Point(20,400),new Point(400,400),new Point(210,20), deep);
}

public void paintTriangle(Graphics g, Point a, Point b, Point c, int lvl) {


    if (lvl==0) {
       return;
    }

    lvl -= 1;

    // In the given triangle, amended to include an upside-down triangle
    int px[] = {c.x, (c.x+b.x)/2, (a.x+c.x)/2};
    int py[] = {b.y, (c.y+a.y)/2, (c.y+a.y)/2};

    // 3 new triangles 
    a1 = a;
    b1 = new Point(c.x, b.y);
    c1 = new Point((a.x+c.x)/2, (c.y+a.y)/2);
    paintTriangle(g, a1, b1, c1, lvl);

    a2 = new Point(c.x, b.y);
    b2 = b;
    c2 = new Point((c.x+b.x)/2, (c.y+a.y)/2);
    paintTriangle(g, a2, b2, c2, lvl);

    a3 = new Point((a.x+c.x)/2, (c.y+a.y)/2);
    b3 = new Point((c.x+b.x)/2, (c.y+a.y)/2);
    c3 = c;
    paintTriangle(g, a3, b3, c3, lvl);
    g.setColor(Color.WHITE);
    g.fillPolygon(px, py, 3);
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...