C++ 检查一条线是否与圆接触或相交(Check if a line touches or intersects a circle)

给定一个圆的圆心坐标、半径 > 1 的圆心坐标以及一条直线的方程。任务是检查给定的直线是否与圆相交。有三种可能性:

1、线与圆相交。

2、线与圆相切。

3、线在圆外。

**注意:**直线的一般方程是 a*x + b*y + c = 0,因此输入中只给出常数 a、b、c。

例子:

输入:半径 = 5,中心 = (0, 0),

a = 1,b = -1,c = 0。

输出:相交

输入:半径 = 5,中心 = (0, 0),

a = 5,b = 0,c = 0。

输出:相交

输入:半径 = 5,中心 = (0, 0),

a = 1,b = 1,c = -16。

输出:外部

这个想法是将圆心和直线之间的垂直距离与圆的半径进行比较。

算法:

  1. 找到圆心和给定直线之间的垂直线(假设为 p)。

  2. 将此距离 p 与半径 r 进行比较。......

a) 如果 p > r,则线位于圆外。......

b) 如果 p = r,则线与圆相切。......

c) 如果 p < r,则线与圆相交。

如何找到垂直距离?可以使用以下公式计算直线与点的距离:

示例代码:

// CPP program to check if a line touches or

// intersects or outside a circle.

#include <bits/stdc++.h>

using namespace std;

void checkCollision(int a, int b, int c,

int x, int y, int radius)

{

// Finding the distance of line from center.

int dist = (abs(a * x + b * y + c)) /

sqrt(a * a + b * b);

// Checking if the distance is less than,

// greater than or equal to radius.

if (radius == dist)

cout << "Touch" << endl;

else if (radius > dist)

cout << "Intersect" << endl;

else

cout << "Outside" << endl;

}

// Driven Program

int main()

{

int radius = 5;

int x = 0, y = 0;

int a = 3, b = 4, c = 25;

checkCollision(a, b, c, x, y, radius);

return 0;

}

输出:

Touch

时间复杂度: O(log(a*a + b*b)),因为它使用内置 sqrt 函数

辅助空间: O(1)

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
闻缺陷则喜何志丹26 分钟前
【SOSDP模板 容斥原理 逆向思考】3757. 有效子序列的数量|分数未知
c++·算法·力扣·容斥原理·sosdp·逆向思考
CoovallyAIHub28 分钟前
如何在手机上轻松识别多种鸟类?我们发现了更简单的秘密……
深度学习·算法·计算机视觉
第二只羽毛34 分钟前
遵守robots协议的友好爬虫
大数据·爬虫·python·算法·网络爬虫
BestOrNothing_20151 小时前
一篇搞懂 C++ 重载:函数重载 + 运算符重载,从入门到会用(含 ++、<<、== 实战)
c++·函数重载·运算符重载·operator·前置后置++·重载与重写
艾斯比的日常1 小时前
Java 三色标记算法:并发垃圾回收的核心技术解析
java·开发语言·算法
2501_941144421 小时前
Python + C++ 异构微服务设计与优化
c++·python·微服务
CoovallyAIHub1 小时前
抛弃LLM!MIT用纯视觉方法破解ARC难题,性能接近人类水平
深度学习·算法·计算机视觉
程序猿编码1 小时前
PRINCE算法的密码生成器:原理与设计思路(C/C++代码实现)
c语言·网络·c++·算法·安全·prince
高洁011 小时前
具身智能-视觉语言导航(VLN)
深度学习·算法·aigc·transformer·知识图谱
Croa-vo1 小时前
TikTok 数据工程师三轮 VO 超详细面经:技术深挖 + 建模推导 + 压力测试全记录
javascript·数据结构·经验分享·算法·面试