SimpleCG绘图函数(4)--绘制圆

news2024/9/22 13:38:31

        在前一篇教程我们利用绘制矩形功能绘制了一个城市,接下来我们讲解另外一个同样重要且基础的图形----圆形。并一起看看该图形能绘制哪些应用呢。

        绘制圆形相关函数如下:

//圆心坐标(nXCenter,nYCenter),半径为nRatio
 
//绘无填充制圆
void circle( int nXCenter, int nYCenter, int nRatio );
 
//绘制填充圆
void fillcircle( int nXCenter, int nYCenter, int nRatio );
 
//绘制无边框填充圆
void solidcircle( int nXCenter, int nYCenter, int nRatio );
 
//清空圆
void clearcircle( int nXCenter, int nYCenter, int nRatio );

只要提供圆心坐标及半径长度即可,与矩形一样,提供了四个函数分别绘制

1、仅有边框无填充--circle

2、边框加填充--fillcircle

3、无边框,仅有实心填充--solidcircle

4、用背景色清除圆区域--clearcircle

函数相对简单,不过因为圆形在真实世界太普遍以及实用了,所以在图形绘制中,圆形显得尤为重要。

下面我们以绘制太极图来演示圆的绘制,之所以使用太极图是因为虽然他看似简单,实际蕴含丰富。充分反映了祖先的智慧,同时也是完全使用圆形构造完成的。小小的太极图里包含了五个圆形。

绘制代码如下:

// Circle.cpp : 定义控制台应用程序的入口点。
//

#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

int g_nWidth = 400;		//画面宽度
int g_nHeight= 400;		//画面高度

//绘制太极图
void DrawProcess()
{
	//外圆
	setfillcolor(0);
	circle(200,200,100);
	line(200,100,200,300);
	floodfill(250,200,0,0);

	//黑色半圆
	solidcircle(200,150,50);

	//设置填充色为白色
	setfillcolor(RGB(255,255,255));
	//白色半圆
	solidcircle(200,150,25);

	//小白圆
	solidcircle(200,250,50);

	//小黑圆
	setfillcolor(0);
	solidcircle(200,250,25);

}
int _tmain(int argc, _TCHAR* argv[])
{
	srand(GetTickCount());
	//初始化
	if( !ShowingBoard(g_nWidth,g_nHeight, DrawProcess))
		return 1;
	//关闭图库
	CloseBoard();
	return 0;
}

运行图如下:

 下面我们让太极图转动起来,反映的是阴阳转化的关系。由于我们还没学到旋转的函数,只能通过手动运算旋转点的方式编写,代码如下:

// Circle.cpp : 定义控制台应用程序的入口点。
//

#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

int g_nWidth = 400;		//画面宽度
int g_nHeight= 400;		//画面高度
//旋转的太极图
void Taiji( int nX, int nY, int nRatio, float fAngle )
{
	int nPtX=0;
	int nPtY=0;
	nPtX = cos(fAngle)*nRatio;
	nPtY = sin(fAngle)*nRatio;
	//外圆
	circle(nX,nY,nRatio);
	line(nX+nPtX,nY-nPtY,nX-nPtX,nY+nPtY);
	floodfill(nX+5*sin(fAngle),nY+5*cos(fAngle),0,0);

	//黑色半圆
	solidcircle(nX+nPtX/2,nY-nPtY/2,nRatio/2);

	//设置填充色为白色
	setfillcolor(RGB(255,255,255));
	//小白圆
	solidcircle(nX+nPtX/2,nY-nPtY/2,nRatio/4);

	//白色半圆
	solidcircle(nX-nPtX/2,nY+nPtY/2,nRatio/2);

	//小黑圆
	setfillcolor(0);
	solidcircle(nX-nPtX/2,nY+nPtY/2,nRatio/4);
}


//绘制太极图
void DrawProcess()
{
	bool bIsRunning = true;
	float fAngle=0;
	while(bIsRunning)
	{
		Taiji(200,200,100,fAngle);
		fAngle+=0.05;
		Sleep(50);
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	//初始化
	if( !ShowingBoard(g_nWidth,g_nHeight, DrawProcess))
		return 1;
	//关闭图库
	CloseBoard();
	return 0;
}

为了绘制运动太极,将太极绘制放入单独函数供调用,而且设置了旋转角度参数,方便绘制转动的太极。运行图与上图差别不大,就不贴效果图了,大家可以自行运行看看。

第二个例子我们展示一下奥运五环的绘制。绘制环可以先画一个圆,然后在里面用clearcircle用小一点的半径清除掉里面就能得到一个环形,不过我们可以用更简单的直接设置笔宽来实现。

setlinewidth(15);

关于设置笔宽及填充,例如颜色,大小之类的设置函数后面会讲到,在这里先用上。

代码如下:

// Circle.cpp : 定义控制台应用程序的入口点。
//

#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

int g_nWidth = 400;		//画面宽度
int g_nHeight= 400;		//画面高度


//绘制太极图
void DrawProcess()
{
	setlinewidth(15);
	setlinecolor(RGB(50,140,210));
	circle(60,100,50);
	setlinecolor(RGB(240,160,50));
	circle(120,150,50);
	setlinecolor(RGB(0,20,40));
	circle(180,100,50);
	setlinecolor(RGB(80,170,70));
	circle(240,150,50);
	setlinecolor(RGB(200,80,70));
	circle(300,100,50);
}
int _tmain(int argc, _TCHAR* argv[])
{
	//初始化
	if( !ShowingBoard(g_nWidth,g_nHeight, DrawProcess))
		return 1;
	//关闭图库
	CloseBoard();
	return 0;
}

运行效果图:

审核说版权不明,不知道是不是这个,就不放图片试试了

 细心的读者可能会发现乍一看似乎还可以,仔细看的话就会发现这个五环是有问题的,因为环与环之间并不是扣在一起,我们后面介绍到弧的绘制时再来完善它,画圆函数是没办法实现的。

最后我们再用圆绘制一个小甲虫,并祝大家节日快乐,明天就是儿童节了。

// Circle.cpp : 定义控制台应用程序的入口点。
//

#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

int g_nWidth = 400;		//画面宽度
int g_nHeight= 400;		//画面高度


void DrawProcess()
{
	setlinewidth(3);
	//头
	setfillcolor(RGB(250,240,200));
	fillcircle(280,110,30);
	
	//身
	setfillcolor(RGB(250,40,10));
	fillcircle(200,200,100);
	fillcircle(285,115,8);

	curveline(270,130,200,140,4);
	curveline(200,140,210,100,-4);
	curveline(200,140,120,260,14);

	//斑点
	setfillcolor(0);
	solidcircle(170,130,25);
	solidcircle(220,170,30);
	solidcircle(280,180,10);
	solidcircle(260,230,25);
	solidcircle(140,200,30);
	solidcircle(180,250,25);
	solidcircle(180,180,10);
	solidcircle(220,260,10);

	//触角
	solidcircle(250, 70, 6);
	solidcircle(280, 60, 6);
	line(250, 70, 260, 85 );
	line(280, 60, 275, 80 );

	setfillcolor(RGB(250,240,200));
	solidcircle(282,108,9);
	//眼睛
	setfillcolor(0);
	solidcircle(270,110,6);
	solidcircle(290,100,6);
}
int _tmain(int argc, _TCHAR* argv[])
{
	//初始化
	if( !ShowingBoard(g_nWidth,g_nHeight, DrawProcess))
		return 1;
	//关闭图库
	CloseBoard();
	return 0;
}

以上通过几个例子演示了圆形的绘制及运用,大家可以参考并熟练圆形函数的应用,发挥想象,多多练习,下一篇将探讨椭圆的绘制方法及使用。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/594076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KG-BERT: BERT for Knowledge Graph Completion 2019ACL

把BERT用在知识图谱补全上 提出KG-BERT模型,在预训练好的BERT基础上继续fine-tuning。 1.传统KGC方法 传统的KGC方法一般依赖于KGE,而KGE往往通过将KG中的三元组关系投影到某个表示空间中,然后使用打分函数对三元组的合理性进行评估&#x…

OA系统流程传出文档

泛微OA如何与第三方接口交互 注意: 1.对于泛微OA中不能作为节点后的自定义编码代码,可能有以下几种原因: 代码存在语法错误:节点后的自定义编码代码应该是正确的Java代码,如果代码中存在语法错误,如缺少分号或者括号不匹配等,将不能正常编译执行。 缺少必要的依赖:节点…

C++ 内存分区模型

C程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的 全局区:存放全局变量和静态变量以及常量 栈区:由编译器自动分配释放 , 存放函数的参数值 , 局部变量等 堆区&…

CS5366芯片方案|单芯片type-C转HMID+PD+U3拓展坞方案|CS5366设计电路原理图

CS5366是一款高性能USB Type-c/DisplayPort TM(DP)到HDMI2.0转换器,设计用于USB Type-c源到HDMI2.0sink。CS5366集成了符合DP1.4标准的接收器和符合hdmi2.0标准的发射器。还包括两个CC控制器用于CC通信,以实现DP Alt Mode和功率传…

目标检测中,DETR方法为何class设置为91+1,DINO中为91

基于DEtection TRansformer的DETR框架https://github.com/facebookresearch/detr因为end-to-end,无需后处理等优点,逐渐得到青睐。DINO方法https://github.com/IDEA-Research/DINO更是取得了在COCO2017的SOTA结果。 其中,在DETR方法中&#…

Revit简单的门族创建及CAD图纸翻模门窗

一、Revit简单的门族创建步骤 门是我们建筑模型中不可缺少的一个构件,如何在族中绘制一个自己的门族呢?下面教大家绘制一个简单的门族,让你了解门的构件绘制。 打开公制门族进行创建 首先我们要进行门框的创建,很多人会以为系统自带的这个是…

【数据结构】一篇文章带你彻底学会《后缀表达式》

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

什么是项目可交付成果?定义、示例及管理工具

项目产生可交付成果&#xff0c;这只是项目活动的结果。项目可交付成果可大可小&#xff0c;其数量也因项目而异。它们是由项目管理团队和利益相关者在项目规划阶段商定的。 换句话说&#xff0c;任何类型的项目都有投入和产出。投入是你投入到项目中的东西&#xff0c;如数据…

Pixhawk无人机-ArduPilot 软件SITL仿真模拟飞行(SITL+MAVProxy)

1 引言 本人是先看了多个博客实现了&#xff1a;在ubuntu下建立完整的ardupilot开发环境。 该文是基于搭建完编译环境后&#xff0c;也就是搭建好ardupilot的仿真环境实现的。 在文章: 《Pixhawk无人机扩展教程(5)—SITL仿真模拟飞行&#xff1a;开发环境搭建》.中指出&#…

究竟什么是CRM?一文带您了解

目录 一、什么是CRM&#xff1f;它是用来做什么的&#xff1f; 1、获取商机的源头&#xff1a;全渠道营销管理 2、业绩提升的核心&#xff1a;销售管理 3、有温度的触达&#xff1a;客户服务 二、企业为什么需要布局CRM 1、销售是一场没有硝烟的战争 2、信息孤岛存在&am…

调用华为API实现中文语音识别

目录 1. 作者介绍2. 华为云中文语音识别2.1 录音文件识别与获取2.2 限制要求2.3 对象存储服务&#xff08;OBS&#xff09;简介 3. 实验过程以及结果3.1获得API3.2 代码实现3.3 运行结果 参考&#xff08;可供参考的链接和引用文献&#xff09; 1. 作者介绍 张楠&#xff0c;女…

【unity之c#专题篇】——进阶知识实践练习

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

如果你很焦虑、浮躁,不如去读一读林曦这本《无用之美》

生活中不可或缺的是柴米油盐&#xff0c;而濡养人心的往往是无用之美。——林曦    很难用语言写出这本书的美。有些书会给你带来内心的激荡&#xff0c;有些会让你充满力量&#xff0c;而林曦老师的书便自带一种轻盈的美&#xff0c;越往下读越能让人凝神静气。      …

浅谈一下@Async和SpringSecurityContext可能会遇到的问题和解决方案

Async和SpringSecurityContext 场景回溯 在执行一个用时较长的批量插入业务的时候,我尝试使用Async异步对业务进行优化,但是却给我报了空指针的错误,定位之后发现 此处我是基于SpringSecurity来获取用户的 是currentUserService获取到的当前登陆用户为空导致的,但是当前确实是…

文心一言 VS 讯飞星火 VS chatgpt (27)-- 算法导论5.1 2题

二、请描述 RANDOM(a&#xff0c;b)过程的一种实现&#xff0c;它只调用 RANDOM(0&#xff0c;1)。作为a和b的函数&#xff0c;你的过程的期望运行时间是多少? 文心一言&#xff1a; 假设我们有一个伪随机数生成器&#xff0c;可以生成在[0,1)范围内的随机数。那么我们可以使…

深入探讨JMeter中不为人知的JSONPath用法

在jmeter使用过程中&#xff0c;我们经常会看到接口返回数据类型为application/json&#xff0c;也就时我们常说的json格式。 而在功能测试时&#xff0c;我们经常会要对它的结果进行断言&#xff0c;确认结果是否与预期一致&#xff0c;有时候还会想从结果中提取某个值&#…

第十六章行为性模式—职责链模式

文章目录 职责链模式解决的问题结构实例存在的问题 JavaWeb 源码 - FilterChain 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。行为型模式分为类…

知识蒸馏:综述

本文主要是针对2021年 IJCV Knowledge Distillation: A Survey的一个翻译。 知识蒸馏&#xff1a;综述 摘要1 引言2 知识2.1 基于响应的知识2.2 基于特征的知识2.3 基于关系的知识 3 蒸馏方案3.1 离线蒸馏3.2 在线蒸馏3.3 自蒸馏 4 师生结构5 蒸馏算法5.1 对抗蒸馏5.2 多教师蒸…

SpringBoot @ConditionalOnProperty注解 + AOP切面控制日志打印

参考资料 ConditionalOnProperty的作用和用法 目录 一. 前期准备1.1 错误信息实体类1.2 自定义校验异常1.3 业务页面1.3.1 前台HTML1.3.2 Form实体类1.3.3 Controller层1.3.4 Service层 二. ConditionalOnProperty注解和AOP切面的使用2.1 配置文件2.2 AOP切面 ConditionalOnP…

深剖 Linux 信号量

目录 传统艺能&#x1f60e;POSIX信号量&#x1f60d;概念&#x1f602; 信号量函数&#x1f60d;初始化信号量&#x1f44c;销毁信号量&#x1f44c;等待&#xff08;申请&#xff09;信号量&#x1f44c;发布&#xff08;释放&#xff09;信号量&#x1f923; 二元信号量模拟…