当前位置: 首页 > article >正文

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)

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

http://www.lryc.cn/news/2396945.html

相关文章:

  • 23. Merge k Sorted Lists
  • 每日算法刷题计划Day20 6.2:leetcode二分答案3道题,用时1h20min
  • Spring Security安全实践指南
  • Unity + HybirdCLR热更新 入门篇
  • QuickBASIC QB64 支持 64 位系统和跨平台Linux/MAC OS
  • ElasticSearch迁移至openGauss
  • 【C语言极简自学笔记】项目开发——扫雷游戏
  • Global Security Markets 第5章知识点总结
  • 电子电路:4017计数器工作原理解析
  • Vim 中设置插入模式下输入中文
  • GitHub 趋势日报 (2025年05月31日)
  • Maven概述,搭建,使用
  • 基于大模型的数据库MCP Server设计与实现
  • 【前端】macOS 的 Gatekeeper 安全机制阻止你加载 bcrypt_lib.node 文件 如何解决
  • Unity 环境搭建
  • 【入门】【练9.3】 加四密码
  • 使用 SASS 与 CSS Grid 实现鼠标悬停动态布局变换效果
  • Node.js 全栈开发方向常见面试题
  • Spring如何实现组件扫描与@Component注解原理
  • 历年四川大学计算机保研上机真题
  • gcc符号表生成机制
  • 达梦数据库 Windows 系统安装教程
  • unix/linux source 命令,其基本概念、定义、性质、定理
  • 【Java EE初阶】计算机是如何⼯作的
  • RAG理论基础总结
  • 列表推导式(Python)
  • 嵌入式RTC工作原理及应用场景
  • 一天搞懂深度学习--李宏毅教程笔记
  • Go语言常见接口设计技巧-《Go语言实战指南》
  • python打卡训练营打卡记录day43