- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在渲染巴恩斯利蕨类植物分形时,我想出单色图像或最多四色图像,即左下角、右下角、底部茎和其余叶子。例如,这是我得到的图像:
然而,我想要的是给叶子带来阴影并使茎变粗并具有不同的颜色,例如:
我深入了解了一些可以使用的算法,然后我阅读了 Draves's paper about fractal flames在迭代函数系统的迭代过程中,如果我们使用单一颜色,一个点可能会被渲染多次,这会导致信息丢失,因此我们需要创建一个点被渲染多少次的直方图,然后执行渲染通过使用颜色深浅对数密度着色的直方图。
我已将自己带到了直方图的地步,但不知道如何使用它来渲染阴影或使用对数密度渲染技术。 有人可以帮助我进行这种类型的渲染,或者至少指导我找到一个来源,在那里我可以通过实际示例阅读更多相关信息。
这是我尝试过的:
AffineTransformation f1 = new AffineTransformation(0,0,0,0.25,0,-0.4);
AffineTransformation f2 = new AffineTransformation(0.95,0.005,-0.005,0.93,-0.002,0.5);
AffineTransformation f3 = new AffineTransformation(0.035,-0.2,0.16,0.04,-0.09,0.02);
AffineTransformation f4 = new AffineTransformation(-0.04,0.2,0.16,0.04,0.083,0.12);
int N=Width*Height;
int pixelhistogram[] = new int[N];
for(int i=0;i< N*25;i++)
{
Point newpoint = new Point();
double probability = Math.random();
if(probability < 0.01)
{
newpoint = f1.transform(point);
}
else if(probability < 0.94)
{
newpoint = f2.transform(point);
}
else if(probability < 0.97)
{
newpoint = f3.transform(point);
}
else
{
newpoint = f4.transform(point);
}
point = newpoint;
// Translating the point to pixel in the image and
// incrementing that index in the pixelHistogram array by 1
// W and H are the Width and Height
int X=((int)(point.getX()*W/3)+W/2)/2 + W/4-1;
int Y=H-((int)(point.getY()*H/8) + H/9) -1;
pixelhistogram[W*Y+X]++;
}
// Now that I have the pixelhistogram
// I don't know how to render the shades using this
AffineTransformation
是一个对点执行仿射变换的简单类。我省略了代码,否则问题会变得太长。
最佳答案
一种简单的着色方法是根据像素 [W*Y+X] 小于 n1、介于 n1 和 n2 之间还是大于 n2,将像素 (X,Y) 渲染为浅绿色、绿色或棕色。要确定 n1 和 n2,反复试验可能是最简单的解决方案,但您可以制作 actual histogram您记录的像素计数日志的一部分,以帮助判断将切口放置在何处(或者更一般地说,您可以使用聚类算法自动执行此操作)。
PS:在您显示的图像中,看起来茎是用 L 系统渲染的,而叶状体是仅使用三叶变换渲染的(即省略第四个“茎变换”);我猜他们正在使用对数像素计数来遮蔽绿色级别,而不是遮蔽茎干。
添加:下面我被要求讨论对数直方图。为避免陷入困境,我建议首先使用 R 等功能齐全的数据分析软件,看看它是否能满足您的需求。将像素数组写到文本文件中,每行一个数字,然后启动 R 并运行:
ct=scan('pixels_data.txt')
hist(log(ct))
如果您看到一个多峰直方图(即如果它有清晰的峰谷),这将建议如何选择 n1 和 n2:将它们放在谷值中(即如果图上的谷值位于 y 处,则设置 n1= exp(y)).
如果您最终用 Java 绘制直方图,显然可以使用 Jfreechart 来完成软件。只需用像素数组中的值的日志创建一个数组,然后从中创建直方图。
如果您使用标准的 3 变换巴恩斯利蕨,我希望您最多只能在直方图中看到一个谷,将真正高的茎值与叶状物分开。要为叶子着色,如果 n 是叶子和茎之间的切口,并且 pixels[W*Y+X] 小于 n,您可以使用以下方法着色:
v=128.0*(log(n)-log(pixels[W*Y+X]))/log(n);
RGB=(v,255,v)
PS:仅使用随机迭代算法获得粗茎将是一个问题。如果您将第 3 次变换更改为不那么单一,您的茎最终会看起来像细细的蕨类植物,而不是 Twig 。例如
{"title":"Thick Stem Fern","alist":[[
[0.11378443003074948,-0.005060836319767042,0.013131296101198788,0.21863066144310556,0.44540023470694723,0.01726296943557673],
[0.15415337683611596,-0.17449052243042712,0.23850452316465576,0.2090228040695959,0.3652068203134602,0.11052918709831461],
[-0.09216684947824424,0.20844742602316002,0.2262266208270773,0.22553569847678284,0.6389950926444947,-0.008256440681230735],
[0.8478159879190097,0.027115858923993468,-0.05918196850293869,0.8521840120809901,0.08189073762585078,0.1992198482087391]
]],"va":[1,0,0,1,0,0],"word_length":6,"level_max":40,"rect_size":1}
是 json data描述:
关于java - 为巴恩斯利蕨分形着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24156288/
我是一名优秀的程序员,十分优秀!