5

网格

(角落里的小点是节点,红点是被跟踪的人)

坐标:

Node   X    Y   Position
1      0    0   Top left
2    450    0   Top right
3      0  450   Bottom left
4    450  450   Bottom right

Person    X    Y
Red dot  84   68

获取信号强度的方法:

(只需要相对于其他节点的信号强度,这似乎可以实现。或者我在这里错了吗?)

public int GetSignalStrength(OvalShape node)
{
    int xd = node.Left - this.person.Left;
    int yd = node.Top - this.person.Top;

    var signalStrength = Math.Sqrt((xd * xd) + (yd * yd));

    return Convert.ToInt32(-signalStrength);
}

信号强度:

Node   Signal Strength
1                 -108
2                 -372
3                 -391
4                 -529

获取人物坐标的方法:

(s1、s2、s3、s4是上面的信号强度)

public int[] GetPositionInGrid(int s1, int s2, int s3, int s4)
{
    var tx1 = this.node1.Left;
    var ty1 = this.node1.Top;

    var tx2 = this.node2.Left;
    var ty2 = this.node2.Top;

    var tx3 = this.node3.Left;
    var ty3 = this.node3.Top;

    var tx4 = this.node4.Left;
    var ty4 = this.node4.Top;

    double w1 = ((double)s1) / ((double)(s1 + s2 + s3 + s4));
    double w2 = ((double)s2) / ((double)(s1 + s2 + s3 + s4));
    double w3 = ((double)s3) / ((double)(s1 + s2 + s3 + s4));
    double w4 = ((double)s4) / ((double)(s1 + s2 + s3 + s4));

    var px = ((tx1 * w1) + (tx2 * w2) + (tx3 * w3) + (tx4 * w4)) / (w1 + w2 + w3 + w4);
    var py = ((ty1 * w1) + (ty2 * w2) + (ty3 * w3) + (ty4 * w4)) / (w1 + w2 + w3 + w4);

    return new int[] { Convert.ToInt32(px), Convert.ToInt32(py) };
}

人物定位:

x: 290
y: 296

正如你所看到的,我的数学不是那么好,而且“人的位置”也很遥远。这并不重要,但如果这个人在网格的中间,它就会起作用。

我正在假设如果每个节点都具有相同的信号强度,则该人位于网格的中间。

有人可以帮我吗?一段时间以来一直在谷歌搜索并将我的头撞在桌子上。

4

2 回答 2

3

我认为你用错了这个词,你应该搜索Trilateration。您可以查看算法的这个很好的解释

于 2013-07-26T20:07:42.247 回答
2

您实际上应该只需要 3 个节点来执行此操作。

这里的基本概念是每个信号强度都告诉您与节点的距离。在没有其他信息的情况下,您可以从每个节点构造一个半径等于信号强度的半圆。当然,这个人必须躺在半圆的某个地方。

因此,使用一个节点,我们构建了一个半圆,它会产生无限数量的人可能所在的点。

对于两个节点,我们发现两个半圆可能在多达两个位置相交。事实上,如果人不在精确的中心,两个相对的节点将在窗口边界内的两个不同点相交,但如果人在屏幕的中心,则只会在一个点(中心)相交。

随着第三个节点的引入,第三个半圆保证在前两个半圆相交的两个点之一处相交。

这三个节点相交的位置就是人居住的地方。

正如 the_lotus 所说,这是一个三边测量问题。

这是您需要的功能(您甚至可以s4从参数列表中删除):

public int[] GetPositionInGrid(int s1, int s2, int s3, int s4)
{
  var px = ((s1 * s1) 
            - (s2 * s2) 
            + (this.node2.Left * this.node2.Left)) 
           / ((double)(2 * this.node2.Left));

  var py = ((s1 * s1) 
            - (s3 * s3) 
            + (this.node3.Left * this.node3.Left) 
            + (this.node3.Top * this.node3.Top)) 
           / (2 * this.node3.Top) 
           - (this.node3.Left / (double)this.node3.Top) 
           * px;

  return new int[] { Convert.ToInt32(px), Convert.ToInt32(py) };
}
于 2013-07-26T20:08:37.420 回答