我目前正在为我正在开发的基于图块的世界编辑器实现Bresenham线算法。对于 Shift + 单击功能,我想基于tileset中的选择矩形渲染一条线。这很简单,因为我可以使用算法在point1
到point2
的行上找到点,并在每个点绘制选择。
这个问题是当选择矩形大于一个图块时点重叠。结果如下所示。
我的问题是给出了一行上的所有要点,以及选择大小,我该如何得到这样的结果?请注意,我希望在选择超过point2
后停止绘制。
这是我目前在不考虑选择尺寸的情况下渲染线条的内容。
void renderPoint(Point point, bool invalidate = false)
{
Rectangle selection = world.SelectionRectangle;
int width = selection.Width / world.Settings.TileSize.Width,
height = selection.Height / world.Settings.TileSize.Height,
offsetX = (int)Math.Floor((float)width / 2),
offsetY = (int)Math.Floor((float)height / 2);
for (int x = point.X, sx = 0; x < point.X + width; x++, sx++)
{
for (int y = point.Y, sy = 0; y < point.Y + height; y++, sy++)
{
Point change = new Point(x - offsetX, y - offsetY);
if (!changesUndo.ContainsKey(change))
changesUndo[change] = world.GetTile(change);
WorldTile tile = new WorldTile(selection.X + (sx * world.Settings.TileSize.Width), selection.Y + (sy * world.Settings.TileSize.Height), 0);
world.SetTile(change.X, change.Y, tile);
changesRedo[change] = tile;
}
}
lastRenderedPoint = point;
if (invalidate)
world.InvalidateCanvas();
}
void renderLine(Point p1, Point p2)
{
List<Point> points = pointsOnLine(p1, p2);
for (int i = 0; i < points.Count; i++)
renderPoint(points[i], i == points.Count - 1);
}
如果您需要更多代码上下文,请发表评论。
答案 0 :(得分:1)
如果点数是用Bresenham渲染的,那么你必须跳过'n'点中的每个'n-1',其中'n'是线的主要方向上的选择大小(即,如果它主要是水平线,宽度)。
这样的东西? :
void renderLine(Point p1, Point p2)
{
List<Point> points = pointsOnLine(p1, p2);
int dx = Abs(p2.x - p1.x);
int dy = Abs(p2.y - p1.y);
Rectangle selection = world.SelectionRectangle;
int incr = selection.Width / world.Settings.TileSize.Width;
if(dy > dx)
{
incr = selection.Height / world.Settings.TileSize.Height;
}
int lastPoint = (points.Count-1) / incr;
lastPoint *= incr;
for (int i = 0; i <= lastPoint; i+=incr)
renderPoint(points[i], i == lastPoint);
}