本文实例为大家分享了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 <

if(k_kind==0&&d_kind==1){

y = -y;

}else if (k_kind ==1 &&d_kind==1){

x= -x;

swap(x,y);

}else if (k_kind==1&&d_kind ==0){

swap(x,y);

}

glVertex3f(x,y,0.0);

glEnd();

glFlush();

}

void grid(){

/*

函数说明:绘制网格为了便于将真实的像素pixel转化为我们模拟的像素

*/

glClearColor(0, 0, 0, 0);//这是设置背景色,必须要在glclear之前调用

glClear(GL_COLOR_BUFFER_BIT);

//画直线

int wid_number = numbers;

int hei_number = numbers;

float delta_wid = wid / wid_number;

float delta_hei = height / hei_number;

glColor3f(1.0,1.0,0);

for (int i = 1; i < 40 ; i ++ ) {

glBegin(GL_LINES);

glVertex2f(-1+i*delta_hei/height, -1);

glVertex2f(-1+i*delta_hei/height, 1);

glVertex2f(-1,-1+i*delta_hei/height);

glVertex2f(1,-1+i*delta_hei/height);

glEnd();

glFlush();

}

glColor3f(1.0,0,0);

glBegin(GL_LINES); //绘制坐标系,便于观察

glVertex2f(-1,0);

glVertex2f(1,0);

glVertex2f(0,-1);

glVertex2f(0,1);

glEnd();

glFlush();

glBegin(GL_LINES);

glColor3f(1.0,0.0,0.0);

glVertex2f(translater(x1),translater(y1)); //定点坐标范围

glVertex2f(translater(x2),translater(y2));

glEnd();

glFlush();

//刷新缓冲,保证绘图命令能被执行

bresenham(x1, y1,x2,y2);

}

int main(int argc, char *argv[]) {

//初始化GLUT library

glutInit(&argc, argv);

//对窗口的大小进行初始化

glutInitWindowSize(700,700);

glutInitWindowPosition(300,200);

// 设置窗口出现的位置

//glutInitWindowPosition(int x, int y);

glutInitDisplayMode(GLUT_RGBA);

glutCreateWindow("class16_hw1");

glutDisplayFunc(&grid);

glutMainLoop();

return 0;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java bresenham画直线_OpenGL中点Bresenham绘制直线算法相关推荐

  1. java canvas 画线_canvas教程(二) 绘制直线

    经过 而本次是给大家带来直线的绘制 canvas 中,基本图形有两种,一种是直线,还有一种是曲线 但是无论是直线还是曲线,我们都应该先了解 canvas 的坐标系 s canvas 的坐标系 要绘制之 ...

  2. java canvas类画直线_canvas教程(二) 绘制直线

    经过 canvas 教程(一) 简介 我们知道了 canvas 的一些基本情况 而本次是给大家带来直线的绘制 canvas 中,基本图形有两种,一种是直线,还有一种是曲线但是无论是直线还是曲线,我们都 ...

  3. Java基础之在窗口中绘图——绘制直线和矩形(Sketcher 2 drawing lines and rectangles)...

    控制台程序. 1 import javax.swing.JComponent; 2 import java.util.*; 3 import java.awt.*; 4 import java.awt ...

  4. python如何绘制直线_成对绘制直线

    我正在做一个网络项目,在这个项目中,我需要在成对的点(节点)之间绘制线(边).目前我正在使用matplotlib.pyplot但问题是pyplot.plot绘图(x,y)从(x[0],y[0])开始, ...

  5. java水平线代码_java 绘制直线,跪求源代码???

    在几何中,直线是向两端无限延伸的,本实例所说的绘制直线,实际上是绘制直线上两点之间的线段,线段在实际生产和生活中经常使用.运行程序,将在窗体上绘制线段,效果如图1.1所示.图... 在几何中,直线是向 ...

  6. OpenGL—直线与圆的绘制

    实验二 直线与圆的绘制 #define GLUT_DISABLE_ATEXIT_HACK #include <glut.h> template<typename T>inlin ...

  7. 【计算机图形学】基于OpenGL的中点Bresenham算法画直线

    学习过三种画直线的方法(DDA.中点Bresenham算法.改进的中点Bresenham算法)后,想着实际操作一下如何能够实现,OpenGL无疑是很好的选择,在老师的推荐下,我尝试着用OpenGL来实 ...

  8. 计算机图形学实习教程之基本图形的生成(直线DDA算法,直线中点算法,Bresenham画圆算法),利用C#实现,附源码

    环境:Win10+Visual Studio 2022 Community 在本次实验中需要用到上一篇文章实验内容的代码及环境,详情请见:传送门 目录 一.实验目的 二.实验过程 1.生成直线的DDA ...

  9. java bresenham画直线_图形学笔记: Bresenham画线算法

    图形学课本, 按规矩介绍完矩阵行列式, 第一个算法肯定就是Bresenham画线算法了. 來我们來看看算法 Bresenham是用来画一些不反走样的线段的. 都说了线段肯定有起点和终点, 假设我们: ...

最新文章

  1. Angular中数据循环ngFor、条件判断ngIf、ngSwitch、执行事件(click)、表单事件(keyup)、ngClass、ngStyle的使用
  2. C语言作业界面,c语言作业20191011121223
  3. [转]微信小程序 c#后台支付结果回调
  4. 关于Spring中的context:annotation-config/配置
  5. 为什么AI需要的是角色扮演,而不是象棋和围棋?
  6. wordpress古腾堡淘宝客插件,支持京东淘宝
  7. Nginx与TCP协议的关系
  8. iMazing2.14.6Mac最新版iOS苹果设备管理器
  9. STM32G070RBT6迷你开发板制作总结
  10. Linux下curses函数库的详细介绍
  11. TMOS系统之NATS 和 SNAT
  12. 多晴转云h_多晴转云htxt百度云
  13. 关于区块链、Web3.0、智能合约、DApp、DAO一文解释清楚
  14. 【高胜寒碎碎念】为什么有人愿意花两万块钱去参加IT培训学习?
  15. 【BT】经典蓝牙连接速度优化
  16. python程序设计基础知识
  17. linux系统分区加密,Linux系统的几种加密
  18. 苹果设备收到家庭/日历垃圾邀请信息怎么办?
  19. Wannafly挑战赛26:B冥土追魂(模拟?贪心?暴力?)
  20. 回顾2019展望2020

热门文章

  1. 野路子?Origin还能这样用!
  2. linux截图,像qq截图一样好用的截图工具deepin-scrot
  3. 动态加载JS脚本有4种方法
  4. html动态加载js方法,原生JS实现动态加载js文件并在加载成功后执行回调函数的方法...
  5. js设计模式与绘制UML图 - 打车的面试题
  6. C语言之字符串搜索以及替换
  7. SQLite多线程并发操作
  8. 统一物品编码破解追溯“断链”困局
  9. matlab语音停止程序,MATLAB语音信号处理程序
  10. 两两交换链表中的结点-指针