1

我想知道我将构造函数参数理解为Function<Point2D, Number> function. 我用于 1D 图表的函数基于在 x 轴上的每一步之后应用变量,但是作为Point2D包含 2 个变量的参数:x并且y,如果我是正确的,x变量是增加“0.5”的步骤apply在 y 的函数之后的每个计算。那么泛型类型的第二个参数是Number什么?我如何使用SurfacePlotMesh该类来实现其他功能。有人可以向我解释一下它是如何工作的吗?或链接文档(如果存在)?

4

1 回答 1

3

如果您查看SurfacePlotMeshFXyz中的代码,您会发现createPlotMesh()一种基于平面网格 (x, y) 上的两个坐标(取自该Point2D坐标)和一个函数值 (z),由应用于该点的函数给出。

如果您查看默认参数:

private static final Function<Point2D, Number> DEFAULT_FUNCTION = 
    p -> Math.sin(p.magnitude()) / p.magnitude();

private static final double DEFAULT_X_RANGE = 10; // -5 +5
private static final double DEFAULT_Y_RANGE = 10; // -5 +5
private static final int DEFAULT_X_DIVISIONS = 64;
private static final int DEFAULT_Y_DIVISIONS = 64;
private static final double DEFAULT_FUNCTION_SCALE = 1.0D;

这意味着将有一个 10x10 单位的网格,有 64x64 分区。在总共 65x65 个顶点中的每个顶点 (x,y) 中,我们将评估函数以获得值 z = f(x, y),默认比例为 1。

即,对于左上 2D 点 (-5, -5) -> f(-5, -5) = 1.0025,因此网格的 3D 点将为 (-5, -5, 1.0025),以此类推上。

这张图片显示了一个 10x10 范围的网格,具有 20x20 的分区,以及该功能的比例为 4 的网格。

网格和表面

您可以随时更改功能,例如:

  • p -> p.getX()
  • p -> p.getX() * p.getY()
  • p -> Math.cos(p.getX()) * Math.sin(p.getY())
  • ...

以及其他参数(范围、分区、比例)。

目前没有文档,但代码是完全可用的。

还有一个采样器可以运行大多数示例并修改参数以轻松检查结果,而无需在这里重新编译。

编辑

根据 OP 注释,对于没有y依赖关系的函数,可以通过在 y 上设置非常低的值来创建带状表面:

private void createSurface(double time) {
    surface = new SurfacePlotMesh(
        p-> Math.sqrt(Math.pow(Math.exp(-(Math.pow((p.getX() - time), 2))) * 
            (Math.cos((2 * Math.PI * (p.getX() - time)))), 2) + 
            Math.pow(Math.exp(-(Math.pow((p.getX() - time), 2))) * 
            (Math.sin((2 * Math.PI * (p.getX() - time)))), 2)),
            10, 0.1, 64, 2, 2);
}

其中time参数将设置为固定值或在动画中。

丝带

于 2016-05-17T18:13:11.510 回答