android用openGl ES绘制任意方程的三维空间图形
最近在写一个数值计算数学软件,用于矩阵分析、线性、非线性方程(组)求解、数值积分的求解,二维、三维绘图。
其中的三维绘图,用OpenGl渲染,本来打算用原生的方法实现,但是能力有限,且对OpenGl不太熟悉,就直接用java实现啦。效率还行。
实现机制是:先传入空间几何体的方程 (z=f(x,y)、x=u(t),y=v(t),z=w(t)) 其中包括显示方程和参数方程。以及变量x y的取值范围。在绘制的时候,对x y进行 分割 ,取相邻的四个点组成两个三角形进行绘制.具体代码如下:
1.
package com.example.plot;import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;import android.content.Context;
import android.opengl.GLSurfaceView;
import android.view.MotionEvent;public class MySurefaceView extends GLSurfaceView
{private final float SUO=180.f/320 ;//缩放比例private SceneRenderer mRenderer ;private float shangX ;private float shangY ;public MySurefaceView(Context context){super(context);mRenderer=new SceneRenderer();setRenderer(mRenderer);setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY) ;//设置为主动渲染}//触摸事件@Overridepublic boolean onTouchEvent(MotionEvent event){float x=event.getX();float y=event.getY() ;if(event.getAction()==MotionEvent.ACTION_MOVE){float dx=x-shangX ;float dy=y-shangY ;mRenderer.funcView.angleY+=dx*SUO ;mRenderer.funcView.angleZ+=dy*SUO ;requestRender() ;}shangX=x ;shangY=y ;return true;}private class SceneRenderer implements Renderer ,IFunc{FuncView funcView ;@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config){gl.glDisable(GL10.GL_DITHER) ;// 闭关抗抖动gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST) ;gl.glClearColor(0, 0, 0, 0) ;gl.glShadeModel(GL10.GL_SMOOTH) ;//平滑着色gl.glEnable(GL10.GL_DEPTH_TEST) ;//深度测试gl.glColor4f(1, 0, 0, 1);funcView=new FuncView(-1, 1, 0, 2*Math.PI,this) ; //实例画 传入x y的范围和方程函数接口}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height){gl.glViewport(0, 0, width, height);gl.glMatrixMode(GL10.GL_PROJECTION) ;// 设置当前矩阵为投影矩阵gl.glLoadIdentity() ; //设置当前矩阵为单位矩阵float ratio=(float)width/height;gl.glFrustumf(-ratio, ratio, -0.5f, 1.5f, 1, 100) ; //调用次方法计算产生透视投影矩阵
// gl.glOrthof(-ratio, ratio, -0.5f, 1.5f, 1, 100) ; //产生正交投影矩阵
// GLU.gluLookAt(gl,-1.0f,0.6f,3.0f,1.3f,-2.4f,2f,0f,1.0f,0.0f);}@Overridepublic void onDrawFrame(GL10 gl){gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);// 清楚颜色缓存gl.glMatrixMode(GL10.GL_MODELVIEW);//设置为矩阵模式gl.glLoadIdentity() ;gl.glPushMatrix() ;gl.glTranslatef(0, 0, -4f);funcView.draw(gl);gl.glPopMatrix() ;}//传入的方程@Overridepublic float getX(double x, double y){return (float) x;}@Overridepublic float getY(double x, double y){return (float)( Math.pow(Math.E, -(x*Math.cos(4*x))*(x*Math.cos(4*x)))*Math.cos(y));}@Overridepublic float getZ(double x, double y){return (float)( Math.pow(Math.E, -(x*Math.cos(4*x))*(x*Math.cos(4*x)))*Math.sin(y));}}
}
2.分割和绘制代码
package com.example.plot;import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.util.ArrayList;import javax.microedition.khronos.opengles.GL10;public class FuncView
{public float angleX;public float angleY;public float angleZ;private int vCount=0; //顶点个数private FloatBuffer vBuf;// f(z)=cos(x)-x*sin(x) x[0,2pi] y[0,2pi]public FuncView(double xLow,double xHeight,double yLow,double yHeight,IFunc func){double stepX = (xHeight-xLow)/100 ;double stepY=(yHeight-yLow)/100 ;ArrayList<Float> val=new ArrayList<Float>(); //存放顶点的列表float x=(float) xLow ;float y=(float) yLow ;for (int i = 0; i <=100; i++, x += stepX){for (int j = 0; j <= 100; j++, y += stepY){float x1= func.getX(x, y) ;float y1= func.getY(x, y) ;float z1= func.getZ(x, y) ;float x2= func.getX(x+stepX, y) ;float y2= func.getY(x+stepX, y) ;float z2= func.getZ(x+stepX, y) ;float x3= func.getX(x+stepX, y+stepY) ;float y3= func.getY(x+stepX, y+stepY) ;float z3= func.getZ(x+stepX, y+stepY) ;float x4= func.getX(x, y+stepY) ;float y4= func.getY(x, y+stepY) ;float z4= func.getZ(x, y+stepY) ; val.add(x1) ;val.add(y1) ;val.add(z1) ;val.add(x2) ;val.add(y2) ;val.add(z2) ;val.add(x4) ;val.add(y4) ;val.add(z4) ;val.add(x2) ;val.add(y2) ;val.add(z2) ;val.add(x3) ;val.add(y3) ;val.add(z3) ;val.add(x4) ;val.add(y4) ;val.add(z4) ;}} vCount=val.size()/3 ;float[] vertexs = new float[vCount*3]; //存放顶点数据for(int i=0;i<vCount;i++){vertexs[i*3]=val.get(i*3);vertexs[i*3+1]=val.get(i*3+1);vertexs[i*3+2]=val.get(i*3+2);}ByteBuffer vbb;vbb = ByteBuffer.allocateDirect(vertexs.length * 4);vbb.order(ByteOrder.nativeOrder());vBuf = vbb.asFloatBuffer();vBuf.put(vertexs);vBuf.position(0);}public void draw(GL10 gl){gl.glRotatef(angleX, 1, 0, 0);gl.glRotatef(angleY, 0, 1, 0);gl.glRotatef(angleZ, 0, 0, 1);gl.glScalef(0.8F, 0.8F, 0.8F) ; gl.glRotatef(-90, 1, 0, 0);gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vBuf);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vCount);gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);}}
3.方程接口
package com.example.plot;public interface IFunc
{public float getX(double x,double y) ;public float getY(double x,double y) ;public float getZ(double x,double y) ;
}
4.主Activity
package com.example.plot;import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;public class MainActivity extends ActionBarActivity
{@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(new MySurefaceView(this));}}
android用openGl ES绘制任意方程的三维空间图形相关推荐
- 【Qt for Android】OpenGL ES 绘制彩色立方体
Qt 内置对OpenGL ES的支持.选用Qt进行OpenGL ES的开发是很方便的,很多辅助类都已经具备.从Qt 5.0開始添加了一个QWindow类,该类既能够使用OpenGL绘制3D图形,也能够 ...
- Android Studio OpenGL ES绘制三棱锥/四面体的多纹理贴图 每个面使用一张图片渲染
本文参考了王刚的<疯狂Android讲义(第3版)>P554-P559 要求:利用OpenGL ES绘制一个三棱锥,并对每个面进行纹理贴图,每个面使用不同的图片进行渲染. 环境:Andro ...
- 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)
0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...
- 安卓学习笔记37:利用OpenGL ES绘制平面图形
文章目录 零.学习目标 一.OpenGL概述 二.了解三维直角坐标系 三.案例演示 - 绘制三角形 (一)运行效果 (二)实现步骤 1.创建安卓应用[DrawTriangle] 2.建模:创建三角形类 ...
- OpenGL ES:绘制函数glDrawArrays 和 glDrawElements 的区别
from:https://www.jianshu.com/p/4d02c2cd21ea 写文章注册登录 首页 下载App OpenGL ES:绘制函数glDrawArrays 和 glDrawElem ...
- Android下Opengl ES实现单屏幕双眼显示
http://blog.csdn.net/u011371324/article/details/68946779 默认情况下,Opengl ES使用系统提供的帧缓冲区作为绘图表面,一般情况下,如果只在 ...
- 适用于ios和android,适用于iOS和Android的OpenGL ES差异
我有一个适用于iOS和 Android的OpenGL ES应用程序.大多数代码是很久以前由另一个人编写的,现在我必须维护它. OpenGL的使用看起来相当简单(游戏是2D,只使用纹理精灵以简单的方式) ...
- Android平台OpenGL ES图像处理(improving)
在Android平台一般使用OpenGL ES进行图像处理.在OpenGL ES中编写算法,实现效果,最后将处理的结果传输给 CPU,然后生成最终的照片. 直播中的美颜,对性能有很高的要求,无法使用特 ...
- android三个骰子摇动动画,【Android】OpenGL ES实现3D抛骰子
实现的效果: 抛骰子 加载模型 一.OpenGL简介 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言.跨平台的编程接口的规格,它用于三维图象(二维的亦可).Op ...
最新文章
- unity test相关
- (札记)Altera Stratix IV系列FPGA TRUE LVDS RX input termination 在Quartus工程中的设置方法...
- 初识Tcl(一):Tcl 命令
- Django开发—如何重置migration
- Centos7.0上搭建LAMP平台安装discuz后无法访问
- PooledByteBuf源码分析
- ASP.NET Core WebAPI中使用JWT Bearer认证和授权
- WebHelper类
- 干掉Spring Cloud和Dubbo!阿里这个神级框架究竟有多牛?
- SSO (单点登录)实现方式
- 如何在cmd命令提示符里打开Python
- 第六章 jQuery 选择器——课后作业:
- svn —— 版本回退
- php网站访问卡顿,网站反应慢,经常卡顿是什么原因?怎么解决?
- oracle 并置,Oracle Coherence中文教程二:安装Oracle Coherence
- html文档怎么设置默认浏览器打开,win10系统如何设置HTML文件指定浏览器打开?...
- 桌面视频录制软件有哪些?怎么简单又快地录制视频?
- qt显示温度℃度数°或中文等特殊符号
- 如何使用DD-WRT增强Wi-Fi网络信号并增加范围
- 腾讯云学生服务器(官网校园计划)
热门文章
- 转:Ubuntu 开机加载路由设置
- svn(subversion)代码版本管理在linux下的一些常见使用命令
- WINCE源代码配置文件
- 【WPF】MVVM模式的3种command
- Errno 256 No more mirrors to try
- Chapter 4.SQL编程
- Target runtime Apache Tomcat v6.0 is not defined
- 漂亮的HTML表格 - ebirdfighter的日志 - 网易博客
- JAVA获取当前系统时间System.currentTimeMillis()
- spring mvc xml格式输入输出