3

我目前正在使用 ILNumerics API 并开始在立方体中绘制几个点。然后我通过这些点计算了一个回归平面。现在我想在同一个场景图中绘制平面,但大小与点云相同。

我得到了飞机的参数 (a,b,c): f(x,y) = a*x + b*y + c; 我知道只有 z 对绘制平面很有趣,但我不知道如何将正确的坐标传递到场景中,以使平面大小与点的最大和最小区域的大小大致相同。

你们能给我一个简单的例子来绘制一个平面,以及如何正确设置该平面的边界吗?

这是我到目前为止得到的:

        private void ilPanel1_Load(object sender, EventArgs e)
    {
           // get the X and Y bounds and calculate Z with parameters

           // plot it!
            var scene = new ILScene {
              new ILPlotCube(twoDMode: false) {
                new ILSurface( ??? ) {
                }
              }
            };

           // view angle etc
            scene.First<ILPlotCube>().Rotation = Matrix4.Rotation(
            new Vector3(1f, 0.23f, 1), 0.7f);

        ilPanel1.Scene = scene; 
    }

我希望有人可以帮助我......提前谢谢!

4

1 回答 1

2

您可以使用 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;
}

这将创建一个类似于此的图像:

平面通过点与 ILNumerics

@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
};
于 2013-10-27T17:46:58.353 回答