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