Trilaterate vị trí của bạn


11

Giới thiệu

Hãy tưởng tượng bạn đang ở trên một mặt phẳng cartesian hai chiều và muốn xác định vị trí của bạn trên nó. Bạn biết 3 điểm trên mặt phẳng đó và khoảng cách của bạn với mỗi người trong số họ. Mặc dù luôn có thể tính toán vị trí của bạn từ đó, nhưng làm điều đó trong đầu của bạn là khá khó khăn. Vì vậy, bạn quyết định viết một chương trình cho điều đó.

Các thách thức

Cho 3 điểm và khoảng cách của bạn với họ, xuất ra các điểm chính của vị trí của bạn.

  • Đầu vào và đầu ra có thể ở bất kỳ định dạng thuận tiện, bao gồm sử dụng số phức thay vì số thực. Hãy làm rõ trong câu trả lời của bạn mà bạn sử dụng định dạng.
  • Bạn sẽ luôn nhận được chính xác 3 điểm khác biệt với khoảng cách của họ với bạn.
  • Các tọa độ và khoảng cách sẽ được thả nổi với độ chính xác tùy ý. Đầu ra của bạn phải chính xác đến 3 chữ số thập phân. Làm tròn là tùy thuộc vào bạn. Hãy làm rõ trong câu trả lời của bạn.
  • Bạn có thể cho rằng ba điểm không thẳng hàng, vì vậy sẽ luôn có một giải pháp duy nhất.
  • Bạn không được phép bruteforce giải pháp.
  • Bạn không được sử dụng bất kỳ nội dung nào tầm thường hóa vấn đề cụ thể này. Nội dung cho các chỉ tiêu vector, vv được cho phép mặc dù.

Gợi ý để bắt đầu:

Hãy nghĩ về một vòng tròn xung quanh mỗi 3 điểm đó với khoảng cách của chúng với bạn là bán kính.

Quy tắc

Các trường hợp thử nghiệm

Định dạng đầu vào cho một điểm ở đây là [[x,y],d]với xylà tọa độ và dlà khoảng cách đến thời điểm này. 3 trong số những điểm đó được sắp xếp trong một danh sách. Đầu ra sẽ xvà sau đó ytrong một danh sách.

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

Bạn có thể tạo các trường hợp thử nghiệm bổ sung với chương trình Pyth này . Vị trí đi trên dòng đầu tiên của đầu vào và 3 điểm nằm trên 3 dòng sau.

Chúc mừng mã hóa!


Bởi vì nó cần phải vừa với mặt phẳng Cartesian hai chiều, mã cần phải càng ngắn càng tốt.
wizzwizz4 20/03/2016

Rõ ràng là bạn đang sử dụng kết quả không chính xác mà vẫn có thể dẫn đến sự mơ hồ, chúng ta nên xử lý việc này như thế nào?
flawr 20/03/2016

@flawr Chỉ cần giả sử rằng tất cả các kết quả là chính xác duy nhất. Chương trình của bạn nên hoạt động cho các trường hợp có rất ít số thập phân, đừng lo lắng về sự mơ hồ. Tôi sẽ dọn dẹp thử thách khi tôi về nhà.
Denker

Vì câu trả lời được chấp nhận thực sự chỉ là một máy tính vẽ đồ thị, tôi sẽ đề cập rằng có một giải pháp 96 byte trong TI-Basic (phiên bản 68k). Để làm rõ, là solve(đưa ra ba phương trình vòng tròn) tầm thường hóa vấn đề? Tôi nghĩ là vậy, nhưng nếu bạn ổn với những thứ như vậy tôi sẽ tiếp tục và đăng nó.
Fox

Câu trả lời:


4

Desmos, 122 byte

Sử dụng trực tuyến . Sao chép + dán từng phương trình vào một hộp phương trình, nhấp vào "thêm tất cả" cho mỗi hộp, sau đó nhấp vào điểm giao nhau, sau đó nhập từng giá trị cho phù hợp. mỗi người trong số A, BClà những khoảng cách cho điểm (a,b), (c,d)(E,f), tương ứng. Để lấy căn bậc hai trong giá trị, hãy nhập sqrtgiá trị vào ô.

\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

Xác nhận trường hợp thử nghiệm đầu tiên .

Hoặc bạn có thể xem tại đây:

vòng tròn!


Điều này có vẻ khá đẹp, nhưng điều này có đáp ứng các tiêu chí của chúng tôi về ngôn ngữ lập trình không? Điều này trông giống như một công cụ âm mưu đối với tôi, không bao giờ sử dụng nó tho, vì vậy tôi có thể sai.
Denker


2
Được rồi, có upvote của tôi sau đó :)
Denker

Tôi tranh chấp số byte. Bạn được nhấp vào điểm giao cắt miễn phí, điều này có vẻ không đúng.
lirtosiast

@lirtosiast Tôi sẽ lập luận rằng vấn đề luôn luôn tồn tại theo định nghĩa và tuyên bố thêm rằng OP nói rằng loại tương tác này là ổn. Tuy nhiên, nếu bạn tin rằng sẽ có một số hình phạt, tôi sẽ mở để đề xuất.
Conor O'Brien

4

C, 362 348 345 byte

Đầu vào được đưa ra dưới dạng một chuỗi các float được phân tách bằng dấu cách trên stdin : x1 y1 d1 x2 y2 d2 x3 y3 d3. Đầu ra tương tự trên thiết bị xuất chuẩn : 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);}

Clà một loại cấu trúc có các thành viên là tọa độ x, tọa độ ay bvà khoảng cách (bán kính) c. Hàm fnày đưa hai Ccấu trúc và một con trỏ tới một float và xác định đường mà tại đó C(các vòng tròn) giao nhau. Chặn y của đường này được đặt vào phao nhọn, và độ dốc được trả về.

Chương trình gọi fhai cặp vòng tròn, sau đó xác định giao điểm của các đường được sản xuất.


Vì chúng tôi đã làm rõ rằng các đầu vào không phải là cộng tuyến, các dòng ftạo ra sẽ không bao giờ song song. Các thử nghiệm là để đảm bảo chúng cũng không thẳng đứng, vì tôi đang sử dụng hình thức chặn dốc. Bằng cách này, luôn luôn có một câu trả lời chính xác.
Fox

2

Con trăn - 172

Lấy đầu vào dưới dạng danh sách các bộ dữ liệu có dạng (x, y, d). Hãy cho tôi biết nếu bạn thấy một cách để chơi gôn hơn nữa, tôi cảm thấy như phải có nhưng tôi không thể tìm ra nó!

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

Bạn có thể bỏ qua một số khoảng trắng ở đây. Một cái gì đó như -1 if 1 else 1có thể trở thành -1if 1else 1ví dụ. Điều này cũng hoạt động với ngoặc. Có một vài nơi mà bạn có thể tận dụng lợi thế đó. Cũng .5giống như 0.5.
Denker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.