【Unity3D】计算切点坐标

该博客介绍了在Unity3D中如何计算炸弹爆炸范围与玩家圆形边界相交的切点坐标,以此判断玩家是否受到伤害。通过代码示例展示了高效且易读的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求描述:炸弹爆炸时有一个范围,从炸弹中心(等效为点)到玩家(等效为圆)的边缘,做一条切线,然后计算切点的坐标,来判断玩家是否受到伤害。
数学模型如图所示
代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bomb : MonoBehaviour
{
   
	//将脚本挂载到 Bomb 上,需要将 Player 设为公开变量,然后拖拽进来。
    public GameObject player;

	//设为公开变量,方便在面板中查看
    public float angle;//半径与两点间距离的夹角,也是单位向量旋转的角度
    public float b;//两点间距离
    public Vector3 vec_01;//两点间方向
    public Vector3 vec_02;//切点

    // Start is called before the first frame update
    void Start()
    {
   
        
    }

    // Update is called once per frame
    void Update()
首先,我们需要确定两个的位置和半径。假设1的坐标为 (x1, y1),半径为 r1;2的坐标为 (x2, y2),半径为 r2。可以使用勾股定理计算出两个心之间的距离 d: ```python import math x1, y1, r1 = 1, 2, 3 x2, y2, r2 = -1, -2, 4 d = math.sqrt((x2 - x1)**2 + (y2 - y1)**2) ``` 接下来,我们需要判断两个是否相交或包含。如果两个相离,则它们之间不存在公共切线。如果一个包含另一个,则公共切线无限多。 ```python if d > r1 + r2: print("两个相离,不存在公共切线") elif d < abs(r1 - r2): print("一个包含另一个,公共切线无限多") ``` 对于两个相交的,我们可以通过计算它们的切点坐标来得到公共切线。假设切点分别为 P1 和 P2,我们可以将两个心连线的中垂线作为公共切线的法线,然后计算法线与心连线的夹角 α。根据三角函数的定义,切线与心连线的夹角为 90° - α。因此,我们可以计算出切线的斜率 k,然后使用两点式得到切线的方程。 ```python else: a = (r1**2 - r2**2 + d**2) / (2 * d) h = math.sqrt(r1**2 - a**2) x3 = x1 + a * (x2 - x1) / d y3 = y1 + a * (y2 - y1) / d x4_1 = x3 + h * (y2 - y1) / d y4_1 = y3 - h * (x2 - x1) / d x4_2 = x3 - h * (y2 - y1) / d y4_2 = y3 + h * (x2 - x1) / d print("切点坐标为 ({:.2f}, {:.2f}) 和 ({:.2f}, {:.2f})".format(x4_1, y4_1, x4_2, y4_2)) ``` 完整代码如下: ```python import math x1, y1, r1 = 1, 2, 3 x2, y2, r2 = -1, -2, 4 d = math.sqrt((x2 - x1)**2 + (y2 - y1)**2) if d > r1 + r2: print("两个相离,不存在公共切线") elif d < abs(r1 - r2): print("一个包含另一个,公共切线无限多") else: a = (r1**2 - r2**2 + d**2) / (2 * d) h = math.sqrt(r1**2 - a**2) x3 = x1 + a * (x2 - x1) / d y3 = y1 + a * (y2 - y1) / d x4_1 = x3 + h * (y2 - y1) / d y4_1 = y3 - h * (x2 - x1) / d x4_2 = x3 - h * (y2 - y1) / d y4_2 = y3 + h * (x2 - x1) / d print("切点坐标为 ({:.2f}, {:.2f}) 和 ({:.2f}, {:.2f})".format(x4_1, y4_1, x4_2, y4_2)) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值