Pozisyonunuzu trilaterate


11

Giriş

İki boyutlu kartezyen bir düzlemde olduğunuzu ve üzerindeki konumunuzu belirlemek istediğinizi düşünün. O uçakta 3 nokta ve her birine olan uzaklığınızı biliyorsunuz. Konumunuzu hesaplamak her zaman mümkün olsa da, bunu kafanızda yapmak oldukça zordur. Bunun için bir program yazmaya karar verdiniz.

Meydan okuma

3 puan ve bunlara olan uzaklığınız göz önüne alındığında, konumunuzun kordinatlarını çıkarın.

  • Giriş ve çıkış, gerçek sayılar yerine karmaşık kullanım da dahil olmak üzere herhangi bir uygun formatta olabilir. Lütfen cevabınızı hangi formatta kullandığınızı açıklığa kavuşturun.
  • Size olan mesafeleriyle her zaman tam olarak 3 farklı nokta elde edersiniz.
  • Koordinatlar ve mesafeler keyfi bir hassasiyetle yüzer. Çıktınız 3 ondalık basamağa kadar doğru olmalıdır. Yuvarlama size kalmış. Lütfen cevabınızda açıklayınız.
  • Üç noktanın eşdoğrusal olmadığını varsayabilirsiniz, bu nedenle her zaman benzersiz bir çözüm olacaktır.
  • Çözümü kaba kuvvetlendirmenize izin verilmiyor.
  • Bu sorunu önemsizleştiren herhangi bir yerleşik kullanamazsınız. Yine de vektör normları vb. İçin yapılara izin verilir.

Başlamak için ipucu:

Bu 3 noktanın her birinin çevresinde, yarıçapı size olan mesafeleri olan bir daire düşünün.

kurallar

Test senaryoları

Bir noktada için giriş biçimi burada [[x,y],d]ile xve ykoordinatları olan ve dbu noktaya mesafedir. Bu noktalardan 3 tanesi bir listede düzenlenmiştir. Çıktı, daha xsonra ybir listede olacaktır.

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

Bu Pyth programıyla ek test senaryoları oluşturabilirsiniz . Konum girişin ilk satırına gider ve 3 nokta aşağıdaki 3 satırdadır.

Mutlu Kodlama!


İki boyutlu Kartezyen bir düzleme sığması gerektiğinden, kodun mümkün olduğunca kısa olması gerekir.
wizzwizz4

Açıkçası belirsizliğe yol açabilecek kesin olmayan sonuçlar kullanıyorsunuz, bunu nasıl ele almalıyız?
Kusur

@flawr Tüm sonuçların kesin ve benzersiz olduğunu varsayalım. Programınız çok az ondalık basamağı olan durumlarda çalışmalıdır, belirsizlik hakkında endişelenmeyin. Evdeyken meydan okumayı temizleyeceğim.
Denker

Kabul edilen cevap etkili bir şekilde bir grafik hesap makinesi olduğundan, TI-Basic'te (68k versiyon) 96 baytlık bir çözüm olduğunu söyleyeceğim. Açıklığa kavuşturmak için, solve(üç daire denklemi verilir) sorunu önemsizleştiriyor mu? Öyle olduğunu düşündüm, ama eğer böyle şeylerle iyiysen, devam edip postalayacağım.
Fox

Yanıtlar:


4

Desmos, 122 bayt

Çevrimiçi kullanım . Her denklemi bir denklem kutusuna kopyalayın + yapıştırın, her kutu için "tümünü ekle" yi tıklayın, ardından kavşak noktasına tıklayın, ardından her değeri uygun şekilde girin. her biri A, Bve Cpuan için mesafeler (a,b), (c,d)ve (E,f)sırasıyla. Değere bir kare kök almak için sqrt, kutuya değeri yazın .

\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

İlk test durumunu doğrulayın .

Veya buraya bir göz atabilirsiniz:

çevreler!


Bu oldukça hoş görünüyor, ama bu programlama dilleri için kriterlerimizi karşılıyor mu? Bu benim için bir çizim aracı gibi görünüyor, tho asla kullanmadım, bu yüzden yanlış olabilirim.
Denker

1
@DenkerAffe Daha önce meta ile ilgili bir soru sordum ve gerçekten önemli.
Conor O'Brien

2
Pekala, :) sonra benim upvote var
Denker

Bayt sayısına itiraz ediyorum. Doğru görünmeyen kavşak noktasına ücretsiz tıklarsınız.
lirtosiast

@lirtosiast Noktanın her zaman tanım gereği orada olduğunu ve OP'nin bu tür etkileşimin iyi olduğunu söylediğini ileri süreceğim. Bununla birlikte, bir ceza olması gerektiğine inanıyorsanız, önerilere açığım.
Conor O'Brien

4

Cı, 362 348 345 bayt

Girdi stdin: 'de boşlukla ayrılmış float dizisi olarak verilir x1 y1 d1 x2 y2 d2 x3 y3 d3. Çıktı stdout'ta benzer: 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üyeleri bir x koordinatı a, bir y koordinatı bve bir mesafe (yarıçap) olan bir yapı türüdür c. İşlevfC bir kayan Cnoktaya iki yapı ve bir işaretçi alır ve (dairelerin) kesiştiği çizgiyi belirler . Bu çizginin y kesmesi sivri uçlu şamandıraya yerleştirilir ve eğim döndürülür.

Program fiki çift çemberi çağırır , daha sonra üretilen çizgilerin kesişimini belirler.


Girdilerin birbirine yakın olmadığını açıkladığımızdan, üretilen çizgiler fasla paralel olmayacaktır. Testler, eğim-kesme noktası formu kullandığım için dikey olmadıklarından emin olmak içindir. Bu şekilde, her zaman tam olarak bir cevap vardır.
Fox

2

Python - 172

Girişi form tuples (x, y, d) listesi olarak alır. Bunu daha da golf oynamak için bir yol görürseniz bana bildirin, olması gerektiği gibi hissediyorum ama anlayamıyorum!

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

Burada bazı boşlukları atlayabilirsiniz. Örneğin böyle bir şey -1 if 1 else 1olabilir -1if 1else 1. Bu aynı zamanda parantez ile de çalışır. Bundan yararlanabileceğiniz birkaç yer vardır. Ayrıca .5aynı 0.5.
Denker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.