您可以使用 plotcube.Plots 组的 Limits 并从中获取边界框的坐标。这为您提供了平面的最小和最大 x 和 y 坐标。使用它们通过评估平面方程来获得相应的 z 值。
获得平面的 x、y 和 z 后,将它们与 ILSurface 一起使用来绘制平面。
如果您需要更多帮助,我可以尝试添加一个示例。
@Edit:以下示例通过 3 个任意点绘制平面。平面方向和位置是通过平面函数 zEval 计算的。它的系数 a,b,c 是从 3 个(具体)点计算出来的。您必须在此处计算自己的方程系数。
平面是用一个表面来实现的。不妨采用在“P”中计算的 4 个坐标并使用 ILTriangleFan 和 ILLineStrip 来创建平面和边界。但是表面已经带有一个填充和一个线框,所以我们把它作为一个快速的解决方案。
private void ilPanel1_Load(object sender, EventArgs e) {
// 3 arbitrary points
float[,] A = new float[3, 3] {
{ 1.0f, 2.0f, 3.0f },
{ 2.0f, 2.0f, 4.0f },
{ 2.0f, -2.0f, 2.0f }
};
// construct a new plotcube and plot the points
var scene = new ILScene {
new ILPlotCube(twoDMode: false) {
new ILPoints {
Positions = A,
Size = 4,
}
}
};
// Plane equation: this is derived from the concrete example points. In your
// real world app you will have to adopt the weights a,b and c to your points.
Func<float, float, float> zEval = (x, y) => {
float a = 1, b = 0.5f, c = 1;
return a * x + b * y + c;
};
// find bounding box of the plot contents
scene.Configure();
var limits = scene.First<ILPlotCube>().Plots.Limits;
// Construct the surface / plane to draw
// The 'plane' will be a surface constructed from a 2x2 mesh only.
// The x/y coordinates of the corners / grid points of the surface are taken from
// the limits of the plots /points. The corresponding Z coordinates are computed
// by the zEval function. So we give the ILSurface constructor not only Z coordinates
// as 2x2 matrix - but an Z,X,Y Array of size 2x2x3
ILArray<float> P = ILMath.zeros<float>(2, 2, 3);
Vector3 min = limits.Min, max = limits.Max;
P[":;:;1"] = new float[,] { { min.X, min.X }, { max.X, max.X } };
P[":;:;2"] = new float[,] { { max.Y, min.Y }, { max.Y, min.Y } };
P[":;:;0"] = new float[,] {
{ zEval(min.X, max.Y) , zEval(min.X, min.Y) },
{ zEval(max.X, max.Y) , zEval(max.X, min.Y) },
};
// create the surface, make it semitransparent and modify the colormap
scene.First<ILPlotCube>().Add(new ILSurface(P) {
Alpha = 0.6f,
Colormap = Colormaps.Prism
});
// give the scene to the panel
ilPanel1.Scene = scene;
}
这将创建一个类似于此的图像:
@Edit2:您问,如何在添加曲面时禁用绘图立方体的自动缩放:
// before adding the surface:
var plotCube = scene.First<ILPlotCube>();
plotCube.AutoScaleOnAdd = false;
或者,您可以手动设置多维数据集的限制:
plotCube.Limits.Set(min,max);
您可能还希望禁用某些鼠标交互,因为它们将允许用户以类似(不需要的?)方式重新调整立方体:
plotCube.AllowZoom = false; // disables the mouse wheel zoom
plotCube.MouseDoubleClick += (_,arg) => {
arg.Cancel = true; // disable the double click - resetting for the plot cube
};