C# iso网格上比中点圆更好的平铺贴图笔刷算法

C# iso网格上比中点圆更好的平铺贴图笔刷算法,c#,algorithm,isometric,C#,Algorithm,Isometric,我正在做这个iso网格游戏(更精确:二维投影,在典型的菱形布局中索引),并希望实现圆形笔刷在我的地图上绘制瓷砖,就像在任何图像编辑软件中一样。我开始使用,但马上注意到,结果与我想要的1到7之间的小笔刷大小不同 我宁愿要这样的东西: 忽略,第一个圆圈没有填充,这当然很容易。在iso网格上有适合形状生成的算法吗?我甚至可能不想要圆形,而是交替使用四边形和十字形/x形 以下是从Wikipedia获取的第一个图像示例的代码: static List<IntVector2> GetBrus

我正在做这个iso网格游戏(更精确:二维投影,在典型的菱形布局中索引),并希望实现圆形笔刷在我的地图上绘制瓷砖,就像在任何图像编辑软件中一样。我开始使用,但马上注意到,结果与我想要的1到7之间的小笔刷大小不同

我宁愿要这样的东西:

忽略,第一个圆圈没有填充,这当然很容易。在iso网格上有适合形状生成的算法吗?我甚至可能不想要圆形,而是交替使用四边形和十字形/x形

以下是从Wikipedia获取的第一个图像示例的代码:

static List<IntVector2> GetBrushCircleCoords(int x0, int y0, int radius)
{
    List<IntVector2> coords = new List<IntVector2>();
    int x = radius;
    int y = 0;
    int err = 0;

    while (x >= y)
    {
        coords.Add(new IntVector2(x0 + x, y0 + y));
        coords.Add(new IntVector2(x0 + y, y0 + x));
        coords.Add(new IntVector2(x0 - y, y0 + x));
        coords.Add(new IntVector2(x0 - x, y0 + y));
        coords.Add(new IntVector2(x0 - x, y0 - y));
        coords.Add(new IntVector2(x0 - y, y0 - x));
        coords.Add(new IntVector2(x0 + y, y0 - x));
        coords.Add(new IntVector2(x0 + x, y0 - y));

        y += 1;
        err += 1 + 2 * y;
        if (2 * (err - x) + 1 > 0)
        {
            x -= 1;
            err += 1 - 2 * x;
        }
    }
    return coords;
}
静态列表GetBrushCircleCoords(int x0,int y0,int radius)
{
列表坐标=新列表();
int x=半径;
int y=0;
int err=0;
而(x>=y)
{
添加(新的IntVector2(x0+x,y0+y));
添加(新的IntVector2(x0+y,y0+x));
添加(新的IntVector2(x0-y,y0+x));
添加(新的IntVector2(x0-x,y0+y));
添加(新的IntVector2(x0-x,y0-y));
添加(新的IntVector2(x0-y,y0-x));
添加(新的IntVector2(x0+y,y0-x));
添加(新的IntVector2(x0+x,y0-y));
y+=1;
误差+=1+2*y;
如果(2*(err-x)+1>0)
{
x-=1;
误差+=1-2*x;
}
}
返回坐标;
}

您没有指定等轴测网格的布局。我假设diamond更容易在那里实现。然而,在整数算法中,很难实现半径的半单元分辨率。对于全单元分辨率半径光盘填充,使用简单的2嵌套
For
s和内圆测试。结果如下所示:

只需忽略我的等轴测编辑器的树和平铺列表覆盖。下面是C++的源代码:

void等距::画笔画圆(int x0、int y0、int z0、int r)
{
r--;如果(r>1);
如果((z0>=0)和&(z01))>>2;
如果(d==2)
{

x=x0;y=y0;if((x>=0)&(x>=0)&(y=0)&(x=0)&(y=0)&&(x=0)&(y=0)&(x=0)&&(y=0)&(y)不确定如何改进小圆圈的代码。但正如您所提到的,您可能实际上并不想要(只是)圆圈,我认为这可能很有趣。它解释了如何使用普通绘图(GDI+或其他)创建一个模板,然后从中选择画笔像素。这样,您可以使用所有图形原语,甚至包括字体。在我的答案中添加了[Edit1]。这非常有用。我需要一些时间来消化它,但您的第一个示例代码已经比我的尝试好得多。@Xarbbrough很高兴能提供帮助
(x-x0)^2+(y-y0)^2<=r^2
(x-x0)^2+(y-y0)^2<=(d^2)/4
4*( (x-x0)^2 + (y-y0)^2 ) <= (d^2)