1

我还不打算将图像转换成文件(而且我不知道我是否会这样做)。

图纸是由定制的绘图程序(用户绘制的)制作的。当我调整应用程序的大小时,绘图消失了,因为它没有被重绘。那是因为图像没有以任何方式被记住。我需要一个算法来记忆绘图,所以它可以在整个应用程序刷新后重新绘制。

我想到的一种算法是记住每个像素的位置和颜色。但我不认为这是一个好主意。

我目前正在使用 Java,但我需要一种与语言无关的算法。不过,我会接受用代码解释的解决方案。

我应该使用什么算法来记住整个绘图?

4

2 回答 2

3

你可以记住用户的动作:例如,如果他/她画了一条线,那么就记住开始和结束地址。如果他/她免提绘制了一幅画,那么你就记住了单个像素(你必须!)。

这允许仅通过操纵坐标来调整任何图形的大小、旋转等。

然后“绘图”变成了一个动作列表:

{
    LINE_DRAWING,
    x1, y1, x2, y2,
    pen, color, thickness...
}
{
    ...
}

要重绘,只需扫描相同的列表并再次调用适当的子例程。根据语言的不同,可以将列表表示为数组、链表、双向链表,并实现元素删除等事情。

在文件中,我建议使用某种标记格式:

two bytes - element type
four bytes - this element's length
variable-size data depending on element type

同样,要“加载”图形,您只需按顺序扫描文件并填充内存结构。

您可以搜索“矢量绘图”以获取更多详细信息和提示。

于 2012-11-25T16:40:58.717 回答
2

有很多选择。正如你所说,一个是记住图像像素。您还可以简单地记住生成绘图的所有用户操作,并在需要重建绘图时重放它们。

根据绘图程序为用户提供的工具,另一种方法是构建更紧凑的图像表示。例如,如果绘图程序只提供绘制线条的可能性,您可以记住线条端点的集合(以及颜色、线条粗细以及任何其他相关的线条数据)。这以一种明显的方式推广到更大的几何基元集。

对于徒手绘图,您可以记住笔触路径以及当时设置的任何笔触设置。根据您的程序提供的笔画工具的复杂性,这最终可能会比简单地记住绘图像素更多的数据。但是,它确实允许,例如,如果画布展开,则缩放绘图。

于 2012-11-25T16:41:18.727 回答