我的博客和笔记我的博客和笔记
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
  • 我的文章

    • 从抛币协议到智能合约

      • Part1
      • Part2
    • JPEG算法解密

      • Part1
      • Part2
      • Part3
      • Part4
      • Part5
      • Github
    • SPH算法简介

      • Part1
      • Part2
      • Part3
      • Part4
      • Github
    • 赌博中的数学:Martingle策略
    • 如何生成一个随机的圆形
    • 一个简单的DH密钥协商算法的实现
    • 如何计算线段和圆的交点
    • 一道数学趣题
    • 斐波那契数列和1/89
    • 匀速贝塞尔曲线运动的实现

      • Part1
      • Part2
  • 开源项目

    • TurboLink
    • TinyEncrypt
    • UnrealStyleGuide
    • AxTrace
    • Cyclone
  • 学习笔记

    • 数学相关

      • 常用数学符号
      • 群
      • 数论(一)
      • 数论(二)
      • 数论(三)
      • 概率
    • 密码学

      • RSA
      • 抛币协议
      • 智能扑克协议
    • 图形学

      • 数学基础

        • 矢量
        • 矩阵
        • 立体角
        • 几何变换(一)
        • 几何变换(二)
        • 法线变换
        • 摄像机变换
      • 光照模型

        • 传统光照模型
        • 光度学
        • 双向反射分布函数(BRDF)
        • 微平面理论(一)
        • 微平面理论(二)
        • 微平面理论(三)
        • 光照方程
      • 环境光渲染

        • 环境光渲染(一)
        • 环境光渲染(二)
    • 编程语言

      • JavaScript

        • 环境搭建
        • 基本语法
        • 函数
        • 对象和类

如何计算线段和圆的交点

一个程序里用到了计算线段和圆相交情况的算法,在这里记下来备忘

设线段的两个端点分别是P1(x1,y1)和P2(x2,y2),圆的圆心在P3(x3,y3),半径为r,那么如果有交点P(x,y)的话

P→=P1→+u(P2→−P1→)

其中,u在0到1之间,转换成各个坐标

{x=x1+u(x2−x1)y=y1+u(y2−y1)

由于P也在圆上,所以

(x−x3)2+(y−y3)2=r2

联立上面的公式,可以得到

Au2+Bu+C=0

其中

{A=(x2−x1)2+(y2−y1)2B=2((x2−x1)(x1−x3)+(y2−y1)(y1−y3))C=x32+y32+x12+y12−2(x3x1+y3y1)−r2

解一元二次方程,可以得到

u=−B±B2−4AC2A

根据B2−4AC的结果,可以判断线段所在直线和圆的相交情况

  • 如果小于0,表示没有交点
  • 如果等于0,表示相切,只有一个交点
  • 如果大于0,表示有两个交点

针对P1和P2之间的线段,根据计算出的u值,有5种结果

  • 如果线段和圆没有交点,而且都在圆的外面的话,则u的两个解都是小于0或者大于1的
  • 如果线段和圆没有交点,而且都在圆的里面的话,u的两个解符号相反,一个小于0,一个大于1
  • 如果线段和圆只有一个交点,则u值中有一个是在0和1之间,另一个不是
  • 如果线段和圆有两个交点,则u值得两个解都在0和1之间
  • 如果线段和圆相切,则u值只有1个解,且在0和1之间
Prev
一个简单的DH密钥协商算法的实现
Next
一道数学趣题