PART ONE

codes.cpp

#include <stdio.h>
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <iostream>
using namespace std;#define width 222
#define height 207
#define num 2  //计数器struct Vector3f {GLfloat x;GLfloat y;GLfloat z;
};struct Color {GLubyte r;GLubyte g;GLubyte b;GLubyte a;
};Color interp_color(Color c0, Color c1, float i)
{Color c;c.r = (1 - i) * c0.r + i * c1.r;c.g = (1 - i) * c0.g + i * c1.g;c.b = (1 - i) * c0.b + i * c1.b;c.a = (1 - i) * c0.a + i * c1.a;return c;
}GLubyte image[height][width][4];
void initLines()
{//定义NDC下的顶点数据Vector3f points[num]{{0.0f,0.5f,0.0f},{0.5f,0.0f,0.0f},};//定义颜色数据Color color[num]{{255,0,0,0},{0,255,0,0}};//将NDC坐标转换成屏幕坐标for (int i = 0; i < num; i++){points[i].x = (points[i].x + 1.0f) * (width / 2 - 1);points[i].y = (points[i].y + 1.0f) * (height / 2 - 1);points[i].z = 0;    //zbuffer统一设置为0}for (int i = 0; i < num; i += 2) { //num=2 启用GL_LINES//定义线的起点int start = i;int start_x = (int)points[start].x;int start_y = (int)points[start].y;Color c0 = color[start];//定义线的终点 两两相邻取点int end;int end_x;int end_y;Color c1;if (i == num - 1) {   end_x = (int)points[0].x;end_y = (int)points[0].y;c1 = color[0];}else {end = i + 1;end_x = (int)points[end].x;end_y = (int)points[end].y;c1 = color[end];}//对点进行x轴排序if (start_x > end_x) {swap(start_x, end_x);swap(start_y, end_y);swap(c0, c1);}//斜率法画线float delta_x = end_x - start_x;float delta_y = end_y - start_y;float lineWidth = 1.0f;//线宽设置为1//颜色插值画线  if (delta_x == 0) {if (delta_y < 0) {swap(start_y, end_y);swap(c0, c1);}for (int y = start_y, x = start_x; y <= end_y; y++) {//插值系数i根据y轴计算float i = (float)(y - start_y) / (end_y - start_y);Color icolor = interp_color(c0,c1,i);image[y][x][0] = icolor.r;image[y][x][1] = icolor.g;image[y][x][2] = icolor.b;image[y][x][3] = icolor.a;}}else {float gradient = (float)delta_y / delta_x;for (int x = start_x; x <= end_x; x++) {//插值系数i根据x轴计算float i = (float)(x-start_x) /(end_x - start_x);Color icolor = interp_color(c0, c1, i);//直线斜率公式int y = (int)(gradient * (x - start_x) + start_y);       image[y][x][0] = icolor.r;image[y][x][1] = icolor.g;image[y][x][2] = icolor.b;image[y][x][3] = icolor.a;}}}
}void render()
{glClear(GL_COLOR_BUFFER_BIT);glDrawPixels(width, height, GL_RGBA, GL_UNSIGNED_BYTE, image);glutSwapBuffers();
}int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);glutInitWindowSize(width, height);glutInitWindowPosition(200, 100);int id = glutCreateWindow("彩色线段");GLenum err = glewInit();if (err != GLEW_OK) {fprintf(stderr, "Error: '%s'\n", glewGetErrorString(err));return 1;}initLines();glutDisplayFunc(render);glutMainLoop();return 0;
}

部分二

代码分析

1、在initLines()函数中,利用顶点索引坐标start和end在color[num]中进行顶点颜色的采样,得到点对{start:end}对应的颜色属性{c0:c1}。在根据x轴对顶点进行排序时,颜色属性同步处理。在"delta_x == 0"时,如果"delta_y < 0",颜色属性亦同步处理,否则根据y轴坐标获取插值系数"i"。在"delta_x != 0"时,利用x轴坐标信息完成对插值系数"i"的计算后,根据点对{start:end}和其对应的颜色属性{c0:c1}还有获得的插值系数"i"在函数interp_color( , , )中完成调用,有interp_color(c0, c1, i),即得到了不同像素点对应的颜色属性icolor。根据采样的点对{start:end}的坐标信息(x, y)和颜色信息icolor,在image[y][x][4]中写入icolor获得不同颜色的像素。

2、在render()中,利用glDrawPixels(, , , , image)完成对image[height][width][4]中像素信息的绘制,之后SwapBuffer显示到屏幕。

OpenGL: Colorful Line(CR)相关推荐

  1. (转)跨越Opengl和D3D的鸿沟

    原帖地址: http://www.cnblogs.com/gongminmin/archive/2011/07/15/2107290.html 多年来,在论坛和各个网站上不断能看到拿OpenGL和D3 ...

  2. (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)...

    1. libcurl 的参考文档如下 CURLOPT_HEADERFUNCTION Pass a pointer to a function that matches the following pr ...

  3. Oracle EBS SLA取值

    -- 从GL总账追溯到 => 子分类账SLA => 子模块AP.AR等 SELECT xep.name, -- 法人主体xep.legal_entity_identifier, -- 法人 ...

  4. @程序员,不容错过的 Vim 实用技巧请查收!

    Vim 是 Linux 系统上的最著名的文本/代码编辑器,也是早年的 Vi 编辑器的加强版.一直以来,Vim 普遍被推崇为类 Vi 编辑器中最好的一个,其拥有代码补全.编译及错误跳转等诸多丰富的功能, ...

  5. Cairo学习(一)

    Cairo 介绍 最近在看Cairo,准备做ofd生成图片.技术选型选了几天,编译过Mesa3D,但是好像不太适合.最后选择Cairo 2D绘图库,因为是在Linux下跑的,特地安装了个CentOS7 ...

  6. python autoit打开软件_Python+AutoIt实现界面工具开发

    前言 不同于Linux服务器上的命令行操作,在windows系统上用户的使用习惯还是倾向于使用有界面的工具.如果工具是命令行交互操作的方式,可能是有悖于在windows上使用的操作习惯,往往不容易推广 ...

  7. jpg图片无损放入PDF的程序,PDF文件格式分析,图像表达方式

    wxleasyland@139.com 用打印的方式,一般是将JPG解码后的数据发给打印机,而不是JPG原始数据,所以PDF打印机会重新压缩. 不对JPG图像进行解压,直接将JPG图像传送到虚拟打印机 ...

  8. [倚天屠龙记] vim 复制与粘贴

    对于任何一款文本编辑器而言,复制与粘贴都是最基本的功能,vim在此方面自然不甘示弱.事实上,得益于其丰富的移动命令,vim的复制与粘贴是相当快捷而高效的. vim的复制命令是y和Y,它是yank的简写 ...

  9. 在midjourney看到比较有趣的AI图并记录prompt(一)

    a psychedelic retreat on top of the mountains, it's snowing, sunrise,a lot of people, lot of vegetat ...

最新文章

  1. SpringBoot系列二:搭建自己的第一个SpringBoot程序
  2. 编程之美2.10 寻找数组中的最大值和最小值
  3. FlashMapManager
  4. php配置文件php.ini的详细解析(续)
  5. Openshift3.9部署手册
  6. Velocity简单语法及VelocityHelper封装
  7. 解决WordPress设置错误的url网站不能访问的问题
  8. wxpython安装linux_Ubuntu中安装wxPython
  9. 判断 wp 是否是活跃页面
  10. 七个月自学进微软——我的编程算法学习心得
  11. cygwin的离线安装包
  12. 一些杂七杂八的算法(打表,递推,随机选择算法)
  13. XShell/Xftp免费版下载及安装教程
  14. 台湾ICPlus IP178G/GH/GI 8接口FE以太网交换机芯片详细介绍
  15. Python内置函数详解
  16. Java____利用HSSF导出、导入excel文件
  17. 模块“DAO350.DLL”可能与你正在运行的windows版本不兼容
  18. 汶川大地震已过十一年,我仍记忆犹新
  19. Python量化代码源码160个,聚宽直接使用,已全部整理
  20. 用U盘在虚拟机中装Linux系统

热门文章

  1. android apk无法覆盖安装解决
  2. list-style
  3. 提取文件夹中所有.jpg的名称
  4. 向外张扬的人在做梦,向内审视的人才最清醒
  5. PS教程!教你打造超酷炫的德罗斯特效应
  6. “诚迈杯”南邮校赛邀请赛
  7. 关于最近WORD转PDF时候出现空白页的解决办法
  8. 人脸识别损失:特征归一化
  9. 辩才无碍——智慧的自然利用
  10. mysql chown_chown -R mysql:mysql ./及chown详解