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的画圆算法

告别理论!手把手教你用Vivado 2020.2为ZYNQ PL端打造一个AXI4-Full读写DDR的IP核

本文详细介绍了如何使用Vivado 2020.2为ZYNQ PL端创建AXI4-Full主控IP核,实现高效读写DDR内存的实战指南。通过环境配置、IP核创建、系统集成到软件调试的全流程讲解,帮助开发者快速掌握AXI4-Full协议在ZYNQ平台上的应用,提升PL与PS协同工作的数据传输效率。

weixin_30300225的博客 466

使用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

Zynq 【SDK裸机开发之PS】——DDR的内存分配使用详解

Zynq如果跑操作系统的话,内存管理的工作都会交给系统来操作,但是如果是裸机的话,则需要自己对DDR3的内存进行管理。

shizhibuyi1234的博客 7376

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

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

weixin_29284201的博客 517

ESP32S3学习——i2c,点亮0.96寸oled

ESP32S3学习——i2c,点亮0.96寸oled

HandBAI的博客 1万+

西电微机系统课程设计——步进电机开环控制系统设计

西电微机系统课程设计——步进电机开环控制系统设计 一、课程设计目的 1.掌握微机系统总线与各芯片管脚连接方法,提高接口扩展硬件电路的连接能力。 2.加深对 A/D 和并行接口芯片的工作方式和编程方法的理解。 3.搞懂步进电机的工作原理及控制方式,掌握开环控制系统的设计思路和实现方法。 二、课程设计的内容 手动调节电位器旋钮(0V~5V),通过 ADC0809 模拟输入水库水位 0 米~50 米,CPU收到水位信号后,根据水位高度控制步进电机(水闸)进行调节。 三、系统功能与设计要求 基本功能要求 手

OutlierLi's Blog 7524

【计算机图形学】-直线和圆弧绘制算法实现 (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

高通camera open代码流程(hal到kernel)

内容:简单介绍Camera open代码调用流程,从HAl到kernel。(api1+hal1) 前言 Android camera api和hal对应关系。安卓在版本更新过程中,camera相关代码也经历了几个版本的更新,表现为camera HAL版本更新(HAL1->HAL2->HAL3),camera API版本更新(camera API1->camera API2),接下...

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值