三角函数对应在平面坐标上画圆

本文介绍了如何使用三角函数和Bresenham算法在屏幕上绘制圆。当圆半径为1时,坐标关系式为y=sin(θ*3.14/180)和x=cos(θ*3.14/180),而当半径为r时,关系式变为y=sin(θ*3.14/180)*r和x=cos(θ*3.14/180)*r。Bresenham画圆算法通过决策参数和对称性简化了圆的绘制过程,有效地在屏幕上画出像素点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、圆半径(r)为 : 1

2、圆半径(r)为 : r

3、例程


        三角函数(Trigonometric Functions)是基本初等函数之一,是以角度(数学上最常用弧度制,下同)为自变量,角度对应任意角终边与单位圆交点坐标或其比值为因变量的函数。

        三角函数将直角三角形的内角和它的两个边的比值相关联,也可以等价地用与单位圆有关的各种线段的长度来定义。三角函数在研究三角形和圆等几何形状的性质时有重要作用,也是研究周期性现象的基础数学工具。

1、圆半径(r)为 : 1

        在屏幕上绘制圆时,一般情况是在对应的 XY 点进行点的绘制,在 “ 图1 ” 中我们可以看出在平面坐标系中的 xy 坐标的关系式为:y = sinθ 与 x = cosθ,通过该关系式我们可以改变  角度值 (θ) 来确定对应的 xy 坐标,然后通过对应的关系把平面坐标上的 xy 转化成屏幕上的 XY 点即可完成圆的绘制。

        注意:角度值需要换成正弦、余弦值,所以最后的关系式变为: y = sin(θ*3.14/180)  与  x = cos(θ*3.14/180)  

 图1

        对应的三角函数表格:

2、圆半径(r)为 : r

        上面的平面坐标关系式是基于 半径(r) 为 1 时的关系式,正常情况下我们的半径是变化的由此上面的关系式则需要乘以 半径(r) ,如 “ 图2 ” 所示。我们可以看出在平面坐标系中的 xy 坐标的关系式为: y = sinθ * r 与  x = cosθ * r )。通过该关系式我们可以改变  角度值 (θ) 来确定对应的 xy 坐标,然后通过对应的关系把平面坐标上的 xy 转化成屏幕上的 XY 点即可完成圆的绘制。

        注意:角度值需要换成正弦、余弦值,所以最后的关系式变为: y = sin(θ*3.14/180)* 与  x = cos(θ*3.14/180)*r ” 

 图2

3、例程

        Bresenham画圆算法也称为中点画圆算法,与Bresenham 直线算法一样,其基本的方法是利用判别变量来判断选择最近的像素点,判别变量的数值仅仅用一些加、减和移位运算就可以计算出来。该算法巧妙的利用了圆的八对称性,只计算出一个八分周上的点,其余的七个点利用对称性即可得出。

#define     LCD_Width     128
#define     LCD_Height    64

/**
 * @breif	画圆函数
 * @param   x1,x2 —— 圆心坐标
 * @param	r     —— 半径
 * @retval	none
 */
void LCD_Draw_ColorCircle(uint16_t x, uint16_t y, uint16_t r)
{
	/* Bresenham画圆算法 */
	int16_t a = 0, b = r;
    int16_t d = 3 - (r << 1);		//算法决策参数
		
	/* 如果圆在屏幕可见区域外,直接退出 */
    if (x - r < 0 || x + r > LCD_Width || y - r < 0 || y + r > LCD_Height) 
				return;
		
	/* 开始画圆 */
    while(a <= b)
    {
        LCD_Draw_ColorPoint(x - b, y - a);//调用画点函数
        LCD_Draw_ColorPoint(x + b, y - a);//调用画点函数
        LCD_Draw_ColorPoint(x - a, y + b);//调用画点函数
        LCD_Draw_ColorPoint(x - b, y - a);//调用画点函数
        LCD_Draw_ColorPoint(x - a, y - b);//调用画点函数
        LCD_Draw_ColorPoint(x + b, y + a);//调用画点函数
        LCD_Draw_ColorPoint(x + a, y - b);//调用画点函数
        LCD_Draw_ColorPoint(x + a, y + b);//调用画点函数
        LCD_Draw_ColorPoint(x - b, y + a);//调用画点函数
        a++;

        if(d < 0)
			d += 4 * a + 6;
        else
        {
            d += 10 + 4 * (a - b);
            b--;
        }

        LCD_Draw_ColorPoint(x + a, y + b);//调用画点函数
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_755682240

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值