C# 基于信号强度C的网格三角剖分算法#

C# 基于信号强度C的网格三角剖分算法#,c#,triangulation,cartesian-coordinates,C#,Triangulation,Cartesian Coordinates,(角落里的小点是节点,红点是被跟踪的人) 坐标: 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 获取信号强度的方法: (只需要相对于其他节点的信号强度,这似乎是实现的。或者我在这里错了?) 信号强度: Nod

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

坐标:

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
获取信号强度的方法:

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

信号强度:

Node   Signal Strength
1                 -108
2                 -372
3                 -391
4                 -529
获取人员坐标的方法:

(s1、s2、s3、s4为上述信号强度)

人员职务:

x: 290
y: 296
正如你所看到的,我的数学不是很好,而且“人的位置”也太离谱了。这并不重要,但是如果人在网格的中间,它就起作用了。 我假设每个节点都具有相同的信号强度,人就在网格的中间。< /P>
有人能帮我吗?有一段时间我一直在用谷歌搜索并用头撞桌子。

我想你把这个词搞错了,你应该去搜索。您可以查看此项。

您实际上只需要3个节点即可完成此操作

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

因此,对于一个节点,我们构造了一个半圆,它会在人可以到达的地方产生无穷多的点

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

引入第三个节点后,第三个半圆将保证在其相交的两点之一处与前两个半圆相交

这三个节点相交的位置是人居住的位置

正如荷花大学所说,这是一个三边测量问题

这是您需要的函数(您甚至可以从参数列表中剪切
s4
):


当人靠近节点时,信号接近什么值?我猜它朝着0走?你的节点总是在四个角吗?或者有没有可能有一个节点,比如说
(150250)
另一个关键问题是信号强度是否线性下降?指数级?@abelenky:是的,这就是我模拟信号强度的方式。还没有实际的节点。@crush:我这样做是为了让定位工作更容易。我希望它也能处理随机放置的节点。解释了很多!:)谢谢我先尝试了3个节点,但为了更简单,我添加了一个forth。我明白了这个概念,但不是该死的数学:P谢谢你花时间来帮助我@Tiax I修复了一个小问题。
py
的计算没有在需要时将其转换为双倍。另外,请注意,仅当节点1和节点2具有相同的y值时,此解决方案才有效。我正在研究一个解决方案,但这不一定是真的。非常感谢!明天将玩它:)工作起来很有魅力!如果您解决了节点1和节点2具有相同y值的“问题”,请让我知道!那真是太好了@Tiax不幸的是,我现在没有时间来实现它,但是这样做的算法还不错。只需对节点进行前后处理,使其符合规范,然后将其移回。
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
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) };
}