圈养式雷达算法(我自己取的名字,哈哈)

朋友让我帮他写个限制在一个圆圈内绘制的例子,用三角形的勾股定理简单给他写了一下。也是为了让他看懂,没加任何无用的代码,简单明了。看百度上其他人都说一大堆,没说到点子上。我就顺便发出来记录下。
直接封装好了,传相应的参数调用就好了。

#include <stdio.h>
#include <stdlib.h>


#include <math.h>
#define PI 3.14159265359
/**
*圈养式雷达,顾名思义不在圈里也给我到圈边待着��🤪
*给captivity一个圆的坐标以及半径,超出范围就会被拉回圈边,
*并且方位不变,类似于雷达计算,但是雷达一般超出范围不显示,
*我写的这个超出范围就拉会圈边。
*
*round_x:圆圈的中心x
*round_y:圆圈的中心y
*radius:圆圈的半径
*x:准备绘制的x   超过圆的半径就会被拉回到圈边
*y:准备绘制的y   超过圆的半径就会被拉回到圈边
*/
bool captivity(float round_x, float round_y, float radius, float *x, float *y)
{
	// 计算直角三角形两条直角边长
	float lx = abs(*x - round_x);
	float ly = abs(*y - round_y);
	// 计算直角三角形斜边长 200为要限制的圆的半径
	float SideLength = sqrt((lx * lx) + (ly * ly));
	printf("纠正前三角形斜边长%f\n\n", SideLength);
	float r = atan(lx / ly) * 180 / PI;
	printf("三角形角度%f\n", r);
	if (SideLength <= radius)
	{
		// 返回true说明给定的xy在你给定的圆圈内。
		return true;
	}
	else
	{
		// 没在圈内就按方位给拉到圈边边
		float R = r / 180 * PI;	// 计算弧度
		float correct_x = sin(R) * radius;	// 计算一直角边
		float correct_y = cos(R) * radius;	// 计算另一直角边
		if (*x < round_x)
		{
			*x = round_x - correct_x;
		}
		else
		{
			*x = round_x + correct_x;
		}
		if (*y < round_y)
		{
			*y = round_y - correct_y;
		}
		else
		{
			*y = round_y + correct_y;
		}
	}
	return false;
}


int main(int argc, char **argv)
{
	//任意xy值
	float x = 870;
	float y = 750;
	
	//用于限制前面给出的xy坐标的圆,的圆心坐标
	float round_x = 500;
	float round_y = 500;
	//圆圈的半径
	float radius = 200;
	captivity(round_x, round_y, radius, &x, &y);
	
	//来看一下被纠正后xy离圈中心的距离
	printf("超出圈外后纠正回圈边:\n");
	printf("纠正x:%f\n", x - round_x);
	printf("纠正y:%f\n", y - round_x);


	// 我们来验证一下,纠正后的三角形斜边长是否为200,也就是给定的圆的半径。
	float SideLength = sqrt(((x - round_x) * (x - round_x)) + ((y - round_y) * (y - round_y)));
	printf("\n纠正后 三角形斜边长%f\n", SideLength);
	return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值