编程数学图像,用于高分辨率艺术品制作。

3

我想制作包含重复图案的海报大小的图片,类似于下面两个公共领域中的图像,即生命之花彭罗斯砖铺设

我的问题:

  1. 人们通常如何在计算机上创建这些图像?我希望答案不是“打开Adobe Illustrator并猜测交点”,因为这样的点可以在数学上定义。但我也想象不是所有对几何图案感兴趣的人都熟悉编程。
  2. 什么是创建这样的图像的最佳环境?特别是,从Java、Python、Processing等中获取高分辨率图像的最佳方法是什么?或者,Mathematica是最好的工具吗?

实际计算点和做数学并不是难点,至少在我看来(至少不是这个问题的重点)。我感兴趣的是从程序中获得高质量的视觉产品的最佳方法。

7个回答

5

创建这样的图片最好的方法是学习编写PostScript语言。这是一种干净的语言,易于学习,一旦掌握它,就非常强大。

Bill Casselman的手册是高质量数学插图方面的最佳参考资料。


Postscript是一种强大的语言,一旦你习惯了它的堆栈式结构,就会变得非常容易上手。 - James Black

1

好的,第二个问题可能会引起一场宗教战争,所以我来回答第一个。:)

这种类型图片的关键是递归。基本上,它们是同一幅图像以受控制的方式重复出现,以获得有趣的结果。以生命之花为例。您要重复中心花瓣六次(做花瓣的方法由您决定)。然后使用花瓣尖端作为中心并重叠其中一个花瓣,创建六朵更多的花。之后再进行递归移动向外。几次“循环”后停止并绘制包含圆。基本上,递归模拟了手动完成时所需的盖章、移动和旋转。

当我玩这些东西时,我总是发现实验是获得酷炫新事物的最佳方法。当然,这可能只是我的想象力不够。:)

我知道在这个答案中,我没有讲太多数学,但这取决于您的实验。只要记住 COS 和 SIN 是您的朋友,并且圆上有 360 度(或者根据您的数学软件,是 2pi 弧度)。

编辑:为“Flower”添加一些数学公式

从中心(Xo,Yo)开始,花的半径为 r...

花瓣的顶点(P0,P1等)由...确定。

X = Xo + (sin((n * pi)/3 + (pi / 6)) * r)
Y = Yo - (cos((n * pi)/3 + (pi / 6)) * r)

其中n是花瓣数(0..5)

计算出一个花瓣的顶点后,只需绘制花瓣,然后在其顶点开始一个新的花朵。您还应该设置一个边界圆,以便任何在该圆外的点都不会被绘制。


1

使用像 SVG 这样的向量图像格式。这将完美适应任何分辨率。

Inkscape 是创建这些图像的绝佳工具。

一旦您拥有了向量图像格式,根据您选择的编程语言,有许多选项可用于在编程语言中使用它。

例如 -


2
这并没有回答其中任何一个问题 :-) - Joey
正在查找链接 - 但它回答了第一个问题,第二个问题现在至少有一个选项得到了回答。 - Reed Copsey
1
我仍然认为基本问题没有得到解答。矢量格式对于这些图像有益是显而易见的,毫无疑问,但是在程序上生成这些图像仍然需要比Inkscape更好的工具,以我个人的看法。 - Joey
我还包括了相当多与 SVG 编程工作相关的库链接。 - Reed Copsey
1
但是SVG会有一个问题,即您不会进行额外的迭代,因为绘图表面比您最初设计的要大。因此,在一个分辨率下看起来很棒,但将其放大后,它看起来很好,但现在应该用更多的迭代来填充开放区域。 - James Black

1

我不知道那些图片是如何创建的,我猜它们是从书上扫描的,但是在我的分形项目中,我倾向于仅使用<canvas>标签,这样我可以更改元素的大小并查看绘制的迭代次数,以便获取最高分辨率。

这就是像SVG这样的东西存在的问题,你需要选择一个分辨率来创建它,并且它会很好地缩放,但是如果你在一个分辨率上进行开发,然后转到更高的分辨率演示,则可能会看到比您想要的更多的间隙。

如果您只想这样做并将其保存为静态图像,则任何GUI都可以使用,因为此时正在保存GIF,但是如果您希望它例如出现在网页上,并且在该浏览器上看起来尽可能好,则您可能需要考虑使用JavaScript。

数学部分并不难,因此在推导出所需的递归算法后,绘制图像相当容易。我倾向于一直迭代到大小低于阈值(例如,半径<3),然后退出。


0

我会尝试使用Java中的iText创建PDF。 PDF支持矢量图形,因此应该可以无问题地进行缩放。但是当您拥有大量图形元素时,我不知道iText在性能方面的缩放效果如何。


0

A1. 你可能想要看看海龟图形、L-系统、迭代函数系统、空间填充曲线,以及我不熟悉或还没有想到的其他方法。

A2. 你可以使用任何一种语言来编写这些程序。我喜欢Mathematica,但我知道并非每个人都有它的副本,而我有一个副本,因为我从事数字计算工作,并且可以用它来制作漂亮的图片。但是Processing是免费的,旨在为艺术家提供友好的界面,可能更适合你入门。Mathematica和Processing都可以直接进行图形处理,无需调用外部库(或担心使用哪些库)。

虽然我同意所有认为向量是正确选择的人,但不要忘记最终的生产步骤,即渲染到纸张或屏幕上,因此要考虑如何完成这一步骤。例如,这可能会引导你选择Postscript或PDF作为输出格式。

玩得开心

马克


0

嗯,我曾经在初中时用圆规画生命之花……其实非常简单……但我不认为这是你要找的答案。

基本上,它包括从每个点画出相同半径的圆,直到遇到大圆(限制)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接