SurfacePlotMesh (FXyz) 构造函数参数
SurfacePlotMesh (FXyz) constructor arguments
我想知道我将构造函数参数理解为 Function<Point2D, Number> function
是否正确。
我用于一维图表的函数基于在 x 轴上的每一步之后应用变量,但是作为参数 Point2D
包含 2 个变量:x
和 y
,如果我是正确的 x
变量是在 apply
y 函数之后的每次计算增加“0.5”的步骤。
那么泛型的第二个参数 Number
是什么?
我如何使用SurfacePlotMesh
class 实现其他功能。有人可以向我解释一下它是如何工作的吗?或 link 文档(如果存在)?
如果您查看 FXyz library 中 SurfacePlotMesh
的代码,您会发现 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) -> f(-5, -5) = 1.0025 的左上角 2D 点,因此网格的 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())
- ...
以及其他参数(范围、分度、刻度)。
目前没有文档,但代码是完全可用的。
还有一个采样器 运行 大多数样本并修改参数以轻松检查结果而无需重新编译 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
参数将设置为固定值或在动画中设置。
我想知道我将构造函数参数理解为 Function<Point2D, Number> function
是否正确。
我用于一维图表的函数基于在 x 轴上的每一步之后应用变量,但是作为参数 Point2D
包含 2 个变量:x
和 y
,如果我是正确的 x
变量是在 apply
y 函数之后的每次计算增加“0.5”的步骤。
那么泛型的第二个参数 Number
是什么?
我如何使用SurfacePlotMesh
class 实现其他功能。有人可以向我解释一下它是如何工作的吗?或 link 文档(如果存在)?
如果您查看 FXyz library 中 SurfacePlotMesh
的代码,您会发现 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) -> f(-5, -5) = 1.0025 的左上角 2D 点,因此网格的 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())
- ...
以及其他参数(范围、分度、刻度)。
目前没有文档,但代码是完全可用的。
还有一个采样器 运行 大多数样本并修改参数以轻松检查结果而无需重新编译 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
参数将设置为固定值或在动画中设置。