CodeSimilar to the circle above, only the drawcylinder. Java code has changed;
What do you think is the topic? Let's talk about it directly. You can think of it as the effect of the circle moving along the vertical direction in a parallel horizontal plane. In this way, we get the two bottom surfaces of the cylinder, you can draw a triangle between the vertices of the upper and lower circles on the side. Of course, there will also be errors, so the more points of the circle, the smaller the error, the circle is like a cylindrical. Let's take a look at the code.
Package WYF. lgz;
Import java. NiO. bytebuffer;
Import java. NiO. byteorder;
Import java. NiO. floatbuffer;
Import java. util. arraylist;
Import javax. microedition. khronos. opengles. gl10;
Public class drawcylinder
{
Private floatbuffer myvertexbuffer; // vertex coordinate Buffer
Int vcount; // Number of vertices
Float length; // The length of the column.
Float circle_radius; // circle radius
Float degreespan; // The degree of each part of the circular truncation Ring
Int Col; // Number of cylindrical Blocks
Public float manglex;
Public float mangley;
Public float manglez;
Public drawcylinder (float length, float circle_radius, float degreespan, int col)
{
This. circle_radius = circle_radius;
This. Length = length;
This. Col = Col;
This. degreespan = degreespan;
Float collength = (float) length/COL; // The length of each column
Arraylist <float> val = new arraylist <float> (); // vertex storage list
For (float circle_degree = 360.0f; circle_degree> 0.0f; circle_degree-= degreespan) // loop rows
{
Int J = 0;
// For (Int J = 0; j <Col; j ++) // loop Column
{
Float X1 = (float) (J * collength-length/2 );
Float Y1 = (float) (circle_radius * Math. Sin (math. toradians (circle_degree )));
Float z1 = (float) (circle_radius * Math. Cos (math. toradians (circle_degree )));
Float X2 = (float) (J * collength-length/2 );
Float y2 = (float) (circle_radius * Math. Sin (math. toradians (circle_degree-degreespan )));
Float Z2 = (float) (circle_radius * Math. Cos (math. toradians (circle_degree-degreespan )));
Float X3 = (float) (J + 1) * collength-length/2 );
Float Y3 = (float) (circle_radius * Math. Sin (math. toradians (circle_degree-degreespan )));
Float Z3 = (float) (circle_radius * Math. Cos (math. toradians (circle_degree-degreespan )));
Float X4 = (float) (J + 1) * collength-length/2 );
Float Y4 = (float) (circle_radius * Math. Sin (math. toradians (circle_degree )));
Float Z4 = (float) (circle_radius * Math. Cos (math. toradians (circle_degree )));
Val. Add (X1); Val. Add (Y1); Val. Add (Z1); // two vertices of each line are determined. There are 6 lines and 12 vertices in total.
Val. Add (X2); Val. Add (Y2); Val. Add (Z2 );
Val. Add (X2); Val. Add (Y2); Val. Add (Z2 );
Val. Add (X4); Val. Add (Y4); Val. Add (Z4 );
Val. Add (X4); Val. Add (Y4); Val. Add (Z4 );
Val. Add (X1); Val. Add (Y1); Val. Add (Z1 );
Val. Add (X2); Val. Add (Y2); Val. Add (Z2 );
Val. Add (X3); Val. Add (Y3); Val. Add (Z3 );
Val. Add (X3); Val. Add (Y3); Val. Add (Z3 );
Val. Add (X4); Val. Add (Y4); Val. Add (Z4 );
Val. Add (X4); Val. Add (Y4); Val. Add (Z4 );
Val. Add (X2); Val. Add (Y2); Val. Add (Z2 );
}
}
Vcount = Val. Size ()/3; // determine the number of vertices
// Vertex
Float [] vertexs = new float [vcount * 3];
For (INT I = 0; I <vcount * 3; I ++)
{
Vertexs [I] = Val. Get (I );
}
Bytebuffer vBB = bytebuffer. allocatedirect (vertexs. length * 4 );
VBB. Order (byteorder. nativeorder ());
Myvertexbuffer = vBB. asfloatbuffer ();
Myvertexbuffer. Put (vertexs );
Myvertexbuffer. Position (0 );
}
Public void drawself (gl10 GL)
{
Gl. glrotatef (manglex, 1, 0, 0); // rotate
Gl. glrotatef (mangley, 0, 1, 0 );
Gl. glrotatef (manglez, 0, 0, 1 );
Gl. glableclientstate (gl10.gl _ vertex_array); // enable the vertex buffer.
Gl. glvertexpointer (3, gl10.gl _ float, 0, myvertexbuffer); // specify the vertex buffer
Gl. glcolor4f (0, 0, 0, 0); // set the draw line to black.
Gl. gldrawarrays (gl10.gl _ line_loop, 0, vcount); // draw an image
Gl. gldisableclientstate (gl10.gl _ vertex_array );
}
}