ILNumerics строит плоскость в определенном месте

В настоящее время я играю с 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; 
    }

Я надеюсь, что кто-то может мне помочь ... Заранее спасибо !!!


person GeoGecco    schedule 27.10.2013    source источник


Ответы (1)


Вы можете взять Пределы группы plotcube.Plots и вывести из нее координаты из ограничивающей рамки. Это дает вам минимальную и максимальную координаты x и y для плоскости. Используйте их, чтобы получить соответствующие значения z, оценив уравнение плоскости.

Когда у вас есть x, y и z плоскости, используйте их с ILSurface для построения плоскости.

Если вам нужна дополнительная помощь, я могу попытаться добавить пример.

@Edit: в следующем примере плоскость строится через 3 произвольные точки. Ориентация и положение плоскостей вычисляются с помощью функции плоскости zEval. Его коэффициенты a,b,c вычисляются здесь по 3 (конкретным) точкам. Здесь вам придется вычислить собственные коэффициенты уравнения.

Плоскость реализована с поверхностью. С тем же успехом можно взять 4 координаты, вычисленные в «P», и использовать 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
};
person Haymo Kutschbach    schedule 27.10.2013
comment
Я был бы очень признателен за пример... Я знаю, как строить точки, но я до сих пор не понимаю, как передать правильный массив методу ILSurface()... Я пробовал это с простыми данными, но это никогда не работало так, как я этого хотел. В Matlab мне нужно сгенерировать координаты x и y, такие как x = -1: 0,01: 1 и т. д., а z просто нужна приведенная выше формула с координатами диапазона x и y. не могли бы вы привести простой пример? - person GeoGecco; 27.10.2013
comment
Поскольку вы хотите построить только плоскость, данные на поверхность будут только 2x2x3: каждый срез 2x2 дает 4 значения координат для Z, X и Y (в указанном порядке). Документ находится здесь: ilnumerics.net/surface-plots.html - person Haymo Kutschbach; 27.10.2013
comment
Извини, Хеймо, но я не понимаю. Зачем мне 4 координаты для каждой оси координат? То есть мне нужно 3 среза 2x2 внутри массива? Как {{z z}, {z z}, {x x}, {x x}, {y y}, {y y}} ??? это не имеет для меня никакого смысла =D извините. для меня что-то вроде этого: {{minRangeX maxRangeX}, {minRangeY maxRangeY}, {Z(XY)}} имело бы смысл... у вас есть небольшой пример с 12 координатами? извините за беспокойство :D - person GeoGecco; 28.10.2013
comment
просто супер Хаймо!!! но у меня последний вопрос =). Как только я рисую поверхность, отношения куба меняются на результат непонимания. Я хотел бы сохранить отношения куба такими, какие они есть, как только я нарисую точки на кубе. Это большое дело? или, может быть, просто установить его без настройки отношения или что-то в этом роде? - person GeoGecco; 28.10.2013
comment
работает нормально=). Вы мне очень помогли! Продолжайте хорошую работу! - person GeoGecco; 30.10.2013