三边位置


11

介绍

假设您在二维笛卡尔平面上,并且想确定您在该平面上的位置。您知道飞机上的3个点以及与每个点的距离。虽然总是可以从中计算出您的位置,但是在您的头脑中做到这一点非常困难。因此,您决定为此编写一个程序。

挑战

给定3点和您到它们的距离,输出您位置的坐标。

  • 输入和输出可以采用任何方便的格式,包括使用复数而不是实数。请在您的答案中说明使用的格式。
  • 您将始终获得3个与您之间的距离完全不同的点。
  • 坐标和距离将是具有任意精度的浮点数。您的输出必须正确到小数点后三位。取整由您决定。请在您的答案中阐明。
  • 您可能会认为这三个点不是共线的,所以总会有一个唯一的解决方案。
  • 您无权强加解决方案。
  • 您可能不会使用任何琐碎此特定问题的内置函数。不过,允许使用矢量规范等的内置函数。

上手提示:

考虑围绕这三个点的每个圆,以它们到您的距离为半径。

规则

测试用例

这里一个点的输入格式是[[x,y],d]xy分别是坐标和d到该点的距离。这些点中的3点排列在一个列表中。输出将是x然后y在列表中。

[[[1,2],1.414],[[1,1],2.236],[[2,2],1.0]]-> [2,3]
[[[24.234,-13.902],31.46],[[12.3242,234.12],229.953],[[23.983,0.321],25.572]]-> [-1.234,4.567]
[[[973.23,-123.221],1398.016],[[-12.123,-98.001],990.537],[[-176.92,0],912.087]]-> [12.345,892.234]

您可以使用此Pyth程序生成其他测试用例。位置在输入的第一行,三个点在随后的三行。

编码愉快!


因为它需要适合于二维笛卡尔平面,所以代码需要尽可能短。
wizzwizz4 2016年

您显然使用的是不精确的结果,但仍然可能导致歧义,我们应该如何处理呢?
瑕疵的

@flawr只是假设所有结果都是精确且唯一的。您的程序应适用于小数位数很少的情况,不必担心歧义。当我回到家时,我会清理挑战。
Denker

由于公认的答案实际上只是一个图形计算器,因此我将提到TI-Basic(68k版本)中有96字节的解决方案。为了澄清,solve(给定三个圆方程)是否使问题平凡?我以为是这样,但是如果您对这样的事情还可以,我会继续进行发布。
Fox

Answers:


4

Desmos,122个字节

在线使用。将每个方程式复制+粘贴到方程式框中,单击每个框的“全部添加”,然后单击相交点,然后根据需要输入每个值。每个的ABC是用于点的距离(a,b)(c,d)以及(E,f)分别。要在值中求平方根,请sqrt在框中输入值。

\left(x-a\right)^2+\left(y-b\right)^2=AA
\left(x-c\right)^2+\left(y-d\right)^2=BB
\left(x-E\right)^2+\left(y-f\right)^2=CC

验证第一个测试用例

或者您可以在这里看看:

界!


看起来不错,但这是否满足我们编程语言的标准?这对我来说就像一个绘图工具,从未使用过,所以我可能是错的。
Denker


2
好吧,那就请我投票吧:)
Denker,2016年

我对字节数表示怀疑。您可以免费单击交叉点,但这似乎不正确。
lirtosiast '16

@lirtosiast我要指出的是,根据定义,这一点总是存在的,并进一步指出,OP表示这种互动是可以的。但是,如果您认为应该罚款,我愿意提出建议。
科纳·奥布莱恩

4

C,362个 348 345字节

输入是在stdin:上以空格分隔的浮点序列给出的x1 y1 d1 x2 y2 d2 x3 y3 d3。在stdout上的输出类似:x y

#define F"%f "
#define G float
#define T(x)(b.x*b.x-a.x*a.x)
typedef struct{G a;G b;G c;}C;G f(C a,C b,G*c){G x=b.b-a.b;*c=(T(a)+T(b)-T(c))/x/2;return(a.a-b.a)/x;}main(){C a,b,c;G x,y,z,t,m;scanf(F F F F F F F F F,&a.a,&a.b,&a.c,&b.a,&b.b,&b.c,&c.a,&c.b,&c.c);x=f(a,a.b==b.b?c:b,&y);z=f(b.b==c.b?a:b,c,&t);m=t-y;m/=x-z;printf(F F"\n",m,x*m+y);}

C是一种结构类型,其成员为x坐标a,y坐标b和距离(半径)c。该函数f采用两个C结构和一个指向浮点数的指针,并确定C(圆)相交的线。将此线的y截距放置到指向的浮点中,并返回斜率。

程序调用f两对圆,然后确定产生的线的交点。


由于我们已经阐明了输入不是共线的,因此f产生的线永远不会平行。测试是为了确保它们也不垂直,因为我使用的是截距形式。这样,总是只有一个答案。
Fox

2

Python-172

将输入作为(x,y,d)形式的元组列表。让我知道,如果您看到进一步打高尔夫球的方法,我觉得一定有,但我无法解决!

import numpy as N
def L(P):
    Z=[p[2]**2-p[0]**2-p[1]**2 for p in P];return N.linalg.solve([[P[i][0]-P[0][0],P[i][1]-P[0][1]]for i in[1,2]],[(Z[0]-Z[i])*0.5 for i in [1,2]])

您可以在此处省略一些空格。例如,类似的东西可能-1 if 1 else 1会变成-1if 1else 1。这也适用于方括号。在某些地方您可以利用它。也.5与相同0.5
Denker
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.