在Rectangle中绘制基于tile的tile

时间:2015-12-09 18:12:35

标签: java math ellipse

我试图生成随机大小的椭圆并将它们绘制到地图(只是一个二维的瓷砖阵列)。在大多数情况下,它是有效的,但似乎当房间比它更高时,它会切断墙壁的角落。

enter image description here

下面是我绘制椭圆的代码。基本上采用矩形并在其中绘制椭圆。

private void AddCellEllipse(int xStart, int yStart, int xEnd, int yEnd, Tile tile)
{
    // Draw an ellipse centered in the passed-in coordinates
    float xCenter = (xEnd + xStart) / 2.0f;
    float yCenter = (yEnd + yStart) / 2.0f;
    float xAxis = (xEnd - xStart) / 2.0f;
    float yAxis = (yEnd - yStart) / 2.0f;

    for (int y = yStart; y <= yEnd; y++)
        for (int x = xStart; x <= xEnd; x++)
        {
            // Only draw if (x,y) is within the ellipse
            if (Math.sqrt(Math.pow((x - xCenter) / xAxis, 2.0) + Math.pow((y - yCenter) / yAxis, 2.0)) <= 1.0f)
                tiles[x][y] = tile;
        }
}

我称之为这样的方法。在随机位置生成随机大小的矩形,然后创建墙砖的椭圆,然后用地砖覆盖内墙砖。

    AddCellEllipse(xRoomStart, yRoomStart, xRoomStart + roomWidth, yRoomStart + roomHeight, Tile.WALL);
    AddCellEllipse(xRoomStart + 1, yRoomStart + 1, xRoomStart + roomWidth - 1, yRoomStart + roomHeight - 1, Tile.FLOOR);

同样是奖金问题,任何人都知道如何才能让它不会在椭圆的顶部/底部伸出1个瓷砖?

1 个答案:

答案 0 :(得分:4)

您可以使用Bresenham ellipse algorithm或中点算法绘制省略号。

当你用这些提到的算法绘制两个对称点(平铺)时:

DrawPixel (xc + x, yc + y);
DrawPixel (xc - x, yc + y);

只需用内部瓷砖填充它们之间的线段。