点绘制螺旋线

/**
 * 缓冲区工具类
 */
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);

}

}

点绘制螺旋线

时间: 2024-10-10 00:04:34

点绘制螺旋线的相关文章

OpenGl绘制螺旋线

/** * 缓冲区工具类 */public class BufferUtil { /**  * 将浮点数组转换成字节缓冲区  */ public static ByteBuffer arr2ByteBuffer(float[] arr){  ByteBuffer ibb = ByteBuffer.allocateDirect(arr.length * 4);  ibb.order(ByteOrder.nativeOrder());  FloatBuffer fbb = ibb.asFloatBu

从零开始学习PYTHON3讲义(十二)画一颗心送给你

(内容需要,本讲使用了大量在线公式,如果因为转帖网站不支持公式无法显示的情况,欢迎访问原始博客.) <从零开始PYTHON3>第十二讲 上一节课我们主要讲解了数值计算和符号计算.数值计算的结果,很常用的目的之一就是用于绘制图像,从图像中寻找公式的更多内在规律. Python科学绘图 科学绘图是计算机图形学的一个重要分支.同其它绘图方式相比,更简单易用,能让使用者把工作的主要精力集注在公式和算法上而不是绘图本身.此外科学绘图的工具包普遍精度更高,数据.图的对应关系准确,从而保证基于图的研究工作顺

新年寄语——等距螺旋中的中式思维

螺旋线可以用直线运动与圆周运动相叠加来产生,在这样旋转的空间里,所有的维度不再是直线式的,而是螺旋式的. 所谓的“圆满”只是“止步不前” 我们可以通过数学公式来证明,如果直线运动不存在了(速度为零),螺旋线会变成一个标准的圆.这就像是如果失去了方向,每一天的时光只会变成简单的重复,所以有一个持之以恒的目标对于人生而言是非常的重要. 如果圆周运动不存在了,螺旋会伸展成一条直线,了无挂碍却单调而无趣.这就像是我们的生活终究是需要一些牵绊的,正是这些放不下的牵绊才让我们的轨迹变得如此的丰富和深刻. 2

使用Python的turtle库实现六角形以及正方形螺旋线的绘制

1.六角形的绘制 思路:一个六角形可以看作是两个等边三角形具有共同的中心且垂线互成60°角.所以只需实现一个等边三角形的绘制以及第二个三角形绘制起点的移动即可. 代码如下: import turtleturtle.setup(650,350,200,200)turtle.penup()turtle.pensize(1)turtle.pencolor("red")turtle.fd(100)turtle.seth(30)turtle.pendown()turtle.fd(80)turtl

OpenGL——点的绘制(使用OpenGL来绘制可旋转坐标系的螺旋线)

package com.example.opengl1; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLSurfaceView; im

Python课本第2章习题参考答案(第二版)(Python绘制蟒蛇,中美汇率转换,等边三角形,叠加等边三角形,无角正方形,六角形,正方形螺线)

2.1   实例1的修改,采用eval(input(<提示内容>))替换现有输入部分,并使输出的温度值为整数. 2.2   汇率兑换程序.按照温度转换程序的设计思路,按照1美元=6人民币汇率编写一个美元和人民币的双向兑换程序. 2.3   实例2的修改.改造实例代码2.1,绘制一条彩色的蟒蛇,即在绘制Python蟒蛇的每个小段时,画笔的绘制颜色会发生变化. 提示:将画笔颜色控制函数放到蟒蛇绘制函数附近. 2.4   等边三角形的绘制.使用turtle库中的turtle.fd()函数和turtl

算法图绘制工具Graphviz

graphviz是贝尔实验室设计的一个开源的画图工具,它的强大主要体现在“所思即所得"(WYTIWYG,what you think is what you get),这是和office的“所见即所得“(WYSIWYG,what you see is what you get)完全不同的一种方式.它的输入是一个用dot语言 编写的绘图脚本,通过对输入脚本的解析,分析出其中的点,边以及子图,然后根据属性进行绘制.用graphviz来绘图的时候,你的主要工作就是编写dot脚本,你只要关注图中各个点之

Android-View的绘制源码学习总结

##前言 算是第一篇正式的github博文,回顾了一下之前看过的view源码解析,做一个对目前为止View学习小的总结. 我觉得对于源码的解析和学习,把所有流程记下来意义并不是很大,最关键的是: 1.知道基本作用和用法2.大概了解整个流程和实现方法3.了解里面可扩展的地方在哪,更灵活地使用4.整个源码设计和细节有没有什么亮点值得参考和学习5.源码设计的思路 这也是写这篇文章的目的所在. ##加载布局 ####LayoutInflater http://www.cnblogs.com/qlky/p

仿掌上英雄联盟能力值图形绘制

一,前沿 相信玩撸啊撸的撸友们一定记得掌上英雄联盟App的能力值吧~~ 好吧,不记得没关系我来给大家上张图!! 所以今天呢我就抽空模仿了一下: 照例线来张GIF,有图有真相 下面是我的微博账号希望可以关注哈: Email:[email protected] Github: https://github.com/icuihai. weibo:http://weibo.com/icuihai 二.言归正传 在平常做项目的时候自定义控件用的还是蛮多的,使用别人造好的轮子比较节省时间,但是作为了一个优雅