- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所以在过去的几个小时里,我一直在尝试用 Dart 制作一个简单的 Perlin 噪声发生器。为此,我决定在 this page 上使用二维生成的伪代码。 (很棒的阅读!)
这是我的 Dart 实现的样子:http://pastebin.com/NZF0U6ju
不幸的是,当我渲染到 Canvas 时,我只会得到随机生成的对角线,如下图所示:
为了渲染图像,我使用了以下脚本:
void main() {
PerlinNoise p = new PerlinNoise(octaves:5);
CanvasElement c = query('canvas');
CanvasRenderingContext2D con = c.context2D;
ImageData id= con.createImageData(1,1);
List d= id.data;
d[3]=255;
for (var i=0;i<c.width;i++) {
for (var j=0;j<c.height;j++) {
int val = (p.perlinNoise(i.toDouble(), j.toDouble())*200).toInt();
d[0] = val;
d[1] = val;
d[2] = val;
con.putImageData(id, i, j);
}
}
}
有谁知道导致此行为的原因以及我的实现哪里出错了?
最佳答案
我在你的代码中看到了一些问题:
double fracY = y-intY;
而不是 double fracY = x-intY;
_noise
函数是对称的:_noise(x, y) == _noise(y, x)
。文章使用了非对称的x+y*57
。_interpolatedNoise
、_smoothNoise
和 _noise
应该采用额外的 i
参数。Each iteration calls a different noise function, denoted by Noisei.
编辑:这是实现 2D Perlin 噪声的尝试:
_noise
的实现perlinNoise
需要调用 0 到 1 之间的数字(参见 main
)import 'dart:html';
import 'dart:math' as Math;
class PerlinNoise {
int _octaves;
double _persistence;
Map<int, Map<int, Map<int, double>>> _noises = {};
final _rand = new Math.Random();
PerlinNoise({int octaves: 1, double persistence:1.0}) :
_octaves = octaves,
_persistence = persistence;
double _noise(int i, int x, int y) =>
_noises.putIfAbsent(i, () => {})
.putIfAbsent(x, () => {})
.putIfAbsent(y, () => 2 * _rand.nextDouble() - 1);
double _smoothNoise (int i, int x, int y) {
double corners = (_noise(i, x - 1, y - 1) +
_noise(i, x + 1, y - 1) +
_noise(i, x - 1, y + 1) +
_noise(i, x + 1, y + 1)) / 16;
double sides = (_noise(i, x - 1, y ) +
_noise(i, x + 1, y ) +
_noise(i, x , y - 1) +
_noise(i, x , y + 1)) / 8;
double center = _noise(i, x, y) / 4;
return corners + sides + center;
}
double _interpolate (double a,double b,double x) {
double ft = x * Math.PI;
double f = (1 - Math.cos(ft)) * 0.5;
return a * (1 - f) + b * f;
}
double _interpolatedNoise (int i, num x, num y) {
int intX = x.floor();
int intY = y.floor();
double fracX = (x - intX).toDouble();
double fracY = (y - intY).toDouble();
double v1 = _smoothNoise(i, intX , intY );
double v2 = _smoothNoise(i, intX + 1, intY );
double v3 = _smoothNoise(i, intX , intY + 1);
double v4 = _smoothNoise(i, intX + 1, intY + 1);
double i1 = _interpolate(v1, v2, fracX);
double i2 = _interpolate(v3, v4, fracX);
return _interpolate(i1, i2, fracY);
}
double perlinNoise(num x, num y) {
var total = 0;
for (var i = 0; i < _octaves; i++) {
int frequency = Math.pow(2, i);
double amplitude = Math.pow(_persistence, i);
total += _interpolatedNoise(i, x * frequency, y * frequency) * amplitude;
}
return total;
}
}
void main() {
PerlinNoise p = new PerlinNoise(octaves: 5, persistence: 0.9);
CanvasElement c = query('canvas');
CanvasRenderingContext2D con = c.context2D;
ImageData id = con.createImageData(1,1);
List d = id.data;
d[3] = 255;
for (var i = 0; i < c.width; i++) {
for (var j = 0; j < c.height; j++) {
// my canvas is 256px x 256px
int val = (128 + 128 * p.perlinNoise(i / 256.0, j / 256.0)).toInt();
d[0] = val;
d[1] = val;
d[2] = val;
con.putImageData(id, i, j);
}
}
print('done');
}
关于algorithm - Dart 实现失败的 Perlin 噪音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19102602/
我今天尝试使用噪声在处理中生成伪随机角度,但它没有像我希望的那样工作。 float xoff = 0; float inc = 0.01; void draw(){ float vx = cos(
我正在使用 OpenCV 和 Python 处理图像。我需要去除图像中的点/噪声。 我尝试了使点变小的膨胀,但是文本被损坏了。我还尝试了两次循环扩张和一次腐 eclipse 。但这并没有给出令人满意的
我需要使用我编写的 perlin 噪声程序在 Java 中生成 3D 行星(球体)的纹理。但问题是左侧和右侧需要相同,上下也必须相同,这样您才能将纹理放在球体上。 我无法将柏林噪声源放在这里,因为它太
我想构建一个 android 应用程序,它可以识别我的声音,将其转换为文本,并显示我刚刚说的 toast 。我可以通过使用一个按钮来为我启动语音识别器来做到这一点。但现在我想让它只根据我的声音工作。
嗨,我正在使用我发现的算法来生成柏林噪声。我想做的是用更少的曲线创建更锐利的边缘Picture 。 private static final double F2 = 0.5*(Math.sqr
我正在尝试用 C++ 编写一个程序来播放一个小的 .wav 文件。我已经按照 DirectX SDK 文档对其进行了编程,以在辅助静态缓冲区上编写和播放。它运行正常,除了在任何 .wav 文件播放结束
在这个 short video 中听我的问题. 现在我更详细地解释: 在那个视频中,我已经播放了(点击按钮)一个音频文件三次,连续两次,最后一次有一点停顿。第一次听起来像 radio 正在调谐,第二次
所以在过去的几个小时里,我一直在尝试用 Dart 制作一个简单的 Perlin 噪声发生器。为此,我决定在 this page 上使用二维生成的伪代码。 (很棒的阅读!) 这是我的 Dart 实现的样
我正在为 android 开发一个 OCR 应用程序(构建为 java 应用程序)。我想从相机捕获的图像中检测文本并进行预处理我正在使用 OpenCV,但我得到了一些额外的行,这些行被读取为文本,我采
我正在使用 Ruby on Rails 3.1.1 和 pg gem。 在我的 Gemfile.lock 中,这是我拥有的 pg (0.11.0) 我的日志中充满了如下所示的信息。我没有用 sqlit
我在 javascript 中创建了一个带有实时对话模块的应用程序。我正在使用 WebRTC 设置对等连接。信号和候选人似乎都工作正常。对等点不在同一个网络上。 在某些时候,音频开始向流中添加点击。质
我在基于 android 的 csipsimple 应用程序中使用了一个 PJSIP 库。除一个问题外,一切正常。当我打开扬声器时,通话中有很多回声/噪音,无法进行通话。可能是什么问题以及如何处理这个
当您按下 alt+几乎任何其他键时,它会发出 clang 。噪音说“你已经尝试做一些你做不到的事情” 我想在多个组合中使用 alt 键作为网络应用程序的键盘快捷键。 尽管在按下 alt+* 时有一些事
我的目标是创建一个 SDL 窗口,绘制不同的波形并播放该波的不确定声音。通过按下特定的键,可以修改波的幅度、频率或波形等参数。 问题在于,即使是绘制时看起来不错的简单正弦波,听起来也很嘈杂。我不明白为
我收到大量这样的消息,围绕着我故意不支持的 SSL 协议(protocol),例如SSLv3、TLS1.0 等 2020-02-06 13:08:30,600 ERROR [io.undertow.r
我有错误s的情况通常是从 3rd-party JS 发出的,例如 Chartbeat 等。我想捕获并丢弃/静音这些错误以及相关的噪音。 所有此类 3rd 方脚本都会执行以下操作: 创建 DOM 标签
我对新 ffmpeg 中的重采样结果感到困惑。我将 AAC 音频解码为 PCM,ffmpeg 显示音频信息为: Stream #0:0: Audio: aac, 44100 Hz, stereo, f
我是一名优秀的程序员,十分优秀!