Трилатеральна позиція


11

Вступ

Уявіть, що ви перебуваєте на двовимірній декартовій площині і хочете визначити своє положення на ній. Ви знаєте 3 точки на цій площині та відстань до кожної з них. Хоча завжди можна з цього розрахувати своє становище, робити це в голові досить важко. Тож ви вирішили написати програму для цього.

Змагання

Враховуючи 3 бали та відстань до них, виведіть кординати своєї позиції.

  • Введення та вихід можуть бути у будь-якому зручному форматі, включаючи використання складних замість реальних цифр. Будь ласка, уточніть у своїй відповіді, який формат ви використовуєте.
  • Ви завжди отримаєте рівно 3 чіткі точки, відстань до вас.
  • Координати та відстані будуть плавати з довільною точністю. Вихід повинен бути правильним до 3 знаків після коми. Округлення залежить від вас. Будь ласка, уточніть у своїй відповіді.
  • Ви можете припустити, що три точки не є колінеарними, тому завжди знайдеться унікальне рішення.
  • Вам не дозволяється жорстоко застосовувати рішення.
  • Ви не можете використовувати будь-які вбудовані елементи, які б вирішили цю проблему. Однак побудовані для векторних норм тощо дозволяються.

Підказка для початку:

Подумайте про коло навколо кожної з цих 3 точок, відстань до вас як радіус.

Правила

Тестові справи

Формат введення для однієї точки тут [[x,y],d]з xі yбути координати і 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 . Місце розташування відбувається на першому рядку вводу, а 3 бали - на наступних 3 рядках.

Щасливе кодування!


Оскільки він повинен вміщуватися на двовимірну декартову площину, код повинен бути якомога коротшим.
wizzwizz4

Ви, очевидно, використовуєте неточні результати, які все-таки можуть призвести до неоднозначності, як нам це робити?
недолік

@flawr Просто припустимо, що всі результати точні та неповторні. Ваша програма повинна працювати у випадках з дуже малою кількістю десяткових знаків, не турбуйтеся про неоднозначність. Я прибираю виклик, коли буду вдома.
Денкер

Оскільки прийнята відповідь фактично є просто графічним калькулятором, я зазначу, що в TI-Basic (версія 68k) є 96-байтне рішення. Для уточнення, чи solve(дано три рівняння кола) тривілізує задачу? Я думав, що це так, але якщо ти добре з такими речами, я продовжу його та опублікую.
Фокс

Відповіді:


4

Десмос, 122 байти

Інтернет-використання . Скопіюйте + вставте кожне рівняння у вікно рівняння, натисніть "додати все" для кожного поля, потім натисніть на точку перетину, а потім введіть кожне значення у відповідних випадках. кожен з A, Bі Cє відстані для точок (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

Перевірте перший тестовий випадок .

Або ви можете подивитися тут:

кола!


Це виглядає досить приємно, але чи відповідає це нашим критеріям мов програмування? Це схоже на інструмент для побудови графіків для мене, ніколи його не використовував, тому я можу помилитися.
Денкер

1
@DenkerAffe я раніше задав питання про це мета , і це дійсно рахується.
Conor O'Brien

2
Гаразд, попросіть мою пропозицію :)
Денкер

Я заперечую кількість байтів. Клацніть точку перетину безкоштовно, що не здається правильним.
lirtosiast

@lirtosiast Я б заперечував, що питання завжди є за визначенням та надалі заявляю, що ОП заявила, що така взаємодія нормальна. Якщо ви вважаєте, що має бути певне покарання, я відкритий для пропозицій.
Conor O'Brien

4

C, 362 348 345 байт

Введення задається в вигляді послідовності розділених пробілами плаває на поверхні стандартного введення: 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ніколи не будуть паралельними. Тести полягають у тому, щоб вони також не були вертикальними, оскільки я використовую форму перехоплення нахилу. Таким чином, завжди є точно одна відповідь.
Фокс

2

Пітон - 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.
Денкер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.