Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 每次都产生相同坐标的定位(多边定位)代码?_C++_Algorithm_Physics_Cling - Fatal编程技术网

C++ 每次都产生相同坐标的定位(多边定位)代码?

C++ 每次都产生相同坐标的定位(多边定位)代码?,c++,algorithm,physics,cling,C++,Algorithm,Physics,Cling,编辑:本地化始终是关于x=1980.0000329439335473580285906799168701171875,y=3191.9997642902735606185160577297210693359375 我已经编写了以下代码来解决到达时间延迟问题。也就是说,给定三个观察者的位置、某个信号的速度以及每个接收器“看到”信号的时间,我想定位信号源。这里,我们假设源和观察者位于二维平面(平面欧氏空间) 我的解决办法如下: 给定每个观察者看到信号的时间,我选择一个接收器作为“基线”,我认为t=0

编辑:本地化始终是关于
x=1980.0000329439335473580285906799168701171875,y=3191.9997642902735606185160577297210693359375

我已经编写了以下代码来解决到达时间延迟问题。也就是说,给定三个观察者的位置、某个信号的速度以及每个接收器“看到”信号的时间,我想定位信号源。这里,我们假设源和观察者位于二维平面(平面欧氏空间)

我的解决办法如下:

给定每个观察者看到信号的时间,我选择一个接收器作为“基线”,我认为t=0。然后我从到达另外两个观察者的时间中减去这个时间。现在,我给每个观察者分配一个圆,半径由这个差值给出(“基线”观察者从r=0开始),然后慢慢增加每个圆的半径,直到三个圆在某个点相交

事实上,它们不太可能在一个点上精确相交,比如,我只能在每次迭代中增加离散的半径,我们还假设,但不知道,观察者的时钟是精确同步的

为了解决这个问题,我修改了Paul Bourke的代码:(这里的推理:)。我的改编本和这本差不多


我的问题是,代码总是产生相同的本地化,在一个单位的十分之几之内。我尝试生成一些伪数据(即,选择一些位置,计算预期延迟,将其输入到算法中,看看它是否重建了正确的定位),但该算法仍然生成大致相同的定位。。。也就是说,非常接近三个接收器形成的三角形的中心

知道我做错了什么吗?我和一些人(从事地理信息系统、测地学、类似领域的物理学家和数学家)谈过,但都没有取得任何进展

下面是我的代码(从各方面考虑,代码相当简短)。要本地化某些源代码,请调用本地化源代码(a、b、c、xf和xy)。其中
a
b
c
是延迟(半径),而
xf
xy
是将存储定位坐标的位置

#define EPSILON 0.0001     // Define some threshold

#define x0  3000.00
#define y0  3600.00
#define x1  2100.00
#define y1  2100.00
#define x2  0960.00
#define y2  3600.00

bool findIntersection(double r0, double r1, double r2, double *xf, double *yf){

    double a, dx, dy, d, h, rx, ry;
    double point2_x, point2_y;

    dx = x1 - x0;
    dy = y1 - y0;

    d = sqrt((dy*dy) + (dx*dx));

    if (d > (r0 + r1))
    {
        return false;
    }

    a = ((r0*r0) - (r1*r1) + (d*d)) / (2.0 * d) ;

    point2_x = x0 + (dx * a/d);
    point2_y = y0 + (dy * a/d);

    h = sqrt((r0*r0) - (a*a));

    rx = -dy * (h/d);
    ry = dx * (h/d);

    double intersectionPoint1_x = point2_x + rx;
    double intersectionPoint2_x = point2_x - rx;
    double intersectionPoint1_y = point2_y + ry;
    double intersectionPoint2_y = point2_y - ry;

    dx = intersectionPoint1_x - x2;
    dy = intersectionPoint1_y - y2;
    double d1 = sqrt((dy*dy) + (dx*dx));

    dx = intersectionPoint2_x - x2;
    dy = intersectionPoint2_y - y2;
    double d2 = sqrt((dy*dy) + (dx*dx));

    if(fabs(d1 - r2) < EPSILON) {

        std::cout << std::setprecision(100) << intersectionPoint1_x << ", " << intersectionPoint1_y << "\n";
        *xf = intersectionPoint1_x; *yf = intersectionPoint1_y;
        return true;
        
    }
    else if(fabs(d2 - r2) < EPSILON) {

        std::cout << std::setprecision(100) << intersectionPoint2_x << ", " << intersectionPoint2_y << "\n";
        *xf = intersectionPoint2_x; *yf = intersectionPoint2_y;
        return true;
        
    }
    else {
        return false;
    }

}

void localizeSource(double r0, double r1, double r2, double *xf, double *yf){

    bool foundSource = false;

    while(foundSource == false){
        foundSource = findIntersection(r0, r1, r2, xf, yf);
        r0 += 0.0001; r1 += 0.0001; r2 += 0.0001;
    }


}

int main(){
    
    double xf, xy;
    localizeSource(1000,3000,0,&xf,&xy);
    
}
#定义ε0.0001//定义一些阈值
#定义x0 3000.00
#定义y0 3600.00
#定义x1 2100.00
#定义y1 2100.00
#定义x2 0960.00
#定义y2 3600.00
布尔findIntersection(双r0、双r1、双r2、双xf、双yf){
双a,dx,dy,d,h,rx,ry;
双点2_x,点2_y;
dx=x1-x0;
dy=y1-y0;
d=sqrt((dy*dy)+(dx*dx));
如果(d>(r0+r1))
{
返回false;
}
a=((r0*r0)-(r1*r1)+(d*d))/(2.0*d);
点2_x=x0+(dx*a/d);
点2_y=y0+(dy*a/d);
h=sqrt((r0*r0)-(a*a));
rx=-dy*(h/d);
ry=dx*(h/d);
双相交点1_x=点2_x+rx;
双相交点2_x=点2_x-rx;
双相交点1_y=点2_y+y;
双相交点2_y=点2_y-y;
dx=相交点1_x-x2;
dy=相交点1_y-y2;
双d1=sqrt((dy*dy)+(dx*dx));
dx=相交点2_x-x2;
dy=相交点2_y-y2;
双d2=sqrt((dy*dy)+(dx*dx));
if(fabs(d1-r2)std::cout你想解决什么还不是很清楚……你的问题是关于“到达时间延迟[sic]”,但是你链接到了“圆的交点”算法。时差算法使用的是抛物线而不是圆

到达时差算法:

有人已经用方的方法编写了示例代码

如果您只是在寻找三角测量/三边测量公式:

A = 2*x2 - 2*x1
B = 2*y2 - 2*y1
C = r1*r1 - r2*r2 - x1*x1 + x2*x2 - y1*y1 + y2*y2
D = 2*x3 - 2*x2
E = 2*y3 - 2*y2
F = r2*r2 - r3*r3 - x2*x2 + x3*x3 - y2*y2 + y3*y3
x = (C*E - F*B) / (E*A - B*D)
y = (C*D - A*F) / (B*D - A*E)

我不知道你期望代码做什么。为什么它会给出不同的结果?请阅读,也许提供一个能真正显示你期望的结果的例子。顺便说一句:你在代码中犯了几个错误。虽然不是致命的错误,但你仍然可以从codereview.stackexchange.com上的审查中获益,以扩展@UlrichEckhardt的建议o在代码回顾上发表文章;当前的问题不会出现在主题上,因为代码没有按照您想要的方式工作。如果您解决了此问题,那么如果您提出新问题,它可能是一个好问题,请检查并遵循。@UlrichEckhardt Hi。感谢您指出这一点。我想我知道所有这些错误。在我的情况下,我对我知道我在实践中永远不会遇到这些错误的数据。此外,我发布了整个代码,因为我觉得这是我的algo.logic的问题,而不是代码中的一些错误(如果我错了,请纠正我,但我认为这仍然是一个主题。我在这里看到了很多关于algo.solutions/algo.logic问题的问题)。我已经根据我的逻辑包括了计算本地化所需的最小值。如果我删除了任何内容,代码将一事无成。您的问题缺少预期的结果。给定输入值
1000
3000
、和
0
,如您的示例所示,答案应该是什么?“[时间差]给出的半径。”--使用以时间为单位的量作为以距离为单位的量的理由是什么?虽然我可以看到计算是如何被迫进行的,但这种对设置的描述闻起来有点糟糕的数学味道。实际上,它是双曲线的交点。不过,增长的圆是有效的(如果是迭代的和近似的)替代办法。