android用openGl ES绘制任意方程的三维空间图形
生活随笔
收集整理的這篇文章主要介紹了
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绘制任意方程的三维空间图形的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java和C操作数组的一个小区别
- 下一篇: 2017matlab版本Simulink