android opengl 贝塞尔曲线,OpenGL绘制贝塞尔曲线.pdf

OpenGL绘绘制制贝贝塞塞尔尔曲曲线线

本文实例为大家分享了OpenGL绘制贝塞尔曲线的具体代码,供大家参考,具体内容如下

最 效果图:

通过3个点形成一条贝塞尔曲线

1. 鼠鼠标标问问题题

在使用鼠标获取坐标的时候,要知道鼠标获取的坐标和屏幕坐标是不同的;

openGL使用右手坐标

从左到右,x递增

从下到上,y递增

从远到近,z递增

而鼠标是从左到右增x ,同时从上到下也是增y

所以在求 y 的时候,用(屏幕大小-y)来获取

2. 绘绘制制

setpoint 用来绘制点

setline 用来绘制线

setBezier 用来绘制贝塞尔曲线

其中公式的意义可以参考百科:

实际绘制的时候就是不断的增加t,求出下一点的值然后将两个链接起来,然后再将下一个点作为起点,再求出下下一个点

A pi解释在代码中

#include "GL\glut.h"

#include

#include

//这是一个点的类,用于存储其中点的坐标

class Point

{

public:

int , y;

void set y(int _ , int _y) {

= _ ;

y = _y;

}

};

//点的数量

static int POINTSNUM = 0;

//用于存储点的集合,因为绘制的都是4个点的贝塞尔曲线,所以数组大小为4

static Point points[4];

//初始化函数

void init(void)

{

glClearColor(1.0, 1.0, 1.0, 0); //设定背景为黑色

glColor3f(0.0,0.0,0.0); //绘图颜色为白色

glPointSize(2.0); //设定点的大小为2*2像素的

glMatri Mode(GL_PROJECTION); // 设定合适的矩阵

glLoadIdentity(); // 是一个无参的无值函数,其功能是用一个4×4的单位矩阵来替换当前矩阵,实际上

就是对当前矩阵进行初始化。也就是说,无论以前进行了多少次矩阵变换,在该命令执行后,当前矩阵均恢复成

一个单位矩阵,即相当于没有进行任何矩阵变换状态

gluOrtho2D(0.0,600.0,0.0,480.0); //平行投影,四个参数分别是 ,y范围

}

//绘制点

void setPoint(Point p) {

glBegin(GL_POINTS);

glVerte 2f(p. , p.y);

glEnd();

glFlush();

}

// 绘制直线

void setline(Point p1, Point p2) {

glBegin(GL_LINES);

glVerte 2f(p1. ,p1.y);

glVerte 2f(p2. , p2.y);

glEnd();

glFlush();

}

// 绘制贝塞尔曲线

Point setBezier(Point p1, Point p2, Point p3, Point p4,double t) {

Point p;

double a1 = pow((1 - t), 3);

double a2 = pow((1 - t), 2) * 3 * t;

double a3 = 3 * t*t*(1 - t);

double a4 = t*t*t;

p. = a1*p1. + a2*p2. + a3*p3. + a4*p4. ;

p.y = a1*p1.y + a2*p2.y + a3*p3.y + a4*p4.y;

return p;

}

//display函数

void display()

{

glClear(GL_COLOR_BUFFER_BIT);

glFlush();

}

// 鼠标事件

void mymouseFunction(int button, int state, int , int y) {

if (state == GLUT_DOWN) // 如果鼠标按下,不区分左右键的

{

points[POINTSNUM].set y( ,480- y); // 这里求鼠标点的坐标的时候

// 设置点的颜色,绘制点

glColor3f(1.0,0.0,0.0);

setPoint(points[POINTSNUM]);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值