Прямоугольники перекрываются при попытке увеличить графический интерфейс лабиринта - PullRequest
1 голос
/ 23 января 2012

Мое приключение с лабиринтом и графическим интерфейсом продолжается, и на данный момент я вижу любой график G=(V,E) где вершины - комнаты, а края - соединители (двери или стены), но размеры прямоугольников слишком малы, поэтому я попытался увеличить их, но прямоугольники ступают один на другой.

Учитывая следующий код:

private void drawMaze(PaintEvent e) {
  Graph maze = new Graph();
  maze.generateMaze(25);

  int i = 0;
  int level = 25;

  e.gc.setAntialias(SWT.ON);
  e.gc.setBackground(new Color(e.display, 150, 150, 150));
  e.gc.setLineWidth(12);

  e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_DARK_GREEN));

  while (i < level) {
    Connector connector = maze.getEdgeConnectorByIndex(i);
    if (connector instanceof Door) {

      e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_DARK_GREEN));

      Room room1 = ((Door)connector).getFirstRoom();
      Room room2 = ((Door)connector).getSecondRoom();
      int x = room1.getXcoordinate()+10;
      int y = room1.getYcoordinate()+10;

      int x1 = room2.getXcoordinate()+10;
      int y1 = room2.getYcoordinate()+10;

      e.gc.fillRectangle(x*30,y*30,20,20);  
      e.gc.fillRectangle(x1*30,y1*30,20,20); 
      e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_BLUE));

      Room r1 = new Room(30*x,30*y);
      Room r2 = new Room(30*x1,30*y1);
      Coordinate c = this.checkWhereConnectorLocated(r1,r2);
      if (c.getSign() == DIAGONAL)
        e.gc.fillRectangle(c.getXCoordinate(),c.getYCoordinate(),10,20);
      else
        e.gc.fillRectangle(c.getXCoordinate(),c.getYCoordinate(),20,10);

    }



    if (connector instanceof Wall) {
      e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_DARK_GREEN));

      Room room1 = ((Wall)connector).getFirstRoom();
      Room room2 = ((Wall)connector).getSecondRoom();
      int x = room1.getXcoordinate()+10;
      int y = room1.getYcoordinate()+10;

      int x1 = room2.getXcoordinate()+10;
      int y1 = room2.getYcoordinate()+10;

      e.gc.fillRectangle(x*30,y*30,20,20);
      e.gc.fillRectangle(x1*30,y1*30,20,20);  
      e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_DARK_RED));

      Room r1 = new Room(30*x,30*y);
      Room r2 = new Room(30*x1,30*y1);
      Coordinate c = this.checkWhereConnectorLocated(r1,r2);

      if (c.getSign() == DIAGONAL)
        e.gc.fillRectangle(c.getXCoordinate(),c.getYCoordinate(),10,20);
      else
        e.gc.fillRectangle(c.getXCoordinate(),c.getYCoordinate(),20,10);
    }

    i++;
  }

}

//  void org.eclipse.swt.graphics.GC.fillRectangle(int x, int y, int width, int
//  height)


private Coordinate checkWhereConnectorLocated(Room room1,Room room2) {

  int x = 0; int y = 0;
  Coordinate coordinate ;

  if (room1.getXcoordinate() == room2.getXcoordinate()) {
    // same X coordinate
    if (room1.getYcoordinate() > room2.getYcoordinate()) {
      // ROOM1 is located above ROOM2 - same X different Y 

      x = room1.getXcoordinate();
      y = room1.getYcoordinate()-10;
      coordinate = new Coordinate(x,y);
    }
    else {
      // ROOM2 is located above ROOM1 
      x = room1.getXcoordinate();
      y = room2.getYcoordinate()-10;
      coordinate = new Coordinate(x,y);

    }

    coordinate.setSign(HORIZONTAL);
    return coordinate;
  }

  else if (room1.getYcoordinate() == room2.getYcoordinate()) {
    // else maybe same Y coordinate  - the X is changing 
    if (room1.getXcoordinate() > room2.getXcoordinate()) {
      // ROOM1 is on the right of ROOM2 l
      x = room1.getXcoordinate() - 10;
      y = room2.getYcoordinate();          // same Y so there is no difference
                                           // whom Y's we choose
      coordinate = new Coordinate(x,y);
    }

    else {
      // ROOM2 is on the right of ROOM1
      x = room2.getXcoordinate() - 10;
      y = room2.getYcoordinate();          // same Y so there is no difference
                                           // whom Y's we choose
      coordinate = new Coordinate(x,y);
    }

    coordinate.setSign(DIAGONAL);
    return coordinate;
  }

  coordinate = new Coordinate(0,0);
  return coordinate;

}

Выход:

enter image description here

Зеленые прямоугольники - rooms, а red и blue - connectors. Как вы можете видеть, прямоугольники слишком малы, и мне нужно что-то вроде «60». Однако я не могу найти правильную комбинацию значений для fillRectangle и x,x1,y,y1, где прямоугольники не будут располагаться один над другим.

Может кто-нибудь объяснить, как я могу это исправить?

1 Ответ

1 голос
/ 24 января 2012

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

private final int boxSize = 60;
private final int connectorSize = 20;
private final int topOffset = 50;
private final int leftOffset = 50;
private Color roomColor = null;
private Color wallColor = null;
private Color doorColor = null;

private void drawMaze(PaintEvent e) {
    GC gc = e.gc;
    int i = 0;
    int level = 25;
    Graph maze = new Graph();

    maze.generateMaze(level);

    gc.setAntialias(SWT.ON);
    gc.setBackground(new Color(e.display, 150, 150, 150));

    while (i < level) {
        Connector connector = maze.getEdgeConnectorByIndex(i);

        gc.setBackground(roomColor);

        Room room1 = connector.getFirstRoom();
        Room room2 = connector.getSecondRoom();

        // left top corner X of room is offset from left side + coordinate mul size of box plus number of connectors between boxes already drawn before current room mul connector size
        int roomX = leftOffset + room1.getXcoordinate() * boxSize + (room1.getXcoordinate() - 1) * connectorSize;
        // left top corner Y of room is offset from top + coordinate mul size of box plus number of connectors between boxes already drawn above current room mul connector size
        int roomY = topOffset + room1.getYcoordinate() * boxSize + (room1.getYcoordinate() - 1) * connectorSize;

        gc.fillRectangle(roomX, roomY, boxSize, boxSize);

        if (connector instanceof Door) gc.setBackground(doorColor);
        if (connector instanceof Wall) gc.setBackground(wallColor);

        int connectorX = 0;
        int connectorY = 0;
        int connectorWidth = 0;
        int connectorHeight = 0;

        // room have same X, second is above or under the first
        if (room1.getXcoordinate() == room2.getXcoordinate()) {
            connectorWidth = boxSize;
            connectorHeight = connectorSize;
            connectorX = roomX;
            // check if it's under
            if (room1.getYcoordinate() > room2.getYcoordinate()) connectorY = roomY - connectorSize;
            else connectorY = roomY + boxSize;
        }
        // room have same Y, second is on right or left side of the first
        else {
            connectorWidth = connectorSize;
            connectorHeight = boxSize;
            connectorY = roomY;
            // check if it's right side
            if (room1.getXcoordinate() > room2.getXcoordinate()) connectorX = roomX - connectorSize;
            else connectorX = roomX + boxSize;
        }

        gc.fillRectangle(connectorX, connectorY, connectorWidth, connectorHeight);

        // draw the second room
        gc.setBackground(roomColor);

        roomX = leftOffset + room2.getXcoordinate() * boxSize + (room2.getXcoordinate() - 1) * connectorSize;
        roomY = topOffset + room2.getYcoordinate() * boxSize + (room2.getYcoordinate() - 1) * connectorSize;

        gc.fillRectangle(roomX, roomY, boxSize, boxSize);

        i++;
    }
}

Заменить Ancestor на правильный класс. (Если у вас нет общего класса предков или эти методы не относятся к классу Connector, создайте их!;])

EDIT

Я сделал исправление на основе вашего фактического кода, поэтому проверьте новую версию.

Вы также допустили ошибку при генерации уровня, цикл должен завершиться на >=1, у вас есть только >1, поэтому одна комната отсутствует, поэтому NullPointerException возникло в моей первой версии кода.

Также этот код идет прямо в начале BasicShapes конструктор класса

roomColor = display.getSystemColor(SWT.COLOR_DARK_GREEN);
wallColor = display.getSystemColor(SWT.COLOR_RED);
doorColor = display.getSystemColor(SWT.COLOR_BLUE);
...