SimpleCG绘图函数(3)--绘制矩形

news/2024/11/29 17:25:15/

        前面我们已经学习了点和线的绘制,本篇我们继续绘图函数学习----矩形的绘制,也就是长方形的绘制,并给出一个绘制楼房的例子演示矩形的应用。

所有绘制矩形相关函数如下:

//以下矩形左上角坐标(left, top),右下角坐标(right,bottom )
//以线条颜色绘制边框,以填充颜色填充内部//画无填充矩形
void rectangle( int left, int top, int right, int bottom );//画无边框填充矩形
void solidrectangle( int left, int top, int right, int bottom );//画填充矩形
void fillrectangle( int left, int top, int right, int bottom );//清空矩形,以背景色清空矩形
void clearrectangle( int left, int top, int right, int bottom );

可以看到有四个绘制函数,而且参数都是一致的,参数标明矩形左上角坐标,及右下角坐标 。

四个函数效果分别是:

1、画无填充矩形  rectangle
 
2、画无边框填充矩形 solidrectangle


3、画填充矩形 fillrectangle 
 
4、清空矩形,以背景色清空矩形 clearrectangle 

我们以后会看到所有针对类似矩形这种具有面积的图形,都分别实现四种绘制效果,分别是1、无填充--不带有前缀,2、无边框--solid开头,3、带边框及填充--fill开头,4、清空形状区域,也就是以背景色填充。

下面用一个随机城市建筑的绘制例程展示矩形的简单应用:

// Building.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include "../import/include/CGBoard.h"
#include "math.h"#ifdef _DEBUG
#pragma comment(lib,"../import/lib/SimpleCG_MDd.lib")
#else
#pragma comment(lib,"../import/lib/SimpleCG_MD.lib")
#endif#define SUBCOLOR(x,y) ((x-y)<0?0:(x-y))
#define ADDCOLOR(x,y) ((x+y)>255?255:(x+y))
int g_nWidth = 600;		//画面宽度
int g_nHeight= 600;		//画面高度//画建筑的窗户1
void DrawWindow1( int nX, int nY, int nWidth, int nHeight, int nWidthCnt, int nHeightCnt )
{int i;int j;if(nWidthCnt<=0||nHeightCnt<=0)return;int nWidthWindow = nWidth / nWidthCnt;int nHeightWindow = nHeight / nHeightCnt;setfillcolor(RGB(rand()%200,130,180));for( j=0; j<nHeightCnt; j++ )for( i=0; i<nWidthCnt; i++ ){//画填充矩形fillrectangle( nX+nWidthWindow*i, nY+nHeightWindow*j, nX+nWidthWindow*i+nWidthWindow-5, nY+nHeightWindow*j+nHeightWindow-3 );}
}
//画建筑的窗户2
void DrawWindow2( int nX, int nY, int nWidth, int nHeight, int nHeightCnt )
{int i;int j;if(nHeightCnt<=0)return;int nHeightWindow = nHeight / nHeightCnt;setfillcolor(RGB(rand()%255,rand()%255,rand()%255));//画填充矩形fillrectangle( nX, nY, nX+nWidth, nY+nHeight );setfillcolor(RGB(200+rand()%55,200+rand()%55,200+rand()%55));for( j=0; j<nHeightCnt; j++ ){//填充矩形画横边solidrectangle( nX+1, nY+nHeightWindow*j, nX+nWidth, nY+nHeightWindow*j+3 );}//填充矩形画竖边if(rand()%2){solidrectangle( nX+nWidth/5, nY, nX+nWidth/5+10, nY+nHeight );solidrectangle( nX+nWidth*4/5, nY, nX+nWidth*4/5+10, nY+nHeight );}
}
//画建筑的窗户3
void DrawWindow3( int nX, int nY, int nWidth, int nHeight, COLORREF  nColor )
{int i;int j;int nWidthCnt = nWidth / 10;int nHeightCnt = nHeight / 10;int r=GetRValue(nColor);int g=GetGValue(nColor);int b=GetBValue(nColor);setfillcolor(RGB( SUBCOLOR(r,50),SUBCOLOR(g,50),SUBCOLOR(b,50) ));//画填充矩形solidrectangle( nX, nY, nX+nWidth, nY+nHeight );r=GetRValue(nColor);g=GetGValue(nColor);b=GetBValue(nColor);setfillcolor(RGB( ADDCOLOR(r,30),ADDCOLOR(g,30),ADDCOLOR(b,30) ));for( i=1; i<nWidthCnt; i++ ){//画填充矩形solidrectangle( nX+10*i, nY, nX+10*i+3, nY+nHeight );}for( i=1; i<nHeightCnt; i++ ){//画填充矩形solidrectangle( nX, nY+10*i, nX+nWidth, nY+10*i+3 );}	
}
//画建筑类型1
void DrawBuilding1( int nX, int nY, int nWidth, int nHeight )
{int nWidthCnt = (nWidth-10) / 20;int nHeightCnt = (nHeight-10) / 30;//画填充矩形COLORREF  nColor= RGB(rand()%255,rand()%255,rand()%255);if(rand()%2){//房顶if(rand()%2){setfillcolor(RGB(0,0,0));fillrectangle( nX + nWidth-nWidth/4, nY - nHeight-80, nX + nWidth-nWidth/4+3, nY - nHeight );}setfillcolor(nColor);if(rand()%2){fillrectangle( nX + nWidth-nWidth/4-20, nY - nHeight-40, nX + nWidth-20-nWidth/4+20, nY - nHeight );}fillrectangle( nX+20, nY - nHeight-20, nX + nWidth-20, nY - nHeight );}setfillcolor(nColor);fillrectangle( nX, nY - nHeight, nX + nWidth, nY );int nWindowType=rand()%2;switch(nWindowType){case 1:DrawWindow1( nX+(nWidth-nWidthCnt*20)/2, nY - nHeight+(nHeight-nHeightCnt*30)/2, nWidthCnt*20, nHeightCnt*30, nWidthCnt, nHeightCnt );break;default:nWidthCnt = (nWidth-10) / 20;nHeightCnt = (nHeight-10) / 10;DrawWindow2( nX+(nWidth-nWidthCnt*20)/2, nY - nHeight+(nHeight-nHeightCnt*10)/2, nWidthCnt*20, nHeightCnt*10, nHeightCnt );break;}
}
//画建筑类型2
void DrawBuilding2( int nX, int nY, int nWidth, int nHeight )
{int nFloorHeight=nHeight/3;int nFloorWidth=nWidth/3;int nWidthCnt = (nFloorWidth-10) / 20;int nHeightCnt = (nFloorHeight-6) / 30;COLORREF  nColor= RGB(rand()%255,rand()%255,rand()%255);//房顶if(rand()%2){setfillcolor(RGB(0,0,0));fillrectangle( nX + nFloorWidth/4, nY - nHeight-80, nX + nFloorWidth/4+3, nY - nHeight );}//房体//画填充矩形setfillcolor(nColor);fillrectangle( nX, nY - nHeight, nX + nFloorWidth, nY - nHeight + nFloorHeight );DrawWindow1( nX+(nFloorWidth-nWidthCnt*20)/2, nY - nHeight+(nFloorHeight-nHeightCnt*30)/2, nWidthCnt*20, nHeightCnt*30, nWidthCnt, nHeightCnt );fillrectangle( nX, nY - nHeight + nFloorHeight, nX + nFloorWidth*2, nY - nHeight + nFloorHeight*2 );DrawWindow1( nX+(nFloorWidth-nWidthCnt*20)/2, nY - nHeight+nFloorHeight+(nFloorHeight-nHeightCnt*30)/2, nWidthCnt*40, nHeightCnt*30, nWidthCnt*2, nHeightCnt );fillrectangle( nX, nY - nHeight + nFloorHeight*2, nX + nWidth, nY );DrawWindow1( nX+(nFloorWidth-nWidthCnt*20)/2, nY - nHeight+nFloorHeight*2+(nFloorHeight-nHeightCnt*30)/2, nWidthCnt*60, nHeightCnt*30, nWidthCnt*3, nHeightCnt );
}
void DrawBuilding3Floor( int nX, int nY, int nWidth, int nHeight, COLORREF  nColor )
{//画填充矩形int nPad=5;setfillcolor(nColor);fillrectangle( nX, nY, nX + nWidth, nY + nHeight );DrawWindow3( nX+nPad, nY +nPad, nWidth-nPad*2, nHeight  - nPad*2, nColor );
}
//画建筑类型3
void DrawBuilding3( int nX, int nY, int nWidth, int nHeight )
{int i;int nPad=3;int nInner=10;int nWindowWidth=10;int nFloorHeight=nHeight/8;int nWidthCnt = (nWidth-30) / nWindowWidth;int nHeightCnt = (nFloorHeight-10) / nWindowWidth;COLORREF  nColor= RGB(rand()%200,rand()%200,rand()%200);int y=nY;for( i=0; i<8; i++ ){if(i%2==0)nInner = 10;elsenInner = 0;DrawBuilding3Floor( nX+nInner, y-nFloorHeight, nWidth, nFloorHeight, nColor);y -= nFloorHeight;}
}
void DrawProcess()
{int i;line( 0, g_nHeight-80, g_nWidth, g_nHeight-80 );for( i=0; i<8; i++ ){int nWindowType=rand()%3;switch(nWindowType){case 1:DrawBuilding1( rand()%500, g_nHeight-80, 100+rand()%200, 220+rand()%200 );break;case 2:DrawBuilding2( rand()%500, g_nHeight-80, 100+rand()%200, 220+rand()%200 );break;default:DrawBuilding3( rand()%500, g_nHeight-80, 100+rand()%200, 220+rand()%200 );break;}}//马路setfillcolor(0);fillrectangle( 0, g_nHeight-80, g_nWidth, g_nHeight );setfillcolor(RGB(255,255,2555));for( i=0; i<g_nWidth; i+=100 ){solidrectangle( i, g_nHeight-60, i+50, g_nHeight-50 );}
}
int _tmain(int argc, _TCHAR* argv[])
{srand(GetTickCount());//初始化if( !ShowingBoard(g_nWidth,g_nHeight, DrawProcess))return 1;//关闭图库CloseBoard();return 0;
}

可以看到所有图形元素都是用矩形绘制,发挥你的想象,你一定能发现矩形的更多更好玩的用法。

运行界面:

 每次运行都随机生成各种建筑,我只构建了简单的三种建筑类型,你可以尝试修改代码,绘制更多更有趣的建筑。赶紧动起手来吧。


http://www.ppmy.cn/news/104884.html

相关文章

Java中BitSet和Set统计不重复字符数量时间复杂度和空间复杂度分析

题目:HJ10 字符个数统计 牛客网上一道简单的题目&#xff0c;计算字符串中含有的不同字符的个数&#xff0c;一看这个题目&#xff0c;通常直接意识到方案的基本实现思路&#xff1a;设置一个容器&#xff0c;遍历字符串中的每个字符&#xff0c;若字符与容器中字符相同&#…

夜深人静学32系列16——RTC实时时钟

RTC时钟 RTC什么是RTC&#xff1f;RTC结构框图CubeMX配置RTC代码配置 实战——简易时钟任务要求代码实现实验结果 补充唤醒功能配置代码如下&#xff1a; RTC 什么是RTC&#xff1f; RTC(Real Time Clock)&#xff1a;实时时钟 RTC是个独立的定时器。RTC模块拥有一个连续计数…

如何使用Keras选择添加的层并搭建神经网络?

目录 1.神经网络搭建步骤2.常见的层详解及其用途3.常见神经网络4.代码示例 1.神经网络搭建步骤 选择神经网络的各层需要根据具体问题和数据集的特点进行调整&#xff0c;一般可以通过以下步骤来进行&#xff1a; 1.确定输入数据的维度和特征数量&#xff0c;这有助于确定网络…

利用画图以及代码分析详细解读外排序的实现过程

外排序的实现 思想代码分析完整代码 如果有海量数据需要排序&#xff0c;而在内存中放不下这么多数据&#xff0c;因此就不能使用内排序&#xff08;直接插入排序&#xff0c;希尔排序&#xff0c;堆排序&#xff0c;快速排序&#xff0c;归并排序等等&#xff09;。关于想了解…

小主机折腾记12 HP 285G3 PRO MT

五一期间&#xff0c;无事&#xff0c;咸鱼购入HP 285G3 PRO MT折腾 HP 285 PRO G3 MT准系统 150包邮 R5 2600 250包邮 金百达3200内存 229京东包邮 直接说准系统情况&#xff1a; 1.主机有三个sata接口&#xff0c;两个硬盘接口&#xff0c;一个光驱接口&#xff08;应该是可以…

web 前端技术体系大全(IT枫斗者)

web 前端技术体系大全 前端技术框架 Vue.js 官网&#xff1a;https://cn.vuejs.org/Vue CLI&#xff1a;https://cli.vuejs.org/菜鸟教程&#xff1a;http://www.runoob.com/w3cnote…Nuxt.js&#xff1a;https://zh.nuxtjs.org/桌面应用 Electron&#xff1a;https://elect…

2. JVM内存模型深度剖析与优化

JVM性能调优 1. JDK的体系结构2. Java语言的跨平台特性3.JVM整体结构及内存模型3.1 内存模型3.1.1 PC寄存器&#xff08;线程私有&#xff09;3.1.2 虚拟机栈&#xff08;线程私有&#xff09;1. 局部变量表2. 操作数栈 本文是按照自己的理解进行笔记总结&#xff0c;如有不正确…

数据结构与算法06:递归和简单的排序

目录 【递归】 【排序】 冒泡排序 插入排序 选择排序 【每日一练&#xff1a;K 个一组翻转链表】 【递归】 递归是将一些有规律的重复问题分解为同类的子问题的方法&#xff0c;也就是在函数中自己调用自己。比较经典的递归代码就是 斐波那契数列&#xff0c;实现方式如…