首页 > 编程语言 >(3)---【C语言】【GL库】【计算机图形学】DEV C++ 平台openGL库 下的画线图案设计 房屋【几何变换】图形实现

(3)---【C语言】【GL库】【计算机图形学】DEV C++ 平台openGL库 下的画线图案设计 房屋【几何变换】图形实现

时间:2024-11-04 23:45:58浏览次数:5  
标签:850 openGL house 640 图形学 730 几何变换 1.0 680

声明:

        由于本人是一名学生,现阶段还要完成学业,所以我们每周假期再回!谢谢大家理解和支持!

上篇上手实践  

运行结果

 

实现代码

#include <windows.h>
#define GLUT_DISABLE_ATEXIT_HACK //处理不同系统的配置问题的宏

#include <GL/glut.h>  
#include <stdio.h>

//定义二维数组,其第二维含有两个元素 
//调用glVertex2i(houseline[i][0][Winheight-houseline[i][1])
int house_outline[][2]={
{290,1040},{290,1000},{380,870},{470,870},{470,730},{405,730},{405,680},
{455,680},{455,530},{365,525},{365,500},{500,375},{530,375},{700,240},
{730,240},{850,275},{850,190},{880,180},{900,190},{935,175},{980,190},
{980,335},{1080,440},{1080,560},{1200,640},{1200,665},{1150,665},{1150,1040},
{925,1040},{680,1040},{450,1040},{450,1000},{530,890},{620,890},{620,520},
{640,520},{640,480},{685,485},{685,525},{640,520},{640,480},{500,375},{600,380},
{700,490},{685,485},{640,480},{640,520},{620,520},{500,455},{405,525},{455,530},{530,465}
};

int house_chimney[][2]={
{670,520},{670,560},{680,560},{680,1040},{680,560},{730,560},{730,240},{730,560},{765,560},
{765,495},{765,520},{925,630},{925,1040},{925,630},{935,640},{1150,660},{1150,1040},{1150,660},
{1200,665},{1200,640},{935,615},{935,640},{935,615},{765,495},{880,510},{880,180},{880,350},
{850,350},{850,275},{850,350},{730,320},{880,350},{880,510},{900,513},{900,190},{935,175},{935,520},
{900,513},{935,520},{980,535},{980,335},{980,535},{1080,560}
}; 

int house_door[][2]={
{405,680},{585,680},{585,730},{470,730},{585,730},{585,890},{500,890},{500,730},{550,730},
{550,800},{540,800},{540,780},{540,840},{540,820},{550,820},{550,800},{550,890},{560,890},
{560,730}	
};

int house_stairs1[][2]={
{550,890},{470,890},{470,870},{410,870},{320,1000},{425,1000},{510,890}	
};

int house_stairs2[][2]={
{290,1040},{600,1040},{500,905},{420,905},{420,905},{420,930},{480,930},{400,930},{400,930},
{400,955},{460,955},{380,955},{380,955},{380,980},{440,980},{360,980},{360,980},{360,1000}
};

int house_windows1[][2]={
{660,310},{660,380},{700,375},{700,305},{660,310},{680,307},{680,377}
};

int house_windows2[][2]={
{470,530},{470,680},{585,680},{585,530},{470,530},{527,530},{527,680}
};

int house_windows3[][2]={
{880,735},{880,910},{730,910},{730,735},{880,735},{880,823},{730,823},
{805,823},{805,735},{805,910}
};

int house_windows4[][2]={
{830,570},{770,570},{770,670},{830,670},{830,570},{800,570},{800,610},
{810,610},{810,630},{810,610},{800,610},{800,670}
};

int house_windows5[][2]={
{950,735},{1120,735},{1150,850},{1120,850},{1120,910},{950,910},{950,735},
{1120,735},{1150,850},{1080,850},{1080,910},{1080,850},{1010,850},{1010,910},
{1010,850},{970,850},{950,735}
};

//自定义划线函数,方便后续重复调用,减少工作量 
void DrawLine(float x=1.0,float y=1.0,float z=1.0){
//程序健壮性 
if((x||y||z)>1.0 && (x||y||z)<0.0){
	printf("ERROR:函数实参范围为[0.0<=(x||y||z)<=1.0]\n");
	x=0.0;
	y=1.0;
	z=1.0;
}

//房子外部轮廓  	
  	glBegin(GL_LINE_STRIP); 
	glColor3f(x, y, z); // 设置线条颜色
  	for(int i=0;i<52;i++){
		glVertex2i(house_outline[i][0],1271-house_outline[i][1]);}
    glEnd();  

//右侧墙壁和烟囱	
	glBegin(GL_LINE_STRIP );
	glColor3f(x, y, z); // 设置线条颜色
  	for(int i=0;i<43;i++){
		glVertex2i(house_chimney[i][0],1271-house_chimney[i][1]);}	    
	glEnd();

//房子门	
	glBegin(GL_LINE_STRIP);
	glColor3f(x, y, z); // 设置线条颜色
  	for(int i=0;i<19;i++){
		glVertex2i(house_door[i][0],1271-house_door[i][1]);}		
	glEnd();

//楼梯
	glBegin(GL_LINE_STRIP);
	glColor3f(x, y, z); // 设置线条颜色	
  	for(int i=0;i<7;i++){
			glVertex2i(house_stairs1[i][0],1271-house_stairs1[i][1]);}
	glEnd(); 
	
	glBegin(GL_LINES);
	glColor3f(x, y, z); // 设置线条颜色
  	for(int i=0;i<18;i++){
		glVertex2i(house_stairs2[i][0],1271-house_stairs2[i][1]);}
	glEnd();

//窗户 
	glColor3f(x, y, z);// 设置线条颜色
  	//最上面小窗户
  	glBegin(GL_LINE_STRIP);
	for(int i=0;i<7;i++){
		glVertex2i(house_windows1[i][0],1271-house_windows1[i][1]);}		
	glEnd();
	
	//阳台窗户
	glBegin(GL_LINE_STRIP);
	for(int i=0;i<7;i++){
		glVertex2i(house_windows2[i][0],1271-house_windows2[i][1]);}
	glEnd();
	
	//中间大窗户
	glBegin(GL_LINE_STRIP);	
	for(int i=0;i<10;i++){
		glVertex2i(house_windows3[i][0],1271-house_windows3[i][1]);}
	glEnd();
	
	//中间小窗户 
	glBegin(GL_LINE_STRIP);
	for(int i=0;i<12;i++){
		glVertex2i(house_windows4[i][0],1271-house_windows4[i][1]);}				
	glEnd();
	
	//最右侧窗户
	glBegin(GL_LINE_STRIP);
	for(int i=0;i<17;i++){
			glVertex2i(house_windows5[i][0],1271-house_windows5[i][1]);}
	glEnd();
}

void drawHouse(void) {   
   	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除屏幕和缓存区 
	glLineWidth(5);  //画笔宽度 
	glMatrixMode(GL_MODELVIEW);     //几何变换函数
	//几何变换 
	glTranslatef(1300,200,0);  //平移 
	DrawLine(0.0,1.0,1.0);
	glTranslatef(250,70,0); 
	glScalef(0.75,0.75,1);		//收缩
   	DrawLine(1.0,0.0,0.0);
   	glLoadIdentity();
	glTranslatef(950,800,0); 
	glScalef(0.5,0.5,1);		//收缩
	glRotatef(-20,0.0,0.0,1.0); //旋转
   	DrawLine(1.0,0.0,1.0);
	glLoadIdentity();   //还原源图片 
	//原图 (白色)
	DrawLine();	
	glFlush();  
}  

void init(void) {  
    glClearColor(0.0, 0.0, 0.0, 0.0);   // 设置背景色为黑色  
    glMatrixMode(GL_PROJECTION);     	//	glPolygonMode(GL_FRONT_AND_BACK ,GL_POINT);
    gluOrtho2D(0.0, 2700, 0.0, 1500.0); // 设置二维正交投影坐标轴 
} 
  
int main(int argc, char** argv) {  
    glutInit(&argc, argv);  
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  
    glutInitWindowPosition(0.0, 50); //绘图窗口与电脑桌面左上角的位置关系
    glutInitWindowSize(2700, 1500); // 使用更合适的窗口大小  
    glutCreateWindow("House-Transformation"); 
    init();  
    glutDisplayFunc(drawHouse);  
    glutMainLoop();  
    return 0;  
}

功能简单介绍

        这段代码使用OpenGL和GLUT库在Windows平台上绘制了一个房屋的轮廓,并对其进行了几何变换。

主要功能包括: 定义了房屋轮廓、烟囱、门、楼梯和窗户的坐标数组。 实现了DrawLine函数,用于绘制房屋的各个部分,可通过参数设置线条颜色。 drawHouse函数中,使用glClear清除屏幕和缓存区,设置画笔宽度,并进行了平移、缩放和旋转等几何变换,绘制了不同颜色和位置的房屋。 init函数设置了背景色为黑色,并定义了二维正交投影坐标轴。 main函数初始化GLUT,创建窗口,设置显示函数为drawHouse,并进入主循环。

         代码展示了OpenGL的基本绘图和变换功能,适用于学习计算机图形学的基础知识。通过修改几何变换参数,可以轻松实现不同的视觉效果。

与上篇实验项目代码比对

        新增代码段

	glMatrixMode(GL_MODELVIEW);     //几何变换函数
	//几何变换 
	glTranslatef(1300,200,0);  //平移 
	DrawLine(0.0,1.0,1.0);
	glTranslatef(250,70,0); 
	glScalef(0.75,0.75,1);		//收缩
   	DrawLine(1.0,0.0,0.0);
   	glLoadIdentity();
	glTranslatef(950,800,0); 
	glScalef(0.5,0.5,1);		//收缩
	glRotatef(-20,0.0,0.0,1.0); //旋转
   	DrawLine(1.0,0.0,1.0);
	glLoadIdentity();   //还原源图片 

标签:850,openGL,house,640,图形学,730,几何变换,1.0,680
From: https://blog.csdn.net/2303_77716250/article/details/143496827

相关文章

  • (2)---【C语言】【GL库】【计算机图形学】DEV C++ 平台openGL库 下的画线图案设计 房
     上篇上手实践  运行结果  实现代码#include<windows.h>#include<GL/glut.h>#defineGLUT_DISABLE_ATEXIT_HACK//处理不同系统宏//星状结构函数,添加了几何中心坐标,半径,叶片宽度占比,叶片数量--------------------------------//绘制内部星状结构基本元素的......
  • DEV C++ 平台【openGL】库 几何变换下图案设计 星状图形 与 圆 的画法实现 【C语言】
     项目实现话不多说,上干货!    在本文中,我们将探讨如何使用OpenGL库在DEVC++平台上绘制一个包含星状图形和圆的设计。功能简单介绍    该代码通过定义多个函数,实现了圆和星状图形的精确绘制。首先,DrawingCircle函数负责绘制圆,通过指定圆心坐标和半径,利用三角......
  • 第四届计算机图形学、人工智能与数据处理国际学术会议 2024 4th International Conf
    @目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus大会时间:2024年12月13-15日大会地点:中国·南昌三、大会介绍第四届计算机图形学、人工智能与......
  • android OpenGL ES详解——双缓冲区、默认缓冲区和帧缓冲区
    目录一、双缓冲1、概念2、如何使用1、初始化双缓冲2、绘制操作3、交换缓冲区3、优势1、避免屏幕闪烁2、提高渲染效率3、优化资源利用4、注意事项1、内存使用2、交换时间3、同步问题二、默认缓冲1、概念2、如何使用1、渲染操作2、显示操作3、交换缓冲3、注......
  • Qt开发技巧(十九):定时器的调用问题,控件的透明问题,慎用事件过滤器,依赖库的路径链接,对话框
    继续讲一些Qt开发中的技巧操作:1.定时器的调用问题有一个场景经常遇到,那就是在符合某个条件下,延时一段时间去执行一段代码,如果短时间内触发多次又不需要频繁执行,只需要执行一次就行。如果选择用QTimer::singleShot无法终止已经触发的,这个时候就要主动实例化一个单次定时器,......
  • Android OpenGL光照效果
    在计算机图形学领域,光照仿真是一个重要的研究领域,它对游戏画面的提升、电影和电视节目中的电脑生成图像(CGI)等方面产生了显著影响。通过使用不同的光照算法,我们可以改变场景的外观,例如模拟从白天到夜晚的过渡,或者在山体上产生山峰、峡谷和裂隙的效果。即使是二维场景,也可以通......
  • VS2022安装OpenGL (GLUT)
    VS2022安装OpenGL(GLUT)下载GLUT并解压安装打开VS2022根目录下的include文件夹:...\2022\VC\Tools\MSVC\14.31.31103\include在这里创建一个名为gl的文件夹在gl文件夹中放入glut.h文件打开VS2022根目录下的lib文件夹:xxx\VS2022\VC\Tools\MSVC\14.31.31103\lib打开其中的......
  • ECE 4122/6122 OpenGL with OBJ files and Multiple Objects
    ECE4122/6122Lab3:OpenGLwithOBJfilesandMultipleObjects(100pts)Category:3DGraphicsDue:TuesdayOctober22th,2023by11:59PMObjective:Tocreateadynamic3Dgraphicsapplicationusinglighting,shading,modeltransformations,andkeyboa......
  • OpenGL高级特性超详细入门教程知识点总结攻略学习目录
    OpenGL知识点目录一、OpenGL简介与基本概念二、OpenGL渲染管线与流程三、OpenGL着色器编程四、OpenGL纹理与材质五、OpenGL灯光与阴影六、OpenGL缓冲区与帧缓存七、OpenGL高级特性与最新发展八、如何学习OpenGL九、OpenGL资源简介一、OpenGL简介与基本概念重点详细内容知......
  • OpenGL模型变换平移、缩放、旋转注意事项
    一、概述在OpenGL中,想要对物体(模型)进行操作,如:平移、缩放、旋转。其顺序不能错,不同的顺序会给出不同的结果网上的博客大家看过后要慎重使用,好多都是错误的,在实际项目中使用前最好先写demo进行验证,不然一旦整合到项目中,排错成本将会非常高。三者的顺序是:理......