Правильная индексация для рисования экваториальных треугольников - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь решить проблему, используя Java о рисовании фигур на холсте с указанием верхнего левого угла как (0, 0). Это упражнение улучшило бы мое понимание и использование наследования, однако я застрял в попытке выяснить правильные индексы для проверки того, является ли определенная «ячейка» на холсте частью внутреннего сечения треугольника (т.е. не на его границе края). Пример:

enter image description here

Вот мой следующий код:

package ca.cmpt213.as4.shapes;

public class Triangle extends ShapeImpl {

    public Triangle(int location_X, int location_Y, int size) {
        super(location_X, location_Y, size, size);
    }

    @Override
    protected boolean isBorder(int location_X, int location_Y) {

        boolean isBorder = false;
        int startingLocation_X = this.getLocation_X();
        int startingLocation_Y = this.getLocation_Y();
        int zeroIndexedHeight = this.getHeight() - 1;


        if (location_X == startingLocation_X || location_Y == (zeroIndexedHeight + startingLocation_Y)) {
            isBorder = true;
        } else if (location_X > location_Y) {
            if (location_X == (location_Y + startingLocation_X)) {
                isBorder = true;
            }
        } else if (location_Y > location_X) {
            if (location_Y == (location_X + startingLocation_Y)) {
                isBorder = true;
            }
        } else if (location_X == location_Y) {
            isBorder = true;
        }
        return isBorder;
    }

    @Override
    protected boolean isInside(int location_X, int location_Y) {
        boolean isInside = false;
        int startingLocation_X = this.getLocation_X();
        int startingLocation_Y = this.getLocation_Y();
        int row = startingLocation_X;
        int col = startingLocation_Y;
        boolean check = false;
        while (check == false) {
            if (row < location_X) {
                row++;
            }
        }
        if (location_X < location_Y &&
                location_X < **something**) {
            isInside = true;

            //leave this
        } else if (location_Y < location_X &&
                location_X <= (startingLocation_X + location_Y)) {
            isInside = true;
        } else if (location_X == location_Y) {
            isInside = false;
        }
        return isInside;
    }

}

public abstract class ShapeImpl implements Shape {
private Color bg_Color = Color.YELLOW;
private char borderChar = '*';
private char textChar = ' ';
private int location_X;
private int location_Y;
private int lastAccessibleLocation_X;
private int lastAccessibleLocation_Y;
private int width;
private int height;


public ShapeImpl(int location_X, int location_Y, int width, int height) {
    this.location_X = location_X;
    this.location_Y = location_Y;
    lastAccessibleLocation_X = (location_X + width) - 1;
    lastAccessibleLocation_Y = (location_Y + height) - 1;
    this.width = width;
    this.height = height;

}

public void draw(Canvas canvas) {
    for (int i = location_Y; i <= lastAccessibleLocation_Y; i++) {
        for (int j = location_X; j <= lastAccessibleLocation_X; j++) {
            if (this.isBorder(j, i)) {
                canvas.setCellText(j, i, borderChar);
                canvas.setCellColor(j, i, bg_Color);
            } else if (this.isInside(j, i)) {
                canvas.setCellText(j, i, textChar);
                canvas.setCellColor(j, i, bg_Color);
            }
        }
    }
}

protected abstract boolean isBorder(int location_X, int location_Y);

protected abstract boolean isInside(int location_X, int location_Y);

С моим текущим набором тестовых случаев, только несколько из треугольников будет отображаться правильно. Я вполне уверен, что большинство ошибок проистекает из 'if' case в 'isInside' для 'location_X

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