微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

首页> C#>如何找到路径上的另一点最近的位置

enter image description here

从图中可以看出,该点的位置是必需的.目标和障碍物的位置是动态的,但可以将机器人的位置视为宇宙的中心.
到目前为止已完成的工作如下

float m = calculate_m();
float d = calculate_d(nearest_obstacle, m);
teta = (float)calculate_angle(d, nearest_obstacle);

float calculate_m()
{
    float m = (player.position.z - winning_state.position.z )/(player.position.x - winning_state.position.x);
    return m;
}

float calculate_d(Transform nearest_obstacle,float m)
{

    float b;
    b = (-1 * player.position.z) + (m * player.position.x);
    //changed: we remove || absolute value so it gives -90 90 degree  ||
    float d = (nearest_obstacle.position.z - (m * nearest_obstacle.position.x) + b) / (Mathf.Sqrt(Mathf.Pow(m, 2) + Mathf.Pow(1, 2)));
    return d;
}

float calculate_angle(float d,Transform nearest_obstacle)
{

    float pw_distance=my_distance(player.position.x,nearest_obstacle.position.x,player.position.z,nearest_obstacle.position.z);
    float mycalcInradians = Mathf.Asin(d/pw_distance);
    float mycalcIndegrees = mycalcInradians * 180 / Mathf.PI;
    return  mycalcIndegrees;
}

float my_distance(float x1,float x2,float z1,float z2)
{
    return Mathf.Sqrt (Mathf.Pow(x1-x2,2)+Mathf.Pow(z1-z2,2));
}

我现在需要的是可为我提供该点位置的公式.

为了使我的问题更清楚,请参见下图和说明.

enter image description here

有一条线称为A.我在场景中有一个点称为O.我想从O到A画一条线,使它们彼此交叉时,交点成90度角.再加上我想知道什么是交点.我想团结一致.我想要的是一个公式.

先感谢您.

解决方法:

有两种方法可以解决此问题:

>三角法(使用余弦的长度计算)
>线性代数方法(在线的最近点)

我只在这里介绍trig方法,因为后一种方法在Stack Overflow的其他地方有充分的文档说明. Get closest point to a line.

您已表明由点Robot,Obstacle和dr组成的三角形是直角三角形.这是解决信息丢失(也许不是等边三角形)的较简单情况之一-您可以使用SOH CAH TAO描述的三角学规则来做到这一点.

在这种情况下,我们将使用CAH(余弦比)来计算该三角形相邻边的长度,因为我们可以从可用信息中获得斜边(Robot-Obstacle)和角度(theta).一旦我们有了边的长度,我们就可以沿着路径到达目标并确定相交位置.

这是一个有关如何在代码中实现此方法的想法(我选择不使用您编写的任何方法,而是利用Unity提供的许多方法):

Vector3 GetClosestPointToObstacleOnPathToTarget(Transform robot, Transform obstacle, Transform target)
{
    // Calculate vector from robot to target
    Vector3 toTarget = target.position - robot.position;

    // Calculate vector and distance from robot to obstacle (hypotenuse)
    Vector3 toObstacle = obstacle.position - robot.position;
    float robotObstacledistance = toObstacle.magnitude;

    // Calculate theta (angle)
    float theta = Vector3.Angle(toTarget, toObstacle);

    // Using CAH rule (cosine, adjacent, hypotenuse) to find the (adjacent) side length
    float robotIntersectiondistance = Mathf.Cos(theta * Mathf.Deg2Rad) * robotObstacledistance;

    // Travelling the calculated distance in the direction of the target
    Vector3 intersectionPoint = robot.position + toTarget.normalized * robotIntersectiondistance;

    return intersectionPoint;
}

希望这可以帮助!如果您有任何疑问,请告诉我.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐