我还不打算将图像转换成文件(而且我不知道我是否会这样做)。
图纸是由定制的绘图程序(用户绘制的)制作的。当我调整应用程序的大小时,绘图消失了,因为它没有被重绘。那是因为图像没有以任何方式被记住。我需要一个算法来记忆绘图,所以它可以在整个应用程序刷新后重新绘制。
我想到的一种算法是记住每个像素的位置和颜色。但我不认为这是一个好主意。
我目前正在使用 Java,但我需要一种与语言无关的算法。不过,我会接受用代码解释的解决方案。
我应该使用什么算法来记住整个绘图?
我还不打算将图像转换成文件(而且我不知道我是否会这样做)。
图纸是由定制的绘图程序(用户绘制的)制作的。当我调整应用程序的大小时,绘图消失了,因为它没有被重绘。那是因为图像没有以任何方式被记住。我需要一个算法来记忆绘图,所以它可以在整个应用程序刷新后重新绘制。
我想到的一种算法是记住每个像素的位置和颜色。但我不认为这是一个好主意。
我目前正在使用 Java,但我需要一种与语言无关的算法。不过,我会接受用代码解释的解决方案。
我应该使用什么算法来记住整个绘图?
你可以记住用户的动作:例如,如果他/她画了一条线,那么就记住开始和结束地址。如果他/她免提绘制了一幅画,那么你就记住了单个像素(你必须!)。
这允许仅通过操纵坐标来调整任何图形的大小、旋转等。
然后“绘图”变成了一个动作列表:
{
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
同样,要“加载”图形,您只需按顺序扫描文件并填充内存结构。
您可以搜索“矢量绘图”以获取更多详细信息和提示。
有很多选择。正如你所说,一个是记住图像像素。您还可以简单地记住生成绘图的所有用户操作,并在需要重建绘图时重放它们。
根据绘图程序为用户提供的工具,另一种方法是构建更紧凑的图像表示。例如,如果绘图程序只提供绘制线条的可能性,您可以记住线条端点的集合(以及颜色、线条粗细以及任何其他相关的线条数据)。这以一种明显的方式推广到更大的几何基元集。
对于徒手绘图,您可以记住笔触路径以及当时设置的任何笔触设置。根据您的程序提供的笔画工具的复杂性,这最终可能会比简单地记住绘图像素更多的数据。但是,它确实允许,例如,如果画布展开,则缩放绘图。