SurfacePlotMesh(FXyz)构造函数参数

时间:2016-05-17 17:07:12

标签: java javafx javafx-3d

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

1 个答案:

答案 0 :(得分:3)

如果你看一下FXyz librarySurfacePlotMesh的代码,你会发现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.

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

此图显示了一个10x10范围的网格,20x20格,以及该网格的网格尺度为4。

grid and surface

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

  • p - &gt; p.getX()
  • p - &gt; p.getX()* p.getY()
  • p - &gt; Math.cos(p.getX())* Math.sin(p.getY())
  • ...

以及其他参数(范围,分度,比例)。

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

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

修改

根据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参数将设置为固定值或动画。

ribbon