I am following this tutorial, and I create my leaf mesh:
https://wiki.grogra.de/doku.php?id=tutorials:leaf-triangulation
Now I would like to have a one directional curvature,either upward or downward. Is there a way to do that without editing manually every single point? Something like the command “Scale” that transform the mesh
so I came up with this solution that works pretty well in my case. I have no time to generalize it, but it might easy, or maybe even already generalizable and could be included as a function in groimp. i don’t know
static float curvature =CURVATURE_BLADES_MEAN; // chose the curvature, numbers can be positive or negative
static float baseSpacing = 0.0333333333; //this is the distance between the points on the main vein. I have 31 points so 30 segments. that means the segments length 1/30. This number is relative, then it need to be scaled based on the real area, but after the mesh is created.
static float get_lnorm_curvature(float input, float nr, float LW_ratio){
if(curvature ==0){curvature =0.00000000000001;}
float radians = Math.toRadians(curvature);
float output = LW_ratio*input*2 * Math.cos((nr+1)*radians/2)*Math.sin(nr*radians/2)/Math.sin(radians/2);
return output;
};
static float get_z_axis(float input, int nr,float LW_ratio){
if(curvature ==0){curvature =0.00000000000001;}
float radians = Math.toRadians(curvature);
float output = LW_ratio*2*input * Math.sin((nr+1)*radians/2)*Math.sin(nr*radians/2)/Math.sin(radians/2);
return output;
};
static float getCurvedX(float xDist, float LW_ratio) {
if(curvature ==0){curvature =0.00000000000001;}
float radians = Math.toRadians(curvature);
float nr =xDist / baseSpacing; // key parameter mapping
return LW_ratio*2*baseSpacing
* Math.cos((nr + 1) * radians / 2)
* Math.sin(nr * radians / 2)
/ Math.sin(radians / 2);
}
static float getCurvedZ(float xDist,float LW_ratio) {
if(curvature ==0){curvature =0.00000000000001;}
float radians = Math.toRadians(curvature);
float nr = xDist / baseSpacing; // key parameter mapping
return LW_ratio*2*baseSpacing
* Math.sin((nr + 1) * radians / 2)
* Math.sin(nr * radians / 2)
/ Math.sin(radians / 2);
}
static void Cotyledon(float LW_ratio) {
ArrayList data = new ArrayList();
// Populate the list with the values from the arrays
for (int i = 0; i <= 30; i++) {
float[] lnorm = anyArray(0, get_lnorm_curvature(baseSpacing, i,LW_ratio), get_z_axis(baseSpacing, i,LW_ratio));
data.add(lnorm);
}
lnorm1 = (float[]) data.get( 0 ) ;
lnorm2 = (float[]) data.get( 1 ) ;
lnorm3 = (float[]) data.get( 2 ) ;
lnorm4 = (float[]) data.get( 3 ) ;
lnorm5 = (float[]) data.get( 4 ) ;
lnorm6 = (float[]) data.get( 5 ) ;
lnorm7 = (float[]) data.get( 6 ) ;
lnorm8 = (float[]) data.get( 7 ) ;
lnorm9 = (float[]) data.get( 8 ) ;
lnorm10 = (float[]) data.get( 9 ) ;
lnorm11 = (float[]) data.get( 10 ) ;
lnorm12 = (float[]) data.get( 11 ) ;
lnorm13 = (float[]) data.get( 12 ) ;
lnorm14 = (float[]) data.get( 13 ) ;
lnorm15 = (float[]) data.get( 14 ) ;
lnorm16 = (float[]) data.get( 15 ) ;
lnorm17 = (float[]) data.get( 16 ) ;
lnorm18 = (float[]) data.get( 17 ) ;
lnorm19 = (float[]) data.get( 18 ) ;
lnorm20 = (float[]) data.get( 19 ) ;
lnorm21 = (float[]) data.get( 20 ) ;
lnorm22 = (float[]) data.get( 21 ) ;
lnorm23 = (float[]) data.get( 22 ) ;
lnorm24 = (float[]) data.get( 23 ) ;
lnorm25 = (float[]) data.get( 24 ) ;
lnorm26 = (float[]) data.get( 25 ) ;
lnorm27 = (float[]) data.get( 26 ) ;
lnorm28 = (float[]) data.get( 27 ) ;
lnorm29 = (float[]) data.get( 28 ) ;
lnorm30 = (float[]) data.get( 29 ) ;
lnorm31 = (float[]) data.get( 30 ) ;
ArrayList data_left = new ArrayList();
float position_x_temporary;
float position_y_temporary;
// Populate the list with the values from the arrays
for (int i = 0; i <= 30; i++) {
float xDist = get_xj(baseSpacing* i); // your irregular X
float z = getCurvedZ(xDist,LW_ratio); // apply same arc curvature
float x = getCurvedX(xDist,LW_ratio); // apply same arc curvature
// fixed_value might be your Y or something else:
float[] p = anyArray(get_yj(i*baseSpacing+baseSpacing/2)/LW_ratio, x, z);
data_left.add(p);
}
p1 = (float[]) data_left.get( 0 ) ;
p2 = (float[]) data_left.get( 1 ) ;
p3 = (float[]) data_left.get( 2 ) ;
p4 = (float[]) data_left.get( 3 ) ;
p5 = (float[]) data_left.get( 4 ) ;
p6 = (float[]) data_left.get( 5 ) ;
p7 = (float[]) data_left.get( 6 ) ;
p8 = (float[]) data_left.get( 7 ) ;
p9 = (float[]) data_left.get( 8 ) ;
p10 = (float[]) data_left.get( 9 ) ;
p11 = (float[]) data_left.get( 10 ) ;
p12 = (float[]) data_left.get( 11 ) ;
p13 = (float[]) data_left.get( 12 ) ;
p14 = (float[]) data_left.get( 13 ) ;
p15 = (float[]) data_left.get( 14 ) ;
p16 = (float[]) data_left.get( 15 ) ;
p17 = (float[]) data_left.get( 16 ) ;
p18 = (float[]) data_left.get( 17 ) ;
p19 = (float[]) data_left.get( 18 ) ;
p20 = (float[]) data_left.get( 19 ) ;
p21 = (float[]) data_left.get( 20 ) ;
p22 = (float[]) data_left.get( 21 ) ;
p23 = (float[]) data_left.get( 22 ) ;
p24 = (float[]) data_left.get( 23 ) ;
p25 = (float[]) data_left.get( 24 ) ;
p26 = (float[]) data_left.get( 25 ) ;
p27 = (float[]) data_left.get( 26 ) ;
p28 = (float[]) data_left.get( 27 ) ;
p29 = (float[]) data_left.get( 28 ) ;
p30 = (float[]) data_left.get( 29 ) ;
p31 = (float[]) data_left.get( 30 ) ;
ArrayList data_right = new ArrayList();
position_x_temporary=0;
position_y_temporary=0;
for (int i = 0; i <= 30; i++) {
float xDist = get_xj(baseSpacing* i); // your irregular X
float z = getCurvedZ(xDist,LW_ratio); // apply same arc curvature
float x = getCurvedX(xDist,LW_ratio); // apply same arc curvature
// fixed_value might be your Y or something else:
float[] p = anyArray(-get_yj(i*baseSpacing+baseSpacing/2)/LW_ratio, x, z);
data_right.add(p);
}
p1R=(float[])data_right.get(0);
p2R=(float[])data_right.get(1);
p3R=(float[])data_right.get(2);
p4R=(float[])data_right.get(3);
p5R=(float[])data_right.get(4);
p6R=(float[])data_right.get(5);
p7R=(float[])data_right.get(6);
p8R=(float[])data_right.get(7);
p9R=(float[])data_right.get(8);
p10R=(float[])data_right.get(9);
p11R=(float[])data_right.get(10);
p12R=(float[])data_right.get(11);
p13R=(float[])data_right.get(12);
p14R=(float[])data_right.get(13);
p15R=(float[])data_right.get(14);
p16R=(float[])data_right.get(15);
p17R=(float[])data_right.get(16);
p18R=(float[])data_right.get(17);
p19R=(float[])data_right.get(18);
p20R=(float[])data_right.get(19);
p21R=(float[])data_right.get(20);
p22R=(float[])data_right.get(21);
p23R=(float[])data_right.get(22);
p24R=(float[])data_right.get(23);
p25R=(float[])data_right.get(24);
p26R=(float[])data_right.get(25);
p27R=(float[])data_right.get(26);
p28R=(float[])data_right.get(27);
p29R=(float[])data_right.get(28);
p30R=(float[])data_right.get(29);
p31R=(float[])data_right.get(30);
//vertexDataLeaflet = new FloatList(anyArray(pi[0],pi[1],pi[2],p0[0],p0[1],p0[2],p1[0],p1[1],p1[2],p2[0],p2[1],p2[2],p3[0],p3[1],p3[2],p4[0],p4[1],p4[2],p5[0],p5[1],p5[2],p6[0],p6[1],p6[2],p7[0],p7[1],p7[2],p8[0],p8[1],p8[2],p9[0],p9[1],p9[2],p10[0],p10[1],p10[2],p11[0],p11[1],p11[2],p12[0],p12[1],p12[2],p13[0],p13[1],p13[2],p14[0],p14[1],p14[2],p15[0],p15[1],p15[2],p16[0],p16[1],p16[2],p17[0],p17[1],p17[2],p18[0],p18[1],p18[2],p19[0],p19[1],p19[2],p20[0],p20[1],p20[2],p21[0],p21[1],p21[2],p22[0],p22[1],p22[2],p23[0],p23[1],p23[2],p24[0],p24[1],p24[2],p25[0],p25[1],p25[2],p26[0],p26[1],p26[2],p27[0],p27[1],p27[2],p28[0],p28[1],p28[2],p29[0],p29[1],p29[2],p30[0],p30[1],p30[2],p31[0],p31[1],p31[2],p32[0],p32[1],p32[2],p33[0],p33[1],p33[2],p34[0],p34[1],p34[2],p35[0],p35[1],p35[2],p36[0],p36[1],p36[2],p37[0],p37[1],p37[2],p38[0],p38[1],p38[2],p39[0],p39[1],p39[2],p40[0],p40[1],p40[2],p41[0],p41[1],p41[2],p42[0],p42[1],p42[2],p43[0],p43[1],p43[2],p44[0],p44[1],p44[2],p45[0],p45[1],p45[2],p46[0],p46[1],p46[2],p47[0],p47[1],p47[2],p48[0],p48[1],p48[2],p49[0],p49[1],p49[2],p50[0],p50[1],p50[2],p51[0],p51[1],p51[2],p52[0],p52[1],p52[2],p53[0],p53[1],p53[2],p54[0],p54[1],p54[2],p55[0],p55[1],p55[2]));
vertexDataLeaflet = new FloatList(anyArray(
lnorm1[0],lnorm1[1],lnorm1[2],p1[0],p1[1],p1[2],lnorm2[0],lnorm2[1],lnorm2[2],p1[0],p1[1],p1[2],lnorm2[0],lnorm2[1],lnorm2[2],p2[0],p2[1],p2[2],
lnorm2[0],lnorm2[1],lnorm2[2],p2[0],p2[1],p2[2],lnorm3[0],lnorm3[1],lnorm3[2],p2[0],p2[1],p2[2],lnorm3[0],lnorm3[1],lnorm3[2],p3[0],p3[1],p3[2],
lnorm3[0],lnorm3[1],lnorm3[2],p3[0],p3[1],p3[2],lnorm4[0],lnorm4[1],lnorm4[2],p3[0],p3[1],p3[2],lnorm4[0],lnorm4[1],lnorm4[2],p4[0],p4[1],p4[2],
lnorm4[0],lnorm4[1],lnorm4[2],p4[0],p4[1],p4[2],lnorm5[0],lnorm5[1],lnorm5[2],p4[0],p4[1],p4[2],lnorm5[0],lnorm5[1],lnorm5[2],p5[0],p5[1],p5[2],
lnorm5[0],lnorm5[1],lnorm5[2],p5[0],p5[1],p5[2],lnorm6[0],lnorm6[1],lnorm6[2],p5[0],p5[1],p5[2],lnorm6[0],lnorm6[1],lnorm6[2],p6[0],p6[1],p6[2],
lnorm6[0],lnorm6[1],lnorm6[2],p6[0],p6[1],p6[2],lnorm7[0],lnorm7[1],lnorm7[2],p6[0],p6[1],p6[2],lnorm7[0],lnorm7[1],lnorm7[2],p7[0],p7[1],p7[2],
lnorm7[0],lnorm7[1],lnorm7[2],p7[0],p7[1],p7[2],lnorm8[0],lnorm8[1],lnorm8[2],p7[0],p7[1],p7[2],lnorm8[0],lnorm8[1],lnorm8[2],p8[0],p8[1],p8[2],
lnorm8[0],lnorm8[1],lnorm8[2],p8[0],p8[1],p8[2],lnorm9[0],lnorm9[1],lnorm9[2],p8[0],p8[1],p8[2],lnorm9[0],lnorm9[1],lnorm9[2],p9[0],p9[1],p9[2],
lnorm9[0],lnorm9[1],lnorm9[2],p9[0],p9[1],p9[2],lnorm10[0],lnorm10[1],lnorm10[2],p9[0],p9[1],p9[2],lnorm10[0],lnorm10[1],lnorm10[2],p10[0],p10[1],p10[2],
lnorm10[0],lnorm10[1],lnorm10[2],p10[0],p10[1],p10[2],lnorm11[0],lnorm11[1],lnorm11[2],p10[0],p10[1],p10[2],lnorm11[0],lnorm11[1],lnorm11[2],p11[0],p11[1],p11[2],
lnorm11[0],lnorm11[1],lnorm11[2],p11[0],p11[1],p11[2],lnorm12[0],lnorm12[1],lnorm12[2],p11[0],p11[1],p11[2],lnorm12[0],lnorm12[1],lnorm12[2],p12[0],p12[1],p12[2],
lnorm12[0],lnorm12[1],lnorm12[2],p12[0],p12[1],p12[2],lnorm13[0],lnorm13[1],lnorm13[2],p12[0],p12[1],p12[2],lnorm13[0],lnorm13[1],lnorm13[2],p13[0],p13[1],p13[2],
lnorm13[0],lnorm13[1],lnorm13[2],p13[0],p13[1],p13[2],lnorm14[0],lnorm14[1],lnorm14[2],p13[0],p13[1],p13[2],lnorm14[0],lnorm14[1],lnorm14[2],p14[0],p14[1],p14[2],
lnorm14[0],lnorm14[1],lnorm14[2],p14[0],p14[1],p14[2],lnorm15[0],lnorm15[1],lnorm15[2],p14[0],p14[1],p14[2],lnorm15[0],lnorm15[1],lnorm15[2],p15[0],p15[1],p15[2],
lnorm15[0],lnorm15[1],lnorm15[2],p15[0],p15[1],p15[2],lnorm16[0],lnorm16[1],lnorm16[2],p15[0],p15[1],p15[2],lnorm16[0],lnorm16[1],lnorm16[2],p16[0],p16[1],p16[2],
lnorm16[0],lnorm16[1],lnorm16[2],p16[0],p16[1],p16[2],lnorm17[0],lnorm17[1],lnorm17[2],p16[0],p16[1],p16[2],lnorm17[0],lnorm17[1],lnorm17[2],p17[0],p17[1],p17[2],
lnorm17[0],lnorm17[1],lnorm17[2],p17[0],p17[1],p17[2],lnorm18[0],lnorm18[1],lnorm18[2],p17[0],p17[1],p17[2],lnorm18[0],lnorm18[1],lnorm18[2],p18[0],p18[1],p18[2],
lnorm18[0],lnorm18[1],lnorm18[2],p18[0],p18[1],p18[2],lnorm19[0],lnorm19[1],lnorm19[2],p18[0],p18[1],p18[2],lnorm19[0],lnorm19[1],lnorm19[2],p19[0],p19[1],p19[2],
lnorm19[0],lnorm19[1],lnorm19[2],p19[0],p19[1],p19[2],lnorm20[0],lnorm20[1],lnorm20[2],p19[0],p19[1],p19[2],lnorm20[0],lnorm20[1],lnorm20[2],p20[0],p20[1],p20[2],
lnorm20[0],lnorm20[1],lnorm20[2],p20[0],p20[1],p20[2],lnorm21[0],lnorm21[1],lnorm21[2],p20[0],p20[1],p20[2],lnorm21[0],lnorm21[1],lnorm21[2],p21[0],p21[1],p21[2],
lnorm21[0],lnorm21[1],lnorm21[2],p21[0],p21[1],p21[2],lnorm22[0],lnorm22[1],lnorm22[2],p21[0],p21[1],p21[2],lnorm22[0],lnorm22[1],lnorm22[2],p22[0],p22[1],p22[2],
lnorm22[0],lnorm22[1],lnorm22[2],p22[0],p22[1],p22[2],lnorm23[0],lnorm23[1],lnorm23[2],p22[0],p22[1],p22[2],lnorm23[0],lnorm23[1],lnorm23[2],p23[0],p23[1],p23[2],
lnorm23[0],lnorm23[1],lnorm23[2],p23[0],p23[1],p23[2],lnorm24[0],lnorm24[1],lnorm24[2],p23[0],p23[1],p23[2],lnorm24[0],lnorm24[1],lnorm24[2],p24[0],p24[1],p24[2],
lnorm24[0],lnorm24[1],lnorm24[2],p24[0],p24[1],p24[2],lnorm25[0],lnorm25[1],lnorm25[2],p24[0],p24[1],p24[2],lnorm25[0],lnorm25[1],lnorm25[2],p25[0],p25[1],p25[2],
lnorm25[0],lnorm25[1],lnorm25[2],p25[0],p25[1],p25[2],lnorm26[0],lnorm26[1],lnorm26[2],p25[0],p25[1],p25[2],lnorm26[0],lnorm26[1],lnorm26[2],p26[0],p26[1],p26[2],
lnorm26[0],lnorm26[1],lnorm26[2],p26[0],p26[1],p26[2],lnorm27[0],lnorm27[1],lnorm27[2],p26[0],p26[1],p26[2],lnorm27[0],lnorm27[1],lnorm27[2],p27[0],p27[1],p27[2],
lnorm27[0],lnorm27[1],lnorm27[2],p27[0],p27[1],p27[2],lnorm28[0],lnorm28[1],lnorm28[2],p27[0],p27[1],p27[2],lnorm28[0],lnorm28[1],lnorm28[2],p28[0],p28[1],p28[2],
lnorm28[0],lnorm28[1],lnorm28[2],p28[0],p28[1],p28[2],lnorm29[0],lnorm29[1],lnorm29[2],p28[0],p28[1],p28[2],lnorm29[0],lnorm29[1],lnorm29[2],p29[0],p29[1],p29[2],
lnorm29[0],lnorm29[1],lnorm29[2],p29[0],p29[1],p29[2],lnorm30[0],lnorm30[1],lnorm30[2],p29[0],p29[1],p29[2],lnorm30[0],lnorm30[1],lnorm30[2],p30[0],p30[1],p30[2],
lnorm30[0],lnorm30[1],lnorm30[2],p30[0],p30[1],p30[2],lnorm31[0],lnorm31[1],lnorm31[2],p30[0],p30[1],p30[2],lnorm31[0],lnorm31[1],lnorm31[2],p31[0],p31[1],p31[2],
lnorm1[0],lnorm1[1],lnorm1[2],p1R[0],p1R[1],p1R[2],lnorm2[0],lnorm2[1],lnorm2[2],p1R[0],p1R[1],p1R[2],lnorm2[0],lnorm2[1],lnorm2[2],p2R[0],p2R[1],p2R[2],
lnorm2[0],lnorm2[1],lnorm2[2],p2R[0],p2R[1],p2R[2],lnorm3[0],lnorm3[1],lnorm3[2],p2R[0],p2R[1],p2R[2],lnorm3[0],lnorm3[1],lnorm3[2],p3R[0],p3R[1],p3R[2],
lnorm3[0],lnorm3[1],lnorm3[2],p3R[0],p3R[1],p3R[2],lnorm4[0],lnorm4[1],lnorm4[2],p3R[0],p3R[1],p3R[2],lnorm4[0],lnorm4[1],lnorm4[2],p4R[0],p4R[1],p4R[2],
lnorm4[0],lnorm4[1],lnorm4[2],p4R[0],p4R[1],p4R[2],lnorm5[0],lnorm5[1],lnorm5[2],p4R[0],p4R[1],p4R[2],lnorm5[0],lnorm5[1],lnorm5[2],p5R[0],p5R[1],p5R[2],
lnorm5[0],lnorm5[1],lnorm5[2],p5R[0],p5R[1],p5R[2],lnorm6[0],lnorm6[1],lnorm6[2],p5R[0],p5R[1],p5R[2],lnorm6[0],lnorm6[1],lnorm6[2],p6R[0],p6R[1],p6R[2],
lnorm6[0],lnorm6[1],lnorm6[2],p6R[0],p6R[1],p6R[2],lnorm7[0],lnorm7[1],lnorm7[2],p6R[0],p6R[1],p6R[2],lnorm7[0],lnorm7[1],lnorm7[2],p7R[0],p7R[1],p7R[2],
lnorm7[0],lnorm7[1],lnorm7[2],p7R[0],p7R[1],p7R[2],lnorm8[0],lnorm8[1],lnorm8[2],p7R[0],p7R[1],p7R[2],lnorm8[0],lnorm8[1],lnorm8[2],p8R[0],p8R[1],p8R[2],
lnorm8[0],lnorm8[1],lnorm8[2],p8R[0],p8R[1],p8R[2],lnorm9[0],lnorm9[1],lnorm9[2],p8R[0],p8R[1],p8R[2],lnorm9[0],lnorm9[1],lnorm9[2],p9R[0],p9R[1],p9R[2],
lnorm9[0],lnorm9[1],lnorm9[2],p9R[0],p9R[1],p9R[2],lnorm10[0],lnorm10[1],lnorm10[2],p9R[0],p9R[1],p9R[2],lnorm10[0],lnorm10[1],lnorm10[2],p10R[0],p10R[1],p10R[2],
lnorm10[0],lnorm10[1],lnorm10[2],p10R[0],p10R[1],p10R[2],lnorm11[0],lnorm11[1],lnorm11[2],p10R[0],p10R[1],p10R[2],lnorm11[0],lnorm11[1],lnorm11[2],p11R[0],p11R[1],p11R[2],
lnorm11[0],lnorm11[1],lnorm11[2],p11R[0],p11R[1],p11R[2],lnorm12[0],lnorm12[1],lnorm12[2],p11R[0],p11R[1],p11R[2],lnorm12[0],lnorm12[1],lnorm12[2],p12R[0],p12R[1],p12R[2],
lnorm12[0],lnorm12[1],lnorm12[2],p12R[0],p12R[1],p12R[2],lnorm13[0],lnorm13[1],lnorm13[2],p12R[0],p12R[1],p12R[2],lnorm13[0],lnorm13[1],lnorm13[2],p13R[0],p13R[1],p13R[2],
lnorm13[0],lnorm13[1],lnorm13[2],p13R[0],p13R[1],p13R[2],lnorm14[0],lnorm14[1],lnorm14[2],p13R[0],p13R[1],p13R[2],lnorm14[0],lnorm14[1],lnorm14[2],p14R[0],p14R[1],p14R[2],
lnorm14[0],lnorm14[1],lnorm14[2],p14R[0],p14R[1],p14R[2],lnorm15[0],lnorm15[1],lnorm15[2],p14R[0],p14R[1],p14R[2],lnorm15[0],lnorm15[1],lnorm15[2],p15R[0],p15R[1],p15R[2],
lnorm15[0],lnorm15[1],lnorm15[2],p15R[0],p15R[1],p15R[2],lnorm16[0],lnorm16[1],lnorm16[2],p15R[0],p15R[1],p15R[2],lnorm16[0],lnorm16[1],lnorm16[2],p16R[0],p16R[1],p16R[2],
lnorm16[0],lnorm16[1],lnorm16[2],p16R[0],p16R[1],p16R[2],lnorm17[0],lnorm17[1],lnorm17[2],p16R[0],p16R[1],p16R[2],lnorm17[0],lnorm17[1],lnorm17[2],p17R[0],p17R[1],p17R[2],
lnorm17[0],lnorm17[1],lnorm17[2],p17R[0],p17R[1],p17R[2],lnorm18[0],lnorm18[1],lnorm18[2],p17R[0],p17R[1],p17R[2],lnorm18[0],lnorm18[1],lnorm18[2],p18R[0],p18R[1],p18R[2],
lnorm18[0],lnorm18[1],lnorm18[2],p18R[0],p18R[1],p18R[2],lnorm19[0],lnorm19[1],lnorm19[2],p18R[0],p18R[1],p18R[2],lnorm19[0],lnorm19[1],lnorm19[2],p19R[0],p19R[1],p19R[2],
lnorm19[0],lnorm19[1],lnorm19[2],p19R[0],p19R[1],p19R[2],lnorm20[0],lnorm20[1],lnorm20[2],p19R[0],p19R[1],p19R[2],lnorm20[0],lnorm20[1],lnorm20[2],p20R[0],p20R[1],p20R[2],
lnorm20[0],lnorm20[1],lnorm20[2],p20R[0],p20R[1],p20R[2],lnorm21[0],lnorm21[1],lnorm21[2],p20R[0],p20R[1],p20R[2],lnorm21[0],lnorm21[1],lnorm21[2],p21R[0],p21R[1],p21R[2],
lnorm21[0],lnorm21[1],lnorm21[2],p21R[0],p21R[1],p21R[2],lnorm22[0],lnorm22[1],lnorm22[2],p21R[0],p21R[1],p21R[2],lnorm22[0],lnorm22[1],lnorm22[2],p22R[0],p22R[1],p22R[2],
lnorm22[0],lnorm22[1],lnorm22[2],p22R[0],p22R[1],p22R[2],lnorm23[0],lnorm23[1],lnorm23[2],p22R[0],p22R[1],p22R[2],lnorm23[0],lnorm23[1],lnorm23[2],p23R[0],p23R[1],p23R[2],
lnorm23[0],lnorm23[1],lnorm23[2],p23R[0],p23R[1],p23R[2],lnorm24[0],lnorm24[1],lnorm24[2],p23R[0],p23R[1],p23R[2],lnorm24[0],lnorm24[1],lnorm24[2],p24R[0],p24R[1],p24R[2],
lnorm24[0],lnorm24[1],lnorm24[2],p24R[0],p24R[1],p24R[2],lnorm25[0],lnorm25[1],lnorm25[2],p24R[0],p24R[1],p24R[2],lnorm25[0],lnorm25[1],lnorm25[2],p25R[0],p25R[1],p25R[2],
lnorm25[0],lnorm25[1],lnorm25[2],p25R[0],p25R[1],p25R[2],lnorm26[0],lnorm26[1],lnorm26[2],p25R[0],p25R[1],p25R[2],lnorm26[0],lnorm26[1],lnorm26[2],p26R[0],p26R[1],p26R[2],
lnorm26[0],lnorm26[1],lnorm26[2],p26R[0],p26R[1],p26R[2],lnorm27[0],lnorm27[1],lnorm27[2],p26R[0],p26R[1],p26R[2],lnorm27[0],lnorm27[1],lnorm27[2],p27R[0],p27R[1],p27R[2],
lnorm27[0],lnorm27[1],lnorm27[2],p27R[0],p27R[1],p27R[2],lnorm28[0],lnorm28[1],lnorm28[2],p27R[0],p27R[1],p27R[2],lnorm28[0],lnorm28[1],lnorm28[2],p28R[0],p28R[1],p28R[2],
lnorm28[0],lnorm28[1],lnorm28[2],p28R[0],p28R[1],p28R[2],lnorm29[0],lnorm29[1],lnorm29[2],p28R[0],p28R[1],p28R[2],lnorm29[0],lnorm29[1],lnorm29[2],p29R[0],p29R[1],p29R[2],
lnorm29[0],lnorm29[1],lnorm29[2],p29R[0],p29R[1],p29R[2],lnorm30[0],lnorm30[1],lnorm30[2],p29R[0],p29R[1],p29R[2],lnorm30[0],lnorm30[1],lnorm30[2],p30R[0],p30R[1],p30R[2],
lnorm30[0],lnorm30[1],lnorm30[2],p30R[0],p30R[1],p30R[2],lnorm31[0],lnorm31[1],lnorm31[2],p30R[0],p30R[1],p30R[2],lnorm31[0],lnorm31[1],lnorm31[2],p31R[0],p31R[1],p31R[2]
));
//FloatList curved = adjustLengthWidthAndApplyCurvature(vertexDataLeaflet, 10,1); // Apply curvature along x-axis
cotyledon_mesh = getMesh(vertexDataLeaflet);
}```