Trilaterate tu posición

11

Introducción

Imagina que estás en un plano cartesiano bidimensional y quieres determinar tu posición en él. Sabes 3 puntos en ese avión y tu distancia a cada uno de ellos. Si bien siempre es posible calcular su posición a partir de eso, hacerlo en su cabeza es bastante difícil. Entonces decides escribir un programa para eso.

El reto

Dados 3 puntos y su distancia a ellos, envíe los cordinates de su posición.

  • La entrada y la salida pueden estar en cualquier formato conveniente, incluido el uso de números complejos en lugar de números reales. Por favor, aclare en su respuesta qué formato utiliza.
  • Siempre obtendrá exactamente 3 puntos distintos con su distancia a usted.
  • Las coordenadas y distancias serán flotantes con precisión arbitraria. Su salida tiene que ser correcta a 3 decimales. El redondeo depende de usted. Por favor aclare en su respuesta.
  • Puede suponer que los tres puntos no son colineales, por lo que siempre habrá una solución única.
  • No está permitido aplicar fuerza bruta a la solución.
  • No puede usar ningún componente incorporado que trivialice este problema en particular. Sin embargo, se permiten las construcciones para normas vectoriales, etc.

Sugerencia para comenzar:

Piensa en un círculo alrededor de cada uno de esos 3 puntos con su distancia a ti como radio.

Reglas

Casos de prueba

El formato de entrada para un punto aquí es [[x,y],d]con xy ysiendo las coordenadas y dla distancia a este punto. Los 3 de esos puntos están ordenados en una lista. La salida será xy luego yen una lista.

[[[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]

Puede generar casos de prueba adicionales con este programa Pyth . La ubicación va en la primera línea de la entrada y los 3 puntos están en las siguientes 3 líneas.

¡Feliz codificación!

Denker
fuente
Debido a que necesita encajar en un plano cartesiano bidimensional, el código debe ser lo más corto posible.
wizzwizz4
Obviamente está utilizando resultados inexactos que aún pueden generar ambigüedad, ¿cómo debemos manejar esto?
flawr
@flawr Solo asume que todos los resultados son exactos y únicos. Su programa debería funcionar para casos con muy pocos decimales, no se preocupe por la ambigüedad. Limpiaré el desafío cuando esté en casa.
Denker
Dado que la respuesta aceptada es efectivamente solo una calculadora gráfica, mencionaré que hay una solución de 96 bytes en TI-Basic (versión 68k). Para aclarar, ¿está solve(dado tres ecuaciones circulares) trivializar el problema? Pensé que era, pero si estás de acuerdo con esas cosas, seguiré y lo publicaré.
Fox

Respuestas:

4

Desmos, 122 bytes

Uso en línea . Copie + pegue cada ecuación en un cuadro de ecuaciones, haga clic en "agregar todo" para cada cuadro, luego haga clic en el punto de intersección, luego ingrese cada valor según corresponda. cada uno de A, By Cson las distancias de los puntos (a,b), (c,d)y (E,f), respectivamente. Para obtener una raíz cuadrada en el valor, escriba sqrtel valor en el cuadro.

\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

Verifique el primer caso de prueba .

O puedes echar un vistazo aquí:

círculos!

Conor O'Brien
fuente
Esto se ve bastante bien, pero ¿satisface nuestros criterios para los lenguajes de programación? Esto se parece a una herramienta de trazado para mí, nunca lo usé, así que podría estar equivocado.
Denker
1
@DenkerAffe Realmente hice una pregunta al respecto en meta antes , y de hecho cuenta.
Conor O'Brien
2
Muy bien, ten mi voto a favor :) :)
Denker
Disputo el recuento de bytes. Haz clic en el punto de intersección de forma gratuita, lo que no parece correcto.
lirtosiast
@lirtosiast Yo diría que el punto siempre está ahí por definición y afirmaría además que el OP dijo que este tipo de interacción estaba bien. Sin embargo, si cree que debería haber alguna penalización, estoy abierto a sugerencias.
Conor O'Brien
4

C, 362 348 345 bytes

De entrada se da como una secuencia de flotadores separados por un espacio en la entrada estándar: x1 y1 d1 x2 y2 d2 x3 y3 d3. La salida es similar en la salida estándar: 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);}

Ces un tipo de estructura cuyos miembros son una coordenada x a, una coordenada by y una distancia (radio) c. La función ftoma dos Cestructuras y un puntero a un flotador, y determina la línea en la que se Ccruzan (círculos). La intersección en y de esta línea se coloca en el flotador apuntado y se devuelve la pendiente.

El programa llama fa dos pares de círculos, luego determina la intersección de las líneas producidas.

zorro
fuente
Como hemos aclarado que las entradas no son colineales, las líneas fproducidas nunca serán paralelas. Las pruebas son para garantizar que tampoco sean verticales, ya que estoy usando la forma pendiente-intersección. De esta manera, siempre hay exactamente una respuesta.
Fox
2

Python - 172

Toma la entrada como una lista de tuplas de forma (x, y, d). Avíseme si ve una manera de jugar golf más allá, ¡siento que debe haberla, pero no puedo entenderlo!

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]])
RT
fuente
Puede omitir algunos espacios en blanco aquí. Algo así -1 if 1 else 1puede convertirse, -1if 1else 1por ejemplo. Esto también funciona con paréntesis. Hay algunos lugares donde puede aprovechar eso. También .5es lo mismo que 0.5.
Denker