小编Osk*_*kar的帖子

输出范围为Perlin噪音

我正在研究相干噪声的各种实现中的一些(我知道有库,但这主要是为了我自己的启发和好奇心)以及如何使用它,并且我对原始的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)

java perlin-noise

8
推荐指数
1
解决办法
3802
查看次数

在C++中,如果复制一个对象是可能的,但是真的很贵并且通常是一个坏主意,你是否还应该使用复制构造函数实现复制?

我对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++中犯的错误,而且我过于谨慎?

c++

7
推荐指数
2
解决办法
260
查看次数

在 SwiftUI 视图内创建拖动手柄(用于可拖动窗口等)

我正在尝试学习 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)

swift swiftui

6
推荐指数
1
解决办法
2556
查看次数

暂停Windows中的进程

我正在为Windows上的ffmpeg制作一个漂亮的小Python GUI前端(一个专门用于将视频转换为iPhone友好格式并自动将其导入iTunes并标记它),我希望它能够工作以便你可以如果你愿意,暂停进程并恢复它.

由于我将ffmpeg作为一个单独的进程启动,显而易见的解决方案是程序暂停进程(我知道可以在Windows中使用,Process Explorer可以执行此操作),但我无法弄清楚如何执行此操作.有没有人知道如何在Python中这样做?

python windows

2
推荐指数
1
解决办法
2313
查看次数

ImageMagick 蒙太奇始终包含标签

ImageMagick 文档中,它说如果您在montage没有任何花哨选项的情况下使用,它应该只是排列您的图像,没有任何装饰并有一些间距。

\n\n

那不会发生在我身上。这是我的两个输入图像:

\n\n

图片1\n在此输入图像描述

\n\n

这是两个独立的 PNG,尺寸均为 100x100,具有红色背景。现在,如果我运行,它会生成一个如下所示的montage 1.png 2.png out.png图像文件:out.png

\n\n

输出.png

\n\n

您可能会注意到,那里有标签。我已经尝试了所有方法,但无法删除这些标签。例如,添加-label ""到命令中会产生以下结果:

\n\n

输出2.png

\n\n

由于白色背景,这并不明显,但标签的空间仍然是图像的一部分,那里什么也没有。

\n\n

最终结果是我想紧密地打包这些图像(因此这两个图像将生成 200x100 png),并且我希望命令是这样的:montage -geometry 100x100+0+0 -label "" -background blue 1.png 2.png out3.png这里我将背景设为蓝色以突出显示“标签”区域,在最终版本中它应该是不必要的。这就是该命令产生的结果:

\n\n

输出3.png

\n\n

图像大小为 200x118,表示为标签添加了 18 个像素。删除命令的标签参数除了使标签成为数字之外没有任何作用。我想我有点失去理智了,我已经尝试了这个命令的几十种变体,但没有什么可以摆脱“标签空间”。鉴于它们默认显示,并且文档表明它不应该显示,我开始怀疑它是 ImageMagick 中的错误,但再次:失去了理智。我想我可能只是错过了一些明显的东西。

\n\n

我在 macOS 上通过 Homebrew 安装了 ImageMagick,尽管我尝试直接从他们的网站使用该版本,但它不起作用。报道是这样的montage -version

\n\n
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)

imagemagick imagemagick-montage

1
推荐指数
1
解决办法
1595
查看次数