我正在研究相干噪声的各种实现中的一些(我知道有库,但这主要是为了我自己的启发和好奇心)以及如何使用它,并且我对原始的Perlin噪声问题有一个问题.
根据这个经常链接的数学常见问题解答,输出范围将在-1和之间1,但我不明白该值是如何在该范围内.
据我了解,算法基本上是这样的:每个网格点都有一个相关的随机梯度向量长度1.然后,对于每个点,对于所有四个周围网格点,您计算随机梯度的点积和从该网格点开始的矢量.然后使用花式缓动曲线和线性插值将其降低到一个值.
但是,这是我的问题:这些点积有时会超出范围[-1, 1],并且因为你最终在点积之间进行线性插值,这并不意味着最终值有时会在外面范围[-1, 1]?
例如,假设其中一个随机向量(sqrt(2)/2, sqrt(2)/2)(长度为1)和(0.8, 0.8)(以单位平方为单位),您得到粗略的结果1.131.如果在线性插值中使用该值,则生成的值完全可能大于1.事实上,通过我的直接实施,这种情况经常发生.
我在这里错过了什么吗?
作为参考,这是我在Java中的代码.Vec是一个简单的类来做简单的2d矢量算术,fade()是缓和曲线,lerp()是线性插值,并gradient(x, y)给你那个网格点的渐变作为Vec.该gridSize变量为您提供了像素(它的类型是双)网格的大小:
public double getPoint(int x, int y) {
Vec p = new Vec(x / gridSize, y / gridSize);
Vec d = new Vec(Math.floor(p.x), Math.floor(p.y));
int x0 = (int)d.x,
y0 = (int)d.x;
double d00 = gradient(x0 , y0 …Run Code Online (Sandbox Code Playgroud) 我对C++很陌生,我对一些关于复制的C++约定有疑问.我已经google了一下,并没有真正找到这方面的良好指导,所以我转向你们好人.
假设您有一个对象代表一些技术上可复制的资源,但副本很昂贵,而且几乎总是错误的.你还应该为它实现一个拷贝构造函数吗?或者更好的做一个类似的成员函数make_copy()(对于你想要复制对象的极少数时间).
例如:假设您有一个表示存储在视频内存中的纹理的类.此资源在技术上是可复制的:您可以为其创建新句柄并复制内存(通过CPU或使用图形库调用).但总的来说,这不是你真正想做的事情.它很昂贵,而且通常做错了,而且可能非常浪费内存.但是,你可以想象它有意义的角落情况:截取屏幕截图并在其上应用过滤器.这些案件很少见,但它们会存在.
我之所以犹豫是否正在制作这样做的复制构造函数的原因是我觉得C++有点太急于复制东西了.也许它反映了这样一个事实:我对这种语言有点新意,但是因为C++会在各种情况下调用复制构造函数,而你可能不会这样做.喜欢:
void some_method(Texture t)
{
...
}
Texture t(<arguments>);
Texture t2 = t; // calls copy constructor
some_method(t2); // calls copy constructor
Run Code Online (Sandbox Code Playgroud)
我更倾向于这两行调用复制构造函数是编译器错误(因为我觉得它们很容易犯错误)并且如果你想真正制作副本,你需要非常明确地使用它并使用专用的会员功能.
这有什么标准做法吗?关于何时(而且不应该)编写复制构造函数的一些圣人建议?我错过了一些Scott Meyers的章节?或者我应该尽可能地做到这一点?
编辑:要清楚我的例子:显然,你应该通过引用传递参数,但我的观点是,这是一个非常容易犯的错误,只是省略了&符号.如果你这样做,编译器将很乐意用一个非常昂贵的副本替换廉价的pass-by-reference,我宁愿编译器不这样做.但我不知道,也许这不是人们通常在C++中犯的错误,而且我过于谨慎?
我正在尝试学习 SwiftUI,并且有一个关于如何制作一个带有手柄的组件的问题,您可以用它来拖动。网上有几个关于如何制作可拖动组件的教程,但没有一个能够准确回答我的问题,所以我想我应该寻求你们这些好人的智慧。
假设您有一个类似于带有标题栏的窗口的视图。为了简单起见,让我们像这样:
struct WindowView: View {
var body: some View {
VStack(spacing:0) {
Color.red
.frame(height:25)
Color.blue
}
}
}
Run Code Online (Sandbox Code Playgroud)
即顶部红色部分为标题栏,蓝色区域为组件主体。现在,该窗口视图包含在另一个视图内,您可以将其拖动。根据我的阅读方式,你应该这样做(非常简单):
struct ContainerView: View {
@State private var loc = CGPoint(x:150, y:150);
var body: some View {
ZStack {
WindowView()
.frame(width:100, height:100)
.position(loc)
.gesture(DragGesture()
.onChanged { value in
loc = value.location
}
)
}
}
}
Run Code Online (Sandbox Code Playgroud)
这确实可以让你拖动组件(暂时忽略,我们总是在图像的中心拖动,这不是重点):
然而,这不是我想要的:我不希望您能够通过在窗口内拖动来拖动组件,我只想通过拖动红色标题栏来拖动它。但红色标题栏隐藏在 WindowView 内部的某个位置。我不想将@State包含位置的变量移动到 WindowView 内部,在我看来,将其放在 ContainerView 内部更合乎逻辑。但随后我需要以某种方式将手势转发到嵌入的标题栏中。
我想最好的方法是 ContainerView 看起来像这样:
struct ContainerView: View {
@State private var loc = CGPoint(x:150, y:150); …Run Code Online (Sandbox Code Playgroud) 我正在为Windows上的ffmpeg制作一个漂亮的小Python GUI前端(一个专门用于将视频转换为iPhone友好格式并自动将其导入iTunes并标记它),我希望它能够工作以便你可以如果你愿意,暂停进程并恢复它.
由于我将ffmpeg作为一个单独的进程启动,显而易见的解决方案是程序暂停进程(我知道可以在Windows中使用,Process Explorer可以执行此操作),但我无法弄清楚如何执行此操作.有没有人知道如何在Python中这样做?
在ImageMagick 文档中,它说如果您在montage没有任何花哨选项的情况下使用,它应该只是排列您的图像,没有任何装饰并有一些间距。
那不会发生在我身上。这是我的两个输入图像:
\n\n\n\n这是两个独立的 PNG,尺寸均为 100x100,具有红色背景。现在,如果我运行,它会生成一个如下所示的montage 1.png 2.png out.png图像文件:out.png
您可能会注意到,那里有标签。我已经尝试了所有方法,但无法删除这些标签。例如,添加-label ""到命令中会产生以下结果:
由于白色背景,这并不明显,但标签的空间仍然是图像的一部分,那里什么也没有。
\n\n最终结果是我想紧密地打包这些图像(因此这两个图像将生成 200x100 png),并且我希望命令是这样的:montage -geometry 100x100+0+0 -label "" -background blue 1.png 2.png out3.png这里我将背景设为蓝色以突出显示“标签”区域,在最终版本中它应该是不必要的。这就是该命令产生的结果:
图像大小为 200x118,表示为标签添加了 18 个像素。删除命令的标签参数除了使标签成为数字之外没有任何作用。我想我有点失去理智了,我已经尝试了这个命令的几十种变体,但没有什么可以摆脱“标签空间”。鉴于它们默认显示,并且文档表明它不应该显示,我开始怀疑它是 ImageMagick 中的错误,但再次:失去了理智。我想我可能只是错过了一些明显的东西。
\n\n我在 macOS 上通过 Homebrew 安装了 ImageMagick,尽管我尝试直接从他们的网站使用该版本,但它不起作用。报道是这样的montage -version:
Version: ImageMagick 7.0.5-7 Q16 x86_64 2017-05-20 http://www.imagemagick.org\nCopyright: \xc2\xa9 1999-2017 ImageMagick Studio LLC\nLicense: http://www.imagemagick.org/script/license.php\nFeatures: Cipher DPC HDRI Modules\nDelegates …Run Code Online (Sandbox Code Playgroud)