在矩形内绘制基于图块的椭圆
Drawing a tile based Ellipse inside a Rectangle
我正在尝试生成随机大小的椭圆并将它们绘制到地图上(只是一个二维图块阵列)。在大多数情况下,它是有效的,但似乎当房间宽度大于高度时,它会切断墙角。
下面是我绘制椭圆的代码。基本上接受一个矩形并在其中绘制椭圆。
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 个瓷砖放在椭圆的 top/bottom 处吗?
您可以使用Bresenham ellipse algorithm或中点算法来绘制椭圆。
当您使用上述算法绘制两个对称点(方块)时,如下所示:
DrawPixel (xc + x, yc + y);
DrawPixel (xc - x, yc + y);
只需用室内瓷砖填充它们之间的线段。
我正在尝试生成随机大小的椭圆并将它们绘制到地图上(只是一个二维图块阵列)。在大多数情况下,它是有效的,但似乎当房间宽度大于高度时,它会切断墙角。
下面是我绘制椭圆的代码。基本上接受一个矩形并在其中绘制椭圆。
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 个瓷砖放在椭圆的 top/bottom 处吗?
您可以使用Bresenham ellipse algorithm或中点算法来绘制椭圆。
当您使用上述算法绘制两个对称点(方块)时,如下所示:
DrawPixel (xc + x, yc + y);
DrawPixel (xc - x, yc + y);
只需用室内瓷砖填充它们之间的线段。