Bresenham圆弧绘制算法OpenGL版

Bresenham逆时针圆弧生成算法 MFC环境 逆时针生成圆与圆弧 函数接口void BresenhamArc(float θ1, float θ2, float R) 圆心为原点,起始角θ1, 终止角 θ2, 半径 R 阅读详情
今天一时高兴,改进了以前在OpenGL中做的一个360度画圆的函数,完成个Bresenham圆弧画法,发在此处,供各位参考。
这个是用的OpenGL控制台形式,采用了那个半官方库glut。
//cnsGLArc.cpp : Defines the entry point for the console application.



//Filename:cnsGLArc.cpp

//Function:Draw arc by Bresenham

//Author:9Cat

//OS:WindowsXP Sp2

//Development Tool:Visual C++ 2005

//Other refrence:OpenGL

//First Create Time:2008-07-13	18:37

//Last Modify Time:2008-07-13	22:38



#pragma once

#pragma comment(linker,"/subsystem:/"windows/" /entry:/"mainCRTStartup/"")



#define WIN32_LEAN_AND_MEAN



#include<tchar.h>

#include<stdlib.h>

#include<windows.h>



#include<gl/glut.h>



#include<cmath>

#include<iostream>



using namespace std;



const int iXSTART=200;

const int iYSTART=100;

const int iWIDTH=500;

const int iHEIGHT=400;



const float fORG=0.0f;

const float fTX=0.8f;

const float fTY=0.7f;



const float fR=0.4f;



const float fDIFFER=0.001f;



//点结构体定义

struct mypoint

{

	float x;

	float y;

};

//点坐标的xy坐标赋值与初始化函数

void proInitp(struct mypoint *,float,float);



//单位升降级函数

float flaUpUnit(float,int);

float flaDownUnit(float,int);



//直线测试函数的声明

void proLine(struct mypoint *,struct mypoint *);

//画点函数的声明

void proPoint(struct mypoint *);

//Bresenham画圆算法的声明

void proBresenArc(struct mypoint *,float);





//主渲染函数实现

void renderscene(void)

{

	glClear(GL_COLOR_BUFFER_BIT);

	

	//主要绘图操作在该部分实现

	//绘制直线 

	struct mypoint stuA,stuB,*stpA,*stpB;;

	stpA=&stuA;

	stpB=&stuB;

	proInitp(stpA,fORG,fORG);

	proInitp(stpB,fTX,fTY);

	proLine(stpA,stpB);



	//绘制圆弧

	struct mypoint stuCent,*stpCent;

	stpCent=&stuCent;

	proInitp(stpCent,fORG,fORG);

	

	proBresenArc(stpCent,fR);

	



	//glutSwapBuffers();

}



//环境设置函数实现

void setuprc(void)

{

	glClearColor(0.0f, 0.0f, 0.0f,0.1f);

}



//程序主函数

int main()

{

	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

    

	//双缓冲模式需配合renderscene中的glutSwapBuffers使用

	//glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);

	

	glutCreateWindow("Draw arc by bresenham");

	

	glutPositionWindow(iXSTART,iYSTART);

	glutReshapeWindow(iWIDTH,iHEIGHT);



	glutDisplayFunc(renderscene);

	setuprc();

    

	glutMainLoop();

	

	return 0;

}



//*************各函数定义过程**************

//初始化点结构的横纵坐标

void proInitp(struct mypoint *myp,float x,float y)

{

	myp->x=x;

	myp->y=y;

}



//单位变换函数的实现

float flaUpUnit(float flaVar,int intTimes)

{

	flaVar=flaVar*intTimes;

	return flaVar;

}

float flaDownUnit(float flaVar,int intTimes)

{

	flaVar=flaVar/intTimes;

	return flaVar;

}



//直线测试函数的实现

void proLine(struct mypoint *stpStart,struct mypoint *stpEnd)

{

	glBegin(GL_LINES);

    glColor3f(1.0f, 1.0f, 1.0f);

	glVertex2f(stpStart->x,stpStart->y);

	glColor3f(1.0f, 1.0f, 0.0f);

	glVertex2f(stpEnd->x,stpEnd->y);

   

	glEnd();

	

	glFlush();



}



//画点函数的实现

void proPoint(struct mypoint *stpPoint)

{

	glBegin(GL_POINTS);

	glColor3f(1.0f,1.0f,1.0f);

	glVertex2f(stpPoint->x,stpPoint->y);

	glEnd();

	glFlush();

}



//Bresenham画圆算法的实现

void proBresenArc(struct mypoint *stpCenter,float flaR)

{

	float flaX,flaY,flaDis;

	struct mypoint stuPB,*stpPB;

	stpPB=&stuPB;

	

	flaX=0.0f;

	flaY=flaR;



	flaX=flaUpUnit(flaX,iWIDTH/2);

	flaY=flaUpUnit(flaY,iHEIGHT/2);

	flaR=flaUpUnit(flaR,iWIDTH/2);



	stpCenter->x=flaUpUnit(stpCenter->x,iWIDTH/2);

	stpCenter->y=flaUpUnit(stpCenter->y,iHEIGHT/2);



	flaDis=3-2*flaR;

	

	while(flaX<flaY)

	{

		stpPB->x=(flaX+stpCenter->x);

		stpPB->y=(flaY+stpCenter->y);



		stpPB->x=flaDownUnit(stpPB->x,iWIDTH/2);

		stpPB->y=flaDownUnit(stpPB->y,iHEIGHT/2);

		proPoint(stpPB);



		if(flaDis<0)

		{

			flaDis=flaDis+4*flaX+6;

		}

		else

		{

			flaDis=flaDis+4*(flaX-flaY)+10;

			flaY=flaY-1;

		}

		flaX=flaX+1;

	}



	if((flaX-flaY)<=fDIFFER)

	{	

		stpPB->x=(flaX+stpCenter->x);

		stpPB->y=(flaY+stpCenter->y);

		

		stpPB->x=flaDownUnit(stpPB->x,iWIDTH/2);

		stpPB->y=flaDownUnit(stpPB->y,iHEIGHT/2);

		proPoint(stpPB);

	}



}
Opengl圆弧绘制算法(Bresenham画圆、角度离散法绘制圆弧、中点画圆) 1.Bresenham画圆 #include<gl/glut.h> #include<math.h> void SetPixel(int x, int y)//画点 { glColor3f(1.0f, 0.0f, 0.0f); glBegin(GL_POINTS); glVertex2i(x, y); glEnd(); } //8路对称 void Cirpot(int x0, int y0, int x, int y) { SetPix 阅读详情

相关推荐

平面棋盘的绘制——Opengl之3D象棋(1)

这是本校的计算机图形学实验,其中自己在探索过程中不断的研究一些新的东西,不仅限与课设,但是以课设为主线。

王小六4ever’s poke 4297

中点扫描算法画圆弧(OpenGL)

圆弧的中点扫描算法画圆弧(添加了键盘监听事件) #include #include #include #include using namespace std; int theWindow; int a, b; int flag=1; void init(void) { glClearColor(1.0, 1.0, 1.0, 0.0);//将显示窗口设置为白色 glShadeMod

点滴记忆 3877

图形学--Bresenham画圆--opengl中实现

画圆思想: 圆的绘制是通过圆弧段来绘制,然后通过对称性进行画出其他部分。 Brensenham算法: d0=3-2r; d<0,yi=yi-1,d=d+4x+6; d>=0,yi-1=yi - 1,d=d+4*(x-y)+10; 推导过程: 图如上,个人感觉推导过程很清晰。 代码 #include <GL/glut.h> #include<math.h&...

weixin_42917994的博客 1212

OpenGL中点算法画圆弧、内接多边形算法画圆

#include "stdafx.h"#include #include #include #include #include #include #include #define PI acos(-1.0)#define Jiao (36.0/180*PI)void init1(){ glClearColor(0.0,0.0,0.0,1.0);}double x[110],y[110];void

龙崎的专栏 5611

MFC中使用OpenGL实现动态绘制圆弧

在以上代码中,我们首先清除屏幕的颜色缓冲区和深度缓冲区,然后使用glPushMatrix()将当前的模型视图矩阵保存到堆栈中,然后通过glTranslatef()将坐标系平移至屏幕中心,接着设置绘制颜色为白色,调用DrawArc()函数来绘制圆弧,最后使用glPopMatrix()将之前保存的模型视图矩阵弹出,并调用SwapBuffers()函数来进行双缓冲交换,以显示绘制结果。以上代码片段中,我们设置了OpenGL的绘制环境,包括颜色缓冲区和深度缓冲区的清除,启用深度测试,以及设置投影和模型视图矩阵。

TechBurst的博客 553

Bresenham算法在OpenGL中的线段和圆的光栅化

Bresenham算法是计算机图形学中常用的一种算法,用于在离散的像素网格上绘制线段、圆和角形。Bresenham算法是一种基于增量计算的算法,用于在离散的像素网格上绘制线段、圆和角形。在OpenGL中,Bresenham算法常用于线段、圆和角形的光栅化过程。实践编程练习:通过编写自己的Bresenham算法代码,并在离散的像素网格上绘制线段、圆和角形,可以加深对算法的理解和运用能力。分析算法流程:通过分析Bresenham算法的具体流程,包括初始化参数、增量计算和像素绘制,可以深入了解算法的实现细节。

NckyPytorch的博客 659

openGL一之直线DDA,正负法,Bresenham算法,圆弧正负法,Bresenham算法

openGL一之直线DDA,正负法,Bresenham算法,圆弧正负法,Bresenham算法

qq_26982531的博客 2967

计算机图形学中的直线和圆弧绘制实现

Bresenham算法是计算机图形学中用于栅格化直线段的一种高效算法。由Jack Elton Bresenham于1962年提出,该算法特别适用于像素为单位的屏幕显示系统。其核心优势在于仅使用整数运算,避免了浮点运算,从而大幅提升绘制效率,尤其在早期硬件条件下,这一点显得尤为重要。在计算机图形学和游戏开发中,世界坐标系是定义整个三维世界中物体位置和方向的基础坐标系。它是一个绝对的参考系,其中的每个点表示在虚拟世界中的一个精确位置。世界坐标系通常不随着摄像机或者观察者视角的变化而改变。

weixin_42466723的博客 840

msdn画圆弧函数_OpenGL 绘图实例二之直线和圆弧的绘制

综述在上一篇文章我们介绍了利用类库来完成一个机器人绘制的过程,这里我们一起来看一下怎样直接利用直线和圆弧生成算法来进行图形的绘制。P.S. 本篇文章针对《计算机图形学》张彩明 版来探讨学习。关于书中的详细算法不会再赘述。P.P.S. 本篇文章算法扩展思路及代码实现为博主原创内容,如存在纰漏和错误,希望大家指正。直线生成算法1.DDA 算法DDA 算法是最基本的一种直线生成算法了,代码...

weixin_39867594的博客 510

OpenGL画圆弧的程序

基于OpenGL的圆弧程序,先对圆弧的圆心,半径,起点,角度等设置,然后进行绘制

CGPainter_lineCircle Bresenham画直线+中点圆法画圆弧

Bresenham直线算法,是过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的象素。

从Bresenham算法到OpenGL实践:手写图形学核心绘制原理

计算机图形学的基础在于将数学上连续的几何图元(如直线、圆)高效、准确地转换为离散的屏幕像素,这一过程称为光栅化。Bresenham算法是光栅化的经典实现,它通过巧妙的整数运算和决策参数,避免了浮点计算,在保证视觉平滑的同时达到了极高的执行效率。理解这一原理对于掌握抗锯齿、纹理映射等高级图形技术至关重要。在工程实践中,开发者常使用C++结合OpenGL进行图形编程,通过亲手实现Bresenham算法,可以深刻理解从算法坐标到屏幕像素的映射、坐标变换及帧缓冲操作等核心概念。本项目以Bresenham算法和Ope

weixin_30736301的博客 292

opengl 画圆弧和圆面

利用opengl,利用数据画出圆和圆面,很好的练习。

OpenGL/webGL底层图元的绘制原理

一、什么是图元 图元是基本的几何图形,图元是构成其他复杂图形的基本要素,比如:点、线段、、三角形、矩形、圆弧、圆角矩形、扇形等等。 这些图元可以构成其他的复杂图形,在底层被大量的调用执行。 注:比如业务层一个动画、一个复杂的图形,对于画直线函数的调用可能是成百上千次,甚至是成千上万次的,所以图元算法的优劣对性能的影响是非常大的。 二、什么是OpenGL OpenGL的英文名称:Open Graph...

郭宇的博客 4549

使用opengl绘制圆

使用opengl绘制圆的方法 才用的算法是bresenham的画圆算法

从传统扫描到SSN:Tessent数据包技术如何减少90%测试时间

本文深入探讨了Tessent流式扫描网络(SSN)如何通过其核心的数据包技术,彻底改变芯片测试范式。该技术将测试数据封装成标准化数据包,在共享总线上进行智能路由与分发,实现了动态带宽分配与核心独立测试,从而将复杂SoC(如AI芯片)的总体测试时间大幅削减90%,并显著提升测试灵活性与可扩展性。

meat5的博客 490

使用openGL,用Bresenham算法画椭圆

运行结果 源代码 //用Bresenham算法画椭圆 #include<iostream> #include<stdlib.h> #include <GL/glut.h> void putpixel(int xc, int yc, int x, int y) { glBegin(GL_POINTS); glVertex3f(xc + x, yc + y, 0); glEnd(); } void drawElipse(int xc, int yc, int a,

小` pi孩 1833

ML307A模组连接ONENET平台(AT指令步骤教程)

ML307A 是一款集成度高、体积小的物联网通信模组,支持多种无线通信协议,如 LoRa、NB-IoT 等。它具有低功耗、远程通信等特点,适用于多种物联网场景。支持 LoRa 和 NB-IoT 等多种无线通信标准。提供丰富的 GPIO 接口。内置多种传感器支持。UART 接口:用于与微控制器或其他设备通信。GPIO 接口:可以连接外部传感器或执行器。电源接口:用于供电。OneNET 是中国移动推出的一款物联网开放平台,它提供了从数据采集、存储到分析的一站式解决方案。

xiewengeng的博客 5480

直线宽度2 points wide_OpenGL 绘图实例二之直线和圆弧的绘制

综述在上一篇文章我们介绍了利用类库来完成一个机器人绘制的过程,这里我们一起来看一下怎样直接利用直线和圆弧生成算法来进行图形的绘制。P.S. 本篇文章针对《计算机图形学》张彩明 版来探讨学习。关于书中的详细算法不会再赘述。P.P.S. 本篇文章算法扩展思路及代码实现为博主原创内容,如存在纰漏和错误,希望大家指正。直线生成算法1.DDA 算法DDA 算法是最基本的一种直线生成算法了,代码...

weixin_29284201的博客 517

软件项目质量管理

识别项目中涉及质量管理的不同角色,如项目经理、质量经理、测试人员等,明确每个角色的职责和任务,包括负责哪些质量管理活动和决策。1、编制软件项目的质量管理计划,包括确定项目的质量标准和要求,以及制定质量控制和质量保证策略等。2、编制软件项目的质量管理计划,包括确定项目的质量标准和要求,以及制定质量控制和质量保证策略等。测试用例表是质量控制过程中的关键工具,确保所有功能和场景都被验证,减少项目中的缺陷。1、理解项目质量管理的基本过程,包括质量计划、质量保证、质量控制和质量改进;明确质量管理活动中的角色和职责。

weixin_51996255的博客 1258

32位MIPS流水线CPU设计

32位MIPS流水线CPU设计(vivado)

m0_51320209的博客 3199

【计算机图形学】-直线和圆弧绘制算法实现 (code included)

1. 问题描述: 理解基本图形元素光栅化的基本原理,实现直线绘制的中点画线算法、Bresenham算法、圆弧生成的中点画圆算法。掌握OpenGL画线及设置线的属性(颜色、线宽、线型)方法。 2. 算法描述: 1) 中心画线算法: 下面展示一些 伪代码。 void MidPLine(int x0,int y0,int x1,int y1,void (*setPixel)(int x,int y)) { a⬅abs(y0 - y1); b⬅abs(x0 - x1); d⬅a + b / 2; if(

qq_30916621的博客 3271

基于角谱传播的MATLAB仿真:从相位恢复看自由空间光传播

本文详细介绍了基于角谱传播理论的MATLAB仿真方法,用于模拟自由空间光传播过程。通过傅里叶光学原理,将光场分解为频谱并应用传播相位滤波器,实现了从纯相位物体到可观测衍射图样的仿真。文章结合具体代码,演示了如何利用角谱法进行相位恢复,为计算成像和生物医学检测等领域的研究提供了实用的仿真工具和思路。

weixin_29055699的博客 280
上一篇: 祭马诔----纪念“嗷嗷叫的老马”不写程序的日子
下一篇: 连载--VC使用入门与常见问题解答--开篇
九桔猫
博客等级 码龄22年 114粉丝 14原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值