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