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)

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

相关推荐
先吃饱再说2 小时前
判断回文字符串,从一行代码到双指针优化
算法
见过夏天2 小时前
C++ 基础入门完全指南
c++
黄敬峰5 小时前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术6 小时前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六9 小时前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术10 小时前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize11 小时前
初识DFS 与 BFS:递归、队列与图遍历
算法
罗西的思考1 天前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
美团技术团队1 天前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt