Trilateruj swoją pozycję

11

Wprowadzenie

Wyobraź sobie, że jesteś na dwuwymiarowej płaszczyźnie kartezjańskiej i chcesz ustalić na niej swoją pozycję. Znasz 3 punkty na tym samolocie i odległość do każdego z nich. Chociaż zawsze można na tej podstawie obliczyć swoją pozycję, robienie tego w głowie jest dość trudne. Więc decydujesz się napisać do tego program.

Wyzwanie

Biorąc pod uwagę 3 punkty i odległość do nich, wypisz cordinata swojej pozycji.

  • Dane wejściowe i wyjściowe mogą być w dowolnym dogodnym formacie, w tym przy użyciu liczb złożonych zamiast liczb rzeczywistych. W odpowiedzi proszę wyjaśnić, jakiego formatu używasz.
  • Zawsze otrzymasz dokładnie 3 różne punkty wraz z odległością od Ciebie.
  • Współrzędne i odległości będą zmienne z dowolną precyzją. Wynik musi być poprawny do 3 miejsc po przecinku. Zaokrąglanie zależy od ciebie. Proszę wyjaśnić w swojej odpowiedzi.
  • Możesz założyć, że trzy punkty nie są współliniowe, więc zawsze będzie unikalne rozwiązanie.
  • Nie możesz brutalnie wymusić rozwiązania.
  • Nie możesz używać żadnych wbudowanych, które trywializują ten konkretny problem. Wbudowane normy wektorów itp. Są jednak dozwolone.

Wskazówka, aby rozpocząć:

Pomyśl o okręgu wokół każdego z tych 3 punktów, którego odległość od ciebie jest promieniem.

Zasady

Przypadki testowe

Format wejściowy dla jednego punktu tutaj jest [[x,y],d]z xi ybycia współrzędnych i djest dystans do tego punktu. 3 z tych punktów są ułożone na liście. Wyjście będzie x, a następnie yna liście.

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

Za pomocą tego programu Pyth można generować dodatkowe przypadki testowe . Lokalizacja przebiega w pierwszym wierszu wejścia, a 3 punkty znajdują się w kolejnych 3 wierszach.

Happy Coding!

Denker
źródło
Ponieważ musi pasować do dwuwymiarowej płaszczyzny kartezjańskiej, kod musi być jak najkrótszy.
wizzwizz4,
Oczywiście używasz niedokładnych wyników, które wciąż mogą powodować niejasności, jak powinniśmy sobie z tym poradzić?
flawr
@flawr Załóżmy, że wszystkie wyniki są dokładne i niepowtarzalne. Twój program powinien działać z przypadkami z bardzo małą liczbą miejsc dziesiętnych, nie martw się o niejednoznaczność. Sprzątnę wyzwanie, kiedy będę w domu.
Denker,
Ponieważ zaakceptowana odpowiedź jest w rzeczywistości tylko kalkulatorem graficznym, wspomnę, że w TI-Basic jest 96-bajtowe rozwiązanie (wersja 68k). Aby wyjaśnić, czy solve(biorąc pod uwagę trzy równania kół) problem jest trywialny? Myślałem, że tak, ale jeśli nie masz nic przeciwko takim rzeczom, napiszę to.
Fox

Odpowiedzi:

4

Desmos, 122 bajty

Korzystanie z Internetu . Skopiuj + wklej każde równanie do pola równania, kliknij „dodaj wszystko” dla każdego pola, następnie kliknij punkt przecięcia, a następnie wprowadź odpowiednio każdą wartość. każda A, Bi Csą odległości dla punktów (a,b), (c,d)i (E,f), odpowiednio. Aby uzyskać pierwiastek kwadratowy z wartości, wpisz sqrtnastępnie wartość w polu.

\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

Sprawdź pierwszy przypadek testowy .

Lub możesz zajrzeć tutaj:

koła!

Conor O'Brien
źródło
Wygląda to całkiem ładnie, ale czy spełnia nasze kryteria języków programowania? To dla mnie wygląda jak narzędzie do kreślenia, nigdy go nie używałem, więc mogę się mylić.
Denker
1
@DenkerAffe Wcześniej zadałem pytanie na ten temat na meta i to naprawdę się liczy.
Conor O'Brien
2
W porządku, proszę o moją opinię :)
Denker
Kwestionuję liczbę bajtów. Możesz kliknąć punkt przecięcia za darmo, co nie wydaje się właściwe.
lirtosiast
@lirtosiast Argumentowałbym, że z definicji zawsze chodzi o to, i dalej stwierdzam, że PO powiedział, że tego rodzaju interakcja jest w porządku. Jeśli jednak uważasz, że powinna istnieć jakaś kara, jestem otwarty na sugestie.
Conor O'Brien
4

C, 362 348 345 bajtów

Dane wejściowe są podawane jako sekwencja spacji oddzielonych spacją na standardowym wejściu: x1 y1 d1 x2 y2 d2 x3 y3 d3 . Wyjście jest podobna na 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);}

Cjest typem struktury, której członkowie są współrzędnymi x, współrzędnymi ayb i odległość (promień) c. Funkcja fprzenosi dwie Cstruktury i wskaźnik do pływaka i określa linię, na której Cprzecinają się (okręgi). Punkt przecięcia y tej linii jest umieszczany w pływaka wskazanym do, a nachylenie jest zwracane.

Program wywołuje fdwie pary kół, a następnie określa przecięcie utworzonych linii.

Lis
źródło
Ponieważ wyjaśniliśmy, że dane wejściowe nie są współliniowe, tworzone linie fnigdy nie będą równoległe. Testy mają na celu upewnienie się, że nie są one również pionowe, ponieważ używam formy przechwytywania nachylenia. W ten sposób zawsze jest dokładnie jedna odpowiedź.
Fox
2

Python - 172

Pobiera dane wejściowe jako listę krotek formy (x, y, d). Daj mi znać, jeśli znajdziesz sposób na grę w golfa dalej. Czuję, że musi być, ale nie mogę tego rozgryźć!

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
źródło
Możesz tutaj pominąć niektóre białe znaki. Coś takiego -1 if 1 else 1może się -1if 1else 1na przykład stać . Działa to również z nawiasami. Jest kilka miejsc, w których możesz z tego skorzystać. .5Jest również taki sam jak 0.5.
Denker