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)

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

相关推荐
Miraitowa_cheems3 小时前
LeetCode算法日记 - Day 88: 环绕字符串中唯一的子字符串
java·数据结构·算法·leetcode·深度优先·动态规划
B站_计算机毕业设计之家4 小时前
python电商商品评论数据分析可视化系统 爬虫 数据采集 Flask框架 NLP情感分析 LDA主题分析 Bayes评论分类(源码) ✅
大数据·hadoop·爬虫·python·算法·数据分析·1024程序员节
小白菜又菜4 小时前
Leetcode 1518. Water Bottles
算法·leetcode·职场和发展
长存祈月心4 小时前
Rust Option 与 Result深度解析
算法
杭州杭州杭州5 小时前
机器学习(3)---线性算法,决策树,神经网络,支持向量机
算法·决策树·机器学习
星竹晨L6 小时前
C++继承机制:面向对象编程的基石
开发语言·c++
9ilk6 小时前
【仿RabbitMQ的发布订阅式消息队列】--- 模块设计与划分
c++·笔记·分布式·后端·中间件·rabbitmq
不语n6 小时前
快速排序(Quick Sort)详解与图解
数据结构·算法·排序算法·快速排序·双指针排序
恒者走天下6 小时前
面试的时候项目怎么聊,才能发挥最大的价值
c++