最近在写一个数值计算数学软件,用于矩阵分析、线性、非线性方程(组)求解、数值积分的求解,二维、三维绘图。

其中的三维绘图,用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绘制任意方程的三维空间图形相关推荐

  1. 【Qt for Android】OpenGL ES 绘制彩色立方体

    Qt 内置对OpenGL ES的支持.选用Qt进行OpenGL ES的开发是很方便的,很多辅助类都已经具备.从Qt 5.0開始添加了一个QWindow类,该类既能够使用OpenGL绘制3D图形,也能够 ...

  2. Android Studio OpenGL ES绘制三棱锥/四面体的多纹理贴图 每个面使用一张图片渲染

    本文参考了王刚的<疯狂Android讲义(第3版)>P554-P559 要求:利用OpenGL ES绘制一个三棱锥,并对每个面进行纹理贴图,每个面使用不同的图片进行渲染. 环境:Andro ...

  3. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  4. 安卓学习笔记37:利用OpenGL ES绘制平面图形

    文章目录 零.学习目标 一.OpenGL概述 二.了解三维直角坐标系 三.案例演示 - 绘制三角形 (一)运行效果 (二)实现步骤 1.创建安卓应用[DrawTriangle] 2.建模:创建三角形类 ...

  5. OpenGL ES:绘制函数glDrawArrays 和 glDrawElements 的区别

    from:https://www.jianshu.com/p/4d02c2cd21ea 写文章注册登录 首页 下载App OpenGL ES:绘制函数glDrawArrays 和 glDrawElem ...

  6. Android下Opengl ES实现单屏幕双眼显示

    http://blog.csdn.net/u011371324/article/details/68946779 默认情况下,Opengl ES使用系统提供的帧缓冲区作为绘图表面,一般情况下,如果只在 ...

  7. 适用于ios和android,适用于iOS和Android的OpenGL ES差异

    我有一个适用于iOS和 Android的OpenGL ES应用程序.大多数代码是很久以前由另一个人编写的,现在我必须维护它. OpenGL的使用看起来相当简单(游戏是2D,只使用纹理精灵以简单的方式) ...

  8. Android平台OpenGL ES图像处理(improving)

    在Android平台一般使用OpenGL ES进行图像处理.在OpenGL ES中编写算法,实现效果,最后将处理的结果传输给 CPU,然后生成最终的照片. 直播中的美颜,对性能有很高的要求,无法使用特 ...

  9. android三个骰子摇动动画,【Android】OpenGL ES实现3D抛骰子

    实现的效果: 抛骰子 加载模型 一.OpenGL简介 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言.跨平台的编程接口的规格,它用于三维图象(二维的亦可).Op ...

最新文章

  1. unity test相关
  2. (札记)Altera Stratix IV系列FPGA TRUE LVDS RX input termination 在Quartus工程中的设置方法...
  3. 初识Tcl(一):Tcl 命令
  4. Django开发—如何重置migration
  5. Centos7.0上搭建LAMP平台安装discuz后无法访问
  6. PooledByteBuf源码分析
  7. ASP.NET Core WebAPI中使用JWT Bearer认证和授权
  8. WebHelper类
  9. 干掉Spring Cloud和Dubbo!阿里这个神级框架究竟有多牛?
  10. SSO (单点登录)实现方式
  11. 如何在cmd命令提示符里打开Python
  12. 第六章 jQuery 选择器——课后作业:
  13. svn —— 版本回退
  14. php网站访问卡顿,网站反应慢,经常卡顿是什么原因?怎么解决?
  15. oracle 并置,Oracle Coherence中文教程二:安装Oracle Coherence
  16. html文档怎么设置默认浏览器打开,win10系统如何设置HTML文件指定浏览器打开?...
  17. 桌面视频录制软件有哪些?怎么简单又快地录制视频?
  18. qt显示温度℃度数°或中文等特殊符号
  19. 如何使用DD-WRT增强Wi-Fi网络信号并增加范围
  20. 腾讯云学生服务器(官网校园计划)

热门文章

  1. 转:Ubuntu 开机加载路由设置
  2. svn(subversion)代码版本管理在linux下的一些常见使用命令
  3. WINCE源代码配置文件
  4. 【WPF】MVVM模式的3种command
  5. Errno 256 No more mirrors to try
  6. Chapter 4.SQL编程
  7. Target runtime Apache Tomcat v6.0 is not defined
  8. 漂亮的HTML表格 - ebirdfighter的日志 - 网易博客
  9. JAVA获取当前系统时间System.currentTimeMillis()
  10. spring mvc xml格式输入输出