C# 获取向量2,该向量与两个向量之间的距离为x

C# 获取向量2,该向量与两个向量之间的距离为x,c#,vector,C#,Vector,我想计算到位置A和位置B的距离相同的位置 例如: 位置A:(3,2) 位置B:(5,4) 距离:5 如果我没弄错的话,有两种可能性,但我不知道如何用数学方法计算 更新: 根据mrk的回答,我修改了这个问题,尽管之前我不清楚它是三维空间中的一个圆。非常感谢 我添加了一个图像来澄清二维变量 目标是根据两名攻击者的位置计算最佳逃生路线。在本例中,距离固定为5,但稍后为可变距离 毕达哥拉斯定理: 点(x,y,z)到位置a的平方距离为 (x-3)² + (y-2)² + z² (x-5)² + (y-4

我想计算到位置A和位置B的距离相同的位置

例如:

位置A:(3,2)
位置B:(5,4)
距离:5

如果我没弄错的话,有两种可能性,但我不知道如何用数学方法计算

更新: 根据mrk的回答,我修改了这个问题,尽管之前我不清楚它是三维空间中的一个圆。非常感谢

我添加了一个图像来澄清二维变量

目标是根据两名攻击者的位置计算最佳逃生路线。在本例中,距离固定为5,但稍后为可变距离

毕达哥拉斯定理:
(x,y,z)
位置a
的平方距离为

(x-3)² + (y-2)² + z²
(x-5)² + (y-4)² + z²
类似地,到
位置b
的平方距离为

(x-3)² + (y-2)² + z²
(x-5)² + (y-4)² + z²
您知道这两者都等于

你能从那里拿走吗

根据你的条件,你可以得到三个方程,三个变量(X, Y、 Z)为点P的坐标,条件为 持有基于你的A点(A1、A2、A3)和B点(B1、B2、B3)

第一个方程式反映了一个事实,即点p与A和B的距离相同

Math.Pow(X - A1, 2) + Math.Pow(Y - A2, 2) = Math.Pow(X - B1, 2) + Math.Pow(Y - B2, 2)
第二个方程式反映了一个事实,即点p与点a之间的距离为d(=5)

Math.Pow(X - A1, 2) + Math.Pow(Y - A2, 2) + Math.Pow(Z, 2) = Math.Pow(d, 2)
第二个方程式反映了一个事实,即点p与点B之间的距离为d(=5)

Math.Pow(X - B1, 2) + Math.Pow(Y - B2, 2) + Math.Pow(Z, 2) = Math.Pow(d, 2)
这就给你留下了一个二次方程组。现在你可以通过解方程1中的X,插入方程2,解方程Y,然后将X和Y的项插入方程3,这样你就可以解Z了。现在你可以用同样的方法返回,在方程2中插入Z的解,然后求解Y,最后在方程1中插入Y和Z的解,求解X。(这听起来可能会让人困惑,这是一个更详细的方法描述,有一个更简单的实践示例)

可以找到一个用C#求解二次方程组的例子

注意: 5的距离可以被认为是围绕点a和B的球体。在2D中,这将导致两个圆相互交叉的解决方案。在3D中,如图所示,这将导致无限多的可能解决方案,因为两个球体重叠,形成一个圆

这可能有助于您选择适当的任务方法,因为您将需要至少再添加一个条件以获取点的特定坐标

更新:

现在的任务变为寻找最佳逃生路线,给定两条 袭击者。我们的球员两边各有一个

在不太关心距离值的情况下,很明显,我们希望避开与攻击者1(A)和攻击者2(B)的连接正交的情况,以最大化到这两个位置的距离:

因此,逃生路线的矢量由下式给出:

因为我们只关心转义的方向,所以可以根据需要设置X或Y,并求解另一个变量


如果您关心,请引入第二个等式,其中包括您关心的条件,例如新向量的长度,并借助mrk的答案求解X和Y,结果以C#和较少的数学形式给出

public static Vector2 GetEscapeVector(this float distance, Vector2 one, Vector2 two)
{
  var center = (one + two) / 2;

  // rotate by 90° which equals to 1.5708F radians
  var rotated = Vector2.Transform(center, Matrix3x2.CreateRotation(1.5708F));

  var escapeVector = Vector2.Normalize(rotated) * distance;

  return escapeVector;
}
以后是这样使用的:

currentPosition + 20F.GetEscapeVector(one, two)


如果您的问题仅限于二维,则此方法会满足您的要求:

private Tuple<PointF, PointF> SameDistancePoints(PointF p1, PointF p2, float distance)
    {
        // Calculate the coefficients for the equation 
        // x^2 + y^2 + a1x + b1y + c = 0
        // which represents the circle of all the points that are at distance d from p1:
        // (x-p1.X)^2 + (y-p1.Y)^2 = distance^2
        // which is
        // x^2 -2p1.X*x + (p1.X)^2 + y^2 -2p1.Y*y + (p1.Y)^2 - distance^2 = 0
        float a1 = -2 * p1.X;
        float b1 = -2 * p1.Y;
        float c1 = (float)Math.Pow(p1.X, 2) + (float)Math.Pow(p1.Y, 2) - (float)Math.Pow(distance, 2);
        // do the same for p2
        float a2 = -2 * p2.X;
        float b2 = -2 * p2.Y;
        float c2 = (float)Math.Pow(p2.X, 2) + (float)Math.Pow(p2.Y, 2) - (float)Math.Pow(distance, 2);
        // Now we have the system with the 2 equations:
        // x^2 + y^2 + a1x + b1y + c1 = 0
        // x^2 + y^2 + a2x + b2y + c2 = 0
        // subtracting the second equation from the first we get
        // (a1-a2)x + (b1-b2)y + c1 - c2 = 0
        // from which 
        // y = (c2-c1)/(b1-b2) - (a1-a2)x/(b1-b2)
        // y = d - ex
        float d = (c2 - c1) / (b1 - b2);
        float e = (a1 - a2) / (b1 - b2);
        // replacing the last equation in the first one of the system:
        // x^2 + (d-ex)^2 + a1x + b1(d-ex) + c1 = 0;
        // x^2 + d^2 - 2dex +(ex)^2 + a1x + b1d - b1ex + c1 = 0
        // (1+e^2)x^2 + (a1-2de-b1e)x + d^2 + b1d + c1 = 0
        // which can be written as 
        // a3x^2 + b3x + c3 = 0
        // where
        float a3 = 1 + (float)Math.Pow(e, 2);
        float b3 = a1 - 2 * d * e - b1 * e;
        float c3 = (float)Math.Pow(d, 2) + b1 * d + c1;
        // now it's simlple
        float delta = (float)Math.Pow(b3, 2) - 4 * a3 * c3;
        if (delta < 0)
            return null;
        float x1 = (-b3 + (float)Math.Sqrt(delta)) / (2 * a3);
        float y1 = d - e * x1;
        float x2 = (-b3 - (float)Math.Sqrt(delta)) / (2 * a3);
        float y2 = d - e * x2;
        return new Tuple<PointF, PointF>(new PointF(x1, y1), new PointF(x2, y2));
    }
private Tuple SameDistancePoints(点F p1、点F p2、浮点距离)
{
//计算方程的系数
//x^2+y^2+a1x+b1y+c=0
//表示距离p1为d的所有点的圆:
//(x-p1.x)^2+(y-p1.y)^2=距离^2
//那是
//x^2-2p1.x*x+(p1.x)^2+y^2-2p1.y*y+(p1.y)^2-距离^2=0
浮点a1=-2*p1.X;
浮点数b1=-2*p1.Y;
浮点c1=(浮点)数学功率(p1.X,2)+(浮点)数学功率(p1.Y,2)-(浮点)数学功率(距离,2);
//对p2执行同样的操作
浮点a2=-2*p2.X;
浮点b2=-2*p2.Y;
浮点c2=(浮点)数学功率(p2.X,2)+(浮点)数学功率(p2.Y,2)-(浮点)数学功率(距离,2);
//现在我们有了两个方程的系统:
//x^2+y^2+a1x+b1y+c1=0
//x^2+y^2+a2x+b2y+c2=0
//从第一个方程中减去第二个方程
//(a1-a2)x+(b1-b2)y+c1-c2=0
//从中
//y=(c2-c1)/(b1-b2)-(a1-a2)x/(b1-b2)
//y=d-ex
浮点数d=(c2-c1)/(b1-b2);
浮点数e=(a1-a2)/(b1-b2);
//替换系统第一个方程中的最后一个方程:
//x^2+(d-ex)^2+a1x+b1(d-ex)+c1=0;
//x^2+d^2-2dex+(ex)^2+a1x+b1d-b1ex+c1=0
//(1+e^2)x^2+(a1-2de-b1e)x+d^2+b1d+c1=0
//可以写成
//a3x^2+b3x+c3=0
//在哪里
浮点a3=1+(浮点)数学功率(e,2);
浮点数b3=a1-2*d*e-b1*e;
浮点c3=(浮点)数学功率(d,2)+b1*d+c1;
//现在是simlple
浮点增量=(浮点)数学功率(b3,2)-4*a3*c3;
if(δ<0)
返回null;
浮点x1=(-b3+(浮点)数学Sqrt(δ))/(2*a3);
浮点数y1=d-e*x1;
浮点x2=(-b3-(浮点)数学Sqrt(delta))/(2*a3);
浮点数y2=d-e*x2;
返回新的元组(新的点f(x1,y1),新的点f(x2,y2));
}

如果您不介意给定的条件,请提供一个代码示例,这已经很清楚,任务是找到所有符合三维要求的点。感谢您的回答,我更新了我的问题,图形非常有启发性。我喜欢solu