Как да добавя две триъгълни мрежи заедно в javafx?

Правя 3D модел на обема, генериран от две функции: едната като основа (в пресечната точка на оста x), а другата като височина на обема. Това се постига чрез приближаване на обема на малки части, чертане тази мрежа, след което добавяне на всички мрежи заедно. Не мога обаче да разбера как да добавя мрежите заедно.

Ето моят създател на мрежа:

 private TriangleMesh createVolume(double start, double end, double numSteps, PolynomialFunction base, PolynomialFunction height) {
    TriangleMesh m = new TriangleMesh();

    double stepSize = (end-start)/numSteps;

    for(double i = start; i < end; i += stepSize) {

        double x = i;
        double x2 = x+stepSize;
        double gx = height.value(x);
        double gx2 = height.value(x2);
        double fx = base.value(x);
        double fx2 = base.value(x2);


        TriangleMesh t = createVolumeSection(x,x2,gx,gx2,fx,fx2);
        m.getPoints().addAll(t.getPoints());
        m.getTexCoords().addAll(t.getTexCoords());
        m.getFaces().addAll(t.getFaces());
    }

    return m;
}


private TriangleMesh createVolumeSection(double xVal, double x2Val, double gxVal, double gx2Val,
                                         double fxVal, double fx2Val){
    TriangleMesh m = new TriangleMesh();
    float x = ((float)xVal) ;
    float x2 = ((float)x2Val);
    float gx = ((float)gxVal);
    float gx2 = ((float)gx2Val);
    float fx = ((float)fxVal);
    float fx2 = ((float)fx2Val);

    //create Points
    m.getPoints().addAll(
            x,  0,  0,      // A = 0
            x,  0,  gx,     // B = 1
            x2, 0,  0,      // C = 2
            x2, 0,  gx2,    // D = 3
            x,  fx, 0,      // E = 4
            x,  fx, gx,     // F = 5
            x2, fx2,0,      // G = 6
            x2, fx2,gx2     // H = 7
    );

    m.getTexCoords().addAll(0,0);

    m.getFaces().addAll(
            0 , 0 , 1 , 0 , 3 , 0 ,     // A-B-D
            0 , 0 , 3 , 0 , 2 , 0 ,     // A-D-C
            0 , 0 , 2 , 0 , 6 , 0 ,     // A-C-G
            0 , 0 , 6 , 0 , 4 , 0 ,     // A-G-E
            0 , 0 , 4 , 0 , 1 , 0 ,     // A-E-B
            1 , 0 , 4 , 0 , 5 , 0 ,     // B-E-F
            1 , 0 , 5 , 0 , 7 , 0 ,     // B-F-H
            1 , 0 , 7 , 0 , 3 , 0 ,     // B-H-D
            3 , 0 , 7 , 0 , 6 , 0 ,     // D-H-G
            3 , 0 , 6 , 0 , 2 , 0 ,     // D-G-C
            6 , 0 , 7 , 0 , 5 , 0 ,     // G-H-F
            6 , 0 , 5 , 0 , 4 , 0       // G-F-E
    );

    return m ;
}

Предполага се, че това ще създаде поредица от десни трапецовидни призми, но в крайна сметка ще изчертае само първата мрежа в поредицата.

Може ли някой да помогне?

Благодаря ви предварително.


person thblackhelmetman    schedule 19.05.2015    source източник
comment
Можете ли да предоставите полиномните функции, които използвате? (Няма време да разбера разумни връщани стойности за тези...)   -  person Marco13    schedule 19.05.2015
comment
@Marco13 моята функция tes е x^2   -  person thblackhelmetman    schedule 19.05.2015


Отговори (1)


Вашият подход е почти правилен, но не успявате да актуализирате информацията на масива с лица.

С всяка обемна секция, която добавите, вие добавяте нови върхове към крайната мрежа, така че индексите на върховете в масива от лица трябва да бъдат съответно изместени. За целта поддържайте брояч на общия брой добавени точки за n-1 тома:

private int points=0;

private TriangleMesh createVolume(double start, double end, double numSteps, Function<Number,Number> base, Function<Number,Number> height) {
    ...
    TriangleMesh t = createVolumeSection(x,x2,gx,gx2,fx,fx2);
    m.getPoints().addAll(t.getPoints());
    points=m.getPoints().size()/3;
    ...
}

и след това променете масива с лица:

private TriangleMesh createVolumeSection(double xVal, double x2Val, double gxVal, double gx2Val,
                                         double fxVal, double fx2Val){
    TriangleMesh m = new TriangleMesh();
    ...
    m.getFaces().addAll(
            points+0 , 0 , points+1 , 0 , points+3 , 0 ,     // A-B-D
            points+0 , 0 , points+3 , 0 , points+2 , 0 ,     // A-D-C
            points+0 , 0 , points+2 , 0 , points+6 , 0 ,     // A-C-G
            points+0 , 0 , points+6 , 0 , points+4 , 0 ,     // A-G-E
            points+0 , 0 , points+4 , 0 , points+1 , 0 ,     // A-E-B
            points+1 , 0 , points+4 , 0 , points+5 , 0 ,     // B-E-F
            points+1 , 0 , points+5 , 0 , points+7 , 0 ,     // B-F-H
            points+1 , 0 , points+7 , 0 , points+3 , 0 ,     // B-H-D
            points+3 , 0 , points+7 , 0 , points+6 , 0 ,     // D-H-G
            points+3 , 0 , points+6 , 0 , points+2 , 0 ,     // D-G-C
            points+6 , 0 , points+7 , 0 , points+5 , 0 ,     // G-H-F
            points+6 , 0 , points+5 , 0 , points+4 , 0       // G-F-E
    );

    return m ;
}
person José Pereda    schedule 19.05.2015
comment
Опитах това и при изпълнение ми дава предупреждение, че стойностите в масива с лица трябва да са в диапазона от (0 до points.length/3-1). Мрежата също не се рисува изобщо. - person thblackhelmetman; 20.05.2015
comment
Тествах го успешно: TriangleMesh createVolume = createVolume(0, 10, 10, x->Math.sin(x.doubleValue()), x->Math.cos(x.doubleValue())); group.getChildren().addAll(new MeshView(createVolume)); - person José Pereda; 20.05.2015
comment
Възможно ли е точките да имат допълнителни индекси, така че предупреждението да не се появява, след което да добавите точките от определен индекс. - person thblackhelmetman; 20.05.2015
comment
Или трябва да премахна спомагателния метод и да прехвърля кода към метода с цикъла? Това би направило така, че целият масив от точки да се актуализира, така че индексите на лицата също да се актуализират едновременно. - person thblackhelmetman; 20.05.2015
comment
Няма значение, разбрах, че трябва да нулирам точките на 0 при всяко извикване на метода. Да. Благодаря ви много за помощта. - person thblackhelmetman; 20.05.2015