You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现缩放圆与圆之间的碰撞检测?

缩放圆(椭圆)与标准圆的碰撞检测实现方法

你提到的“X方向尺寸更大的缩放圆”本质是椭圆,和标准圆的碰撞检测可以通过以下步骤实现:

核心思路

碰撞的核心判定逻辑是:两个图形是否存在重叠区域,或其中一个的某部分进入另一个的范围。我们可以通过坐标归一化+距离判断的方式简化计算,不用复杂的几何推导。

具体实现步骤

1. 定义基础参数

先明确两个图形的关键参数:

  • 标准圆:圆心坐标 (cx, cy),半径 r
  • 椭圆(缩放圆):中心坐标 (ex, ey),X方向半轴长度 a(拉伸后的长半轴),Y方向半轴长度 b(原圆半径)

2. 碰撞判断逻辑

情况1:标准圆圆心在椭圆内部

先将标准圆圆心的坐标归一化到椭圆的坐标系中:
计算归一化偏移量的平方和:s_sq = ((cx - ex)/a)² + ((cy - ey)/b)²
如果 s_sq ≤ 1,说明标准圆圆心在椭圆内部,必然发生碰撞。

情况2:标准圆圆心在椭圆外部

此时需要找到椭圆上离标准圆圆心最近的点,再判断该点到标准圆圆心的距离是否小于等于标准圆的半径:

  1. 计算归一化偏移量:u = (cx - ex)/a,v = (cy - ey)/b
  2. 计算归一化距离的平方根:s = sqrt(u² + v²)
  3. 椭圆上最近点的坐标:(ex + a*u/s, ey + b*v/s)
  4. 计算该点到标准圆圆心的距离平方,若结果 ≤ r²,则发生碰撞。

3. 伪代码示例

import math

def check_ellipse_circle_collision(cx, cy, r, ex, ey, a, b):
    # 计算圆心偏移量
    dx = cx - ex
    dy = cy - ey
    
    # 归一化到椭圆坐标系
    u = dx / a
    v = dy / b
    s_sq = u*u + v*v
    
    if s_sq <= 1.0:
        # 标准圆圆心在椭圆内,直接判定碰撞
        return True
    else:
        # 计算椭圆上离标准圆圆心最近的点
        s = math.sqrt(s_sq)
        closest_x = ex + a * u / s
        closest_y = ey + b * v / s
        
        # 计算距离平方,避免开方提升性能
        dist_sq = (closest_x - cx)**2 + (closest_y - cy)**2
        return dist_sq <= r*r

补充说明

  • 若缩放圆是Y方向拉伸的,只需将a和b的对应关系调换即可
  • 全程使用平方值比较可以避免开方运算,提升性能,适合游戏等实时场景

内容的提问来源于stack exchange,提问作者5x9x7x2x7x9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:00:56