重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要介绍OpenGL中点Bresenham怎么绘制直线算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
目前创新互联公司已为成百上千家的企业提供了网站建设、域名、网页空间、网站运营、企业网站设计、城北网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
具体内容如下
环境
macos xcode编译器
代码
#include#include #include #include #include using namespace std; float wid = 400; //设置窗口的大小,约定窗口必须为正方形 float height = wid; //设置窗口的大小 int numbers = 20; //设置划分的网格的个数 float t = wid/numbers; //模拟像素下的单位1 /* 参数设置说明: 输入直线的两点A(x1,y1);B(x2,y2) 您应当确保参数范围在-400~400.且为整数。 *支持不同斜率 *支持两点位置颠倒 */ int x1 = -300,y1=-400,x2 =400,y2 = 100; void draw_point(float x, float y,int k_kind,int d_kind); float translater(int x); void swap(int &a, int &b) { int tmp = 0; tmp = b; b = a; a = tmp; } void bresenham(int x1, int y1,int x2, int y2){ /* 函数说明:bresenham算法部分 参数说明:与openGL已有的划线函数一样,要求用户提供的是点的起点(x1,y1)和终点(x2,y2) 为了便于观察,我们会绘制原像素下的直线。 这里的坐标要求是-1 ~ 1 */ int k_kind = 0; //k_kind用来表示斜率的类型。0是0~1;1是1~无穷;2是0~-1;3是负无穷~-1 int d_kind =0; //d_kind用来表示dy正负的类型。 if (x1 > x2) { swap(x1,x2); swap(y1,y2); } int dx = abs(x2-x1), dy = abs(y2-y1); if (y1 > y2) {//如果是向下的 y1 = -y1; y2 = -y2; d_kind = 1; } if (dy > dx) { //斜率介于1~无穷的,将看作坐标系变换(这里将坐标变换)。 swap(x1, y1); swap(x2,y2); swap(dx,dy); k_kind = 1; } float d = (dy +dy -dx)*t; //令d为决策量(这里利用d = dx*w*2避免浮点运算) float x = x1+0.0,y = y1+0.0; draw_point(translater(x),translater(y),k_kind,d_kind); //绘制下一个点 while( x < x2){ //以x为步长 if (d < 0){ d += 2*dy*t; } else{ d += 2*(dy-dx)*t; y += t; //说明应该画在上面那个位置 } x= x + t; draw_point(translater(x),translater(y),k_kind,d_kind); //绘制下一个点 } } float translater(int x){ /* 函数说明:将像素坐标下的坐标转化为openGL坐标 参数说明:传入点像素坐标-wid-wid,返回-1~1坐标 */ return x/wid; } void draw_point(float x , float y, int k_kind,int d_kind){ /* 函数说明:绘制像素的点,这里将点的大小设置为7。 颜色采用蓝色。 参数说明:浮点数x,y是openGl坐标系。kind是指明斜率的类型 */ glPointSize(7); glColor3f(0.0,0.0,1.0); glBegin(GL_POINTS); cout <<"k:"< 以上是“OpenGL中点Bresenham怎么绘制直线算法”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!
分享名称:OpenGL中点Bresenham怎么绘制直线算法
分享路径:http://cqcxhl.cn/article/gesgss.html