点绘制螺旋线
2014-06-30 22:40
246 查看
/**
* 缓冲区工具类
*/
public class BufferUtil {
/**
* 将浮点数组转换成字节缓冲区
*/
public static ByteBuffer arr2ByteBuffer(float[] arr){
ByteBuffer ibb = ByteBuffer.allocateDirect(arr.length * 4);
ibb.order(ByteOrder.nativeOrder());
FloatBuffer fbb = ibb.asFloatBuffer();
fbb.put(arr);
ibb.position(0);
return ibb ;
}
/**
* 将list转换成字节缓冲区
*/
public static ByteBuffer list2ByteBuffer(List<Float> list){
ByteBuffer ibb = ByteBuffer.allocateDirect(list.size() * 4);
ibb.order(ByteOrder.nativeOrder());
FloatBuffer fbb = ibb.asFloatBuffer();
for(Float f : list){
fbb.put(f);
}
ibb.position(0);
return ibb ;
}
}
/**
* 渲染器
*/
public abstract class AbstractMyRenderer implements android.opengl.GLSurfaceView.Renderer
{
private float ratio;
public float xrotate = 0f;//围绕x轴旋转角度
public float yrotate = 0f;//围绕x轴旋转角度
/**
* 1.
*/
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
//清平色
gl.glClearColor(0f, 0f, 0f, 1f);
//启用顶点缓冲区数组
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
}
/**
* 2.
*/
public void onSurfaceChanged(GL10 gl, int width, int height) {
//设置视口
gl.glViewport(0, 0, width, height);
ratio = (float)width / (float)height;
//投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
//加载单位矩阵
gl.glLoadIdentity();
//设置平截头体
gl.glFrustumf(-ratio, ratio, -1, 1, 3f, 7f); }
/**
* 3.
*/
public abstract void onDrawFrame(GL10 gl);
}
/**
* 点渲染器,绘制螺旋线
*/
public class MyPointRenderer1 extends AbstractMyRenderer{
public void onDrawFrame(GL10 gl) {
//清除颜色缓冲区
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
//设置绘图颜色
gl.glColor4f(1f, 0f, 0f, 1f);
//操作模型视图矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
//设置眼球的参数
GLU.gluLookAt(gl,0f,0f,5f, 0f, 0f, 0f, 0f,1f,0f);
//旋转角度
gl.glRotatef(xrotate, 1, 0, 0);
gl.glRotatef(yrotate, 0, 1, 0);
//计算点坐标
float r = 0.5f ;//半径
List<Float> coordsList = new ArrayList<Float>();
float x = 0f,y = 0f,z = 1f ;
float zstep = 0.01f ;
for(float alpha = 0f ; alpha < Math.PI * 6 ; alpha = (float) (alpha + Math.PI / 16)){
x = (float) (r * Math.cos(alpha));
y = (float) (r * Math.sin(alpha));
z = z - zstep ;
coordsList.add(x);
coordsList.add(y);
coordsList.add(z);
}
//转换点成为缓冲区
ByteBuffer ibb = ByteBuffer.allocateDirect(coordsList.size() * 4);
ibb.order(ByteOrder.nativeOrder());
FloatBuffer fbb = ibb.asFloatBuffer();
for(float f : coordsList){
fbb.put(f);
}
ibb.position(0); //指定顶点指针
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, ibb);
gl.glDrawArrays(GL10.GL_POINTS, 0, coordsList.size() / 3);
}
}
//主界面
public class MainActivity extends Activity {
private AbstractMyRenderer render;
private MyGLSurfaceView view;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = new GLSurfaceView(this);
render = new MyPointRenderer1();
view.setRenderer(render);
//GLSurfaceView.RENDERMODE_CONTINUOUSLY:持续渲染(默认)
//GLSurfaceView.RENDERMODE_WHEN_DIRTY:脏渲染,命令渲染
view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
setContentView(view);
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
float step = 5f ;
//up
if(keyCode == KeyEvent.KEYCODE_DPAD_UP){
render.xrotate = render.xrotate - step ;
} else if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN){
render.xrotate = render.xrotate + step ;
} else if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT){
render.yrotate = render.yrotate + step ;
} else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){
render.yrotate = render.yrotate - step ;
}
//请求渲染,和脏渲染配合使用
view.requestRender();
return super.onKeyDown(keyCode, event);
}
}
* 缓冲区工具类
*/
public class BufferUtil {
/**
* 将浮点数组转换成字节缓冲区
*/
public static ByteBuffer arr2ByteBuffer(float[] arr){
ByteBuffer ibb = ByteBuffer.allocateDirect(arr.length * 4);
ibb.order(ByteOrder.nativeOrder());
FloatBuffer fbb = ibb.asFloatBuffer();
fbb.put(arr);
ibb.position(0);
return ibb ;
}
/**
* 将list转换成字节缓冲区
*/
public static ByteBuffer list2ByteBuffer(List<Float> list){
ByteBuffer ibb = ByteBuffer.allocateDirect(list.size() * 4);
ibb.order(ByteOrder.nativeOrder());
FloatBuffer fbb = ibb.asFloatBuffer();
for(Float f : list){
fbb.put(f);
}
ibb.position(0);
return ibb ;
}
}
/**
* 渲染器
*/
public abstract class AbstractMyRenderer implements android.opengl.GLSurfaceView.Renderer
{
private float ratio;
public float xrotate = 0f;//围绕x轴旋转角度
public float yrotate = 0f;//围绕x轴旋转角度
/**
* 1.
*/
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
//清平色
gl.glClearColor(0f, 0f, 0f, 1f);
//启用顶点缓冲区数组
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
}
/**
* 2.
*/
public void onSurfaceChanged(GL10 gl, int width, int height) {
//设置视口
gl.glViewport(0, 0, width, height);
ratio = (float)width / (float)height;
//投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
//加载单位矩阵
gl.glLoadIdentity();
//设置平截头体
gl.glFrustumf(-ratio, ratio, -1, 1, 3f, 7f); }
/**
* 3.
*/
public abstract void onDrawFrame(GL10 gl);
}
/**
* 点渲染器,绘制螺旋线
*/
public class MyPointRenderer1 extends AbstractMyRenderer{
public void onDrawFrame(GL10 gl) {
//清除颜色缓冲区
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
//设置绘图颜色
gl.glColor4f(1f, 0f, 0f, 1f);
//操作模型视图矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
//设置眼球的参数
GLU.gluLookAt(gl,0f,0f,5f, 0f, 0f, 0f, 0f,1f,0f);
//旋转角度
gl.glRotatef(xrotate, 1, 0, 0);
gl.glRotatef(yrotate, 0, 1, 0);
//计算点坐标
float r = 0.5f ;//半径
List<Float> coordsList = new ArrayList<Float>();
float x = 0f,y = 0f,z = 1f ;
float zstep = 0.01f ;
for(float alpha = 0f ; alpha < Math.PI * 6 ; alpha = (float) (alpha + Math.PI / 16)){
x = (float) (r * Math.cos(alpha));
y = (float) (r * Math.sin(alpha));
z = z - zstep ;
coordsList.add(x);
coordsList.add(y);
coordsList.add(z);
}
//转换点成为缓冲区
ByteBuffer ibb = ByteBuffer.allocateDirect(coordsList.size() * 4);
ibb.order(ByteOrder.nativeOrder());
FloatBuffer fbb = ibb.asFloatBuffer();
for(float f : coordsList){
fbb.put(f);
}
ibb.position(0); //指定顶点指针
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, ibb);
gl.glDrawArrays(GL10.GL_POINTS, 0, coordsList.size() / 3);
}
}
//主界面
public class MainActivity extends Activity {
private AbstractMyRenderer render;
private MyGLSurfaceView view;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = new GLSurfaceView(this);
render = new MyPointRenderer1();
view.setRenderer(render);
//GLSurfaceView.RENDERMODE_CONTINUOUSLY:持续渲染(默认)
//GLSurfaceView.RENDERMODE_WHEN_DIRTY:脏渲染,命令渲染
view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
setContentView(view);
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
float step = 5f ;
//up
if(keyCode == KeyEvent.KEYCODE_DPAD_UP){
render.xrotate = render.xrotate - step ;
} else if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN){
render.xrotate = render.xrotate + step ;
} else if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT){
render.yrotate = render.yrotate + step ;
} else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){
render.yrotate = render.yrotate - step ;
}
//请求渲染,和脏渲染配合使用
view.requestRender();
return super.onKeyDown(keyCode, event);
}
}
相关文章推荐
- python彩色螺旋线绘制引发的问题
- 3.5 使用螺旋线工具绘制蜗牛螺纹 [Illustrator CC教程]
- OpenGL 绘制螺旋线
- python绘制螺旋线
- 绘制螺旋线导入到PCB中
- Matlab绘制螺旋线
- OpenGl绘制螺旋线
- OpenGL——点的绘制(使用OpenGL来绘制可旋转坐标系的螺旋线)
- OpenGL——点的绘制(使用OpenGL来绘制可旋转坐标系的螺旋线)
- 基于ID3DXSprite的2D元素绘制
- Android使用XML Shape绘制带阴影效果的圆形按钮
- 使用cairo绘制图形的部分函数总结
- 使用MFC的CDC类绘制三维坐标系及球面函数
- Java GUI:AWT、Swing、UI绘制、双缓冲技术
- 编程实现绘制表格
- Android知识架构 · 电话面试 · View的绘制流程
- Basemap绘制四川轮廓
- 如何根据离散点自动绘制等值线(等高线)之 客观分析
- cocos2d-x的简单绘制
- 绘制业务流程图:流程图绘制工具