Tìm phù hợp nhất gần nhất cho vòng tròn


12

Dưới đây là hình ảnh ví dụ, nếu tôi có một điểm của chấm trắng ở giữa và tôi muốn tìm vị trí gần nhất có thể cho vòng tròn màu xanh (rõ ràng là tại vị trí tôi đã đặt nó) nếu tất cả các vòng tròn màu đỏ đã tồn tại . Làm thế nào tôi có thể tìm thấy vị trí đó?

Hiệu suất đối với tôi không phải là mối quan tâm chính đối với ứng dụng này.

nhập mô tả hình ảnh ở đây


1
tầm quan trọng của vòng tròn màu đen là gì? bạn có thể đặt vòng tròn màu xanh trên nó?
Ewan

2
Vì vậy, để rõ ràng bạn muốn vị trí nơi bạn có thể đặt vòng tròn màu xanh sao cho đó là khoảng cách ngắn nhất có thể từ điểm trắng mà không chồng lấp bất kỳ vòng tròn nào khác?
Robert Harvey


2
Tất cả các vòng tròn sẽ luôn chạm vào một số vòng tròn khác ở ít nhất một nơi?
Robert Harvey

Câu trả lời:


4

Đây không phải là một giải pháp chung, vì có một số tình huống là nó sẽ không cung cấp vị trí của vòng tròn màu xanh với khoảng cách ngắn nhất đến chấm trắng. Ví dụ: nếu bạn có 100 quả bóng màu đỏ được nhóm lại với nhau và chấm trắng nằm cách xa nhóm bóng đỏ này thì không có quả bóng màu đỏ nào có ảnh hưởng ở vị trí của vòng tròn màu xanh chỉ có thể tập trung vào chấm trắng . Nó cũng sẽ không hiển thị tất cả các chi tiết tính toán. Dù sao, đối với một tập hợp con cấu hình, trong đó giải pháp (vòng tròn màu xanh) tiếp xúc với hai vòng tròn màu đỏ sẽ hoạt động như sau:
1) Đặt R là bán kính của vòng tròn màu xanh
2) tạo một vòng lặp trên tất cả các cặp vòng tròn màu đỏ, vâng Tôi biết đây là O (n2).
3) cho mỗi cặp đường tròn i, j có tâm tại (xi, yi) và (xj, yj) với bán kính tương ứng ri và rj, tính bình phương khoảng cách giữa cặp vòng tròn

d_ij^2=(xi-xj)^2+(yi-yj)^2  

4) đặt tất cả các cặp vòng tròn

dij^2<R^2

vào một danh sách.

5) đi qua danh sách, tìm 2 giải pháp của các vòng tròn bán kính R tiếp tuyến với cả hai vòng tròn i và j. Để làm điều này, sử dụng các phương trình cùng với hình ảnh này hai vòng tròn màu xanh kẹo cho một cặp vòng tròn màu đỏ

a = R+ri  
b = R+rj  
c = dij  
α = arccos((b^2+c^2-a^2)/(2bc)  

với thông tin trên bạn có thể tìm thấy (X1ij, Y1ij) và (X2ij, Y2ij) các tâm của 2 đường tròn tiếp tuyến với đường tròn i và j. Đối với mỗi vòng tròn màu xanh ứng cử viên trên tất cả các vòng tròn màu đỏ khác và xem nếu nó không trùng nhau. Nếu họ làm mất nó nếu không kiểm tra khoảng cách đến vòng tròn màu trắng. Nếu bạn giữ một khoảng cách nhỏ hơn, tôi nghĩ bạn sẽ có giải pháp khi bạn hoàn thành việc duyệt qua danh sách các cặp vòng tròn. Thuật toán có vẻ như O (n3).


không hoạt động khi chỉ có một vòng tròn
Ewan

hoặc hai vòng tròn nhưng có một điểm mục tiêu bên ngoài cả hai
Ewan

vấn đề là bạn không thể chắc chắn rằng bạn đã có tất cả các trường hợp cạnh
Ewan

cũng thế. có những giải pháp độc đáo cho những trường hợp đó
Ewan

Bạn cần viết ra tất cả các giả định theo đó giải pháp là đúng hoặc ít nhất là chỉ ra tất cả các trường hợp đường viền. Một số trong số chúng có thể rõ ràng, nhưng một số thì không. Ví dụ, điều này sẽ không hoạt động nếu có thể vẽ một đường phân cách chấm trắng với tất cả các vòng tròn màu đỏ và chấm trắng nhỏ hơn R cách vòng tròn gần nhất.
Vlad

2

Vị trí gần nhất với điểm sẽ nằm trên điểm hoặc chạm vào một vòng tròn.

do đó, trước tiên hãy kiểm tra điểm, sau đó cuộn vòng tròn mới xung quanh cạnh của mỗi vòng tròn hiện có, tính toán khoảng cách từ điểm và nếu bạn chồng chéo khi bạn đi và theo dõi điểm khoảng cách tối thiểu. Dừng lại khi bạn đã đi qua mọi vòng tròn.

I E. kiểm tra tất cả các điểm trên các đường màu xanh lá cây, cộng với vòng tròn màu trắng. trong đó đường màu xanh là một vòng tròn có bán kính màu đỏ cộng với màu xanh

điểm trung tâm có thể

bạn cần kiểm tra toàn bộ đường màu xanh lá cây, không chỉ các giao điểm để bạn bao quát các trường hợp cạnh này.

trường hợp vòng tròn đơn

Rõ ràng kích thước bước của giao dịch của bạn sẽ rất quan trọng về mặt hiệu suất. Nhưng vì hiệu suất của bạn không phải là vấn đề, hãy chọn giá trị tương ứng với độ phân giải của giá trị đầu ra của bạn. tức là nổi, dài?

làm rõ:

đề nghị của tôi là vũ phu tất cả các điểm xung quanh mỗi vòng kiểm tra để trùng lặp với tất cả các vòng tròn khác tại mỗi điểm. không thông minh.

Nếu pic ví dụ biểu thị số lượng vòng tròn và độ phân giải, thì đó không phải là vấn đề đối với máy tính tiêu chuẩn

chúng ta có 20 vòng tròn bán kính trung bình 200 sao cho khoảng 20 * 2 π * 200 điểm * 20 bài kiểm tra giao nhau = 4800000 lần lặp

Ghi chú:

Các cách tiếp cận lặp đi lặp lại như thế này là thiếu sót ở chỗ kích thước bước của bạn, trong trường hợp này là độ phân giải đầu ra của bạn, có thể ảnh hưởng lớn đến kết quả.

Giả sử tôi có hai vòng tròn màu đỏ cách nhau 2 pixel và vòng tròn màu xanh bán kính 1 pixel để ép giữa chúng. Rõ ràng với một trong hai pixel là tâm của vòng tròn màu xanh, nó sẽ chồng lên một trong các màu đỏ. nhưng rõ ràng có chỗ cho vòng tròn nếu tâm nằm giữa hai pixel.

Do đó bình luận của tôi hỏi về độ phân giải của đầu ra. mà bạn nói có thể là bất cứ điều gì.

bạn cũng có thể giải phương trình đồng thời cho mỗi cặp vòng tròn với bán kính tăng theo bán kính của vòng tròn màu xanh.

điều này sẽ cung cấp cho bạn những điểm mà vòng tròn màu xanh sẽ chạm vào cả hai vòng tròn màu đỏ chính xác hơn là lặp lại.

Tuy nhiên. Có một số điều kiện nếu bạn chỉ làm điều này, bạn sẽ nhận được câu trả lời sai hoặc không có. I E.

1 hoặc không có vòng tròn

2 hoặc nhiều vòng tròn nhưng với điểm mục tiêu ở xa và bên ngoài chúng.

nhiều vòng tròn nhưng có điểm đích gần bề mặt


2
Rằng anh ta cần phải lăn mép của vòng tròn màu xanh xung quanh bên ngoài của các vòng tròn khác là phần dễ dàng để tìm ra. Phần khó là tìm ra các phương trình / tính toán để làm điều đó.
Robert Harvey

1
có thật không? nó chỉ (x-x1) ^ 2 + (y-y1) ^ 2 = (r + r1) ^ 2
Ewan

2
Và sau đó bạn phải làm lại tất cả những điều đó khi bạn thử điểm tiếp theo. Tôi biết OP nói rằng hiệu suất không phải là một mối quan tâm, nhưng nó phải hoàn thành trước cái chết nóng của vũ trụ.
Robert Harvey

2
Cách duy nhất để biết liệu bạn có nhận được mười lượt up hay không là đăng mã C # của bạn và xem điều gì sẽ xảy ra.
Robert Harvey

2
Điều tôi nghĩ sẽ xảy ra là OP sẽ viết mã này thành câu trả lời bài tập về nhà của anh ấy và chúng tôi sẽ không bao giờ nghe thấy anh ấy nữa
Ewan

1

Plunk này chứa mã làm việc,

Ý tưởng

Cho các đường tròn là C1, C2 .... Cn

và tọa độ của đường tròn Cn là Cnx, Cny và bán kính là Cr

và bán kính đường tròn yêu cầu là R

nếu vòng tròn màu xanh ở vị trí X, Y và nếu nó không xung đột với bất kỳ vòng tròn nào khác, các phương trình sau là đúng

(C1x - X)^2 + (C1y - Y)^2 > (C1r + R)^2
(C2x - X)^2 + (C2y - Y)^2 > (C2r + R)^2
....
(Cnx - X)^2 + (Cny - Y)^2 > (Cnr + R)^2

thay đổi phương trình đầu tiên,

C1x^2 - 2C1x*X + X^2 + C1y^2 - 2C1y*Y + Y^2 > C1r^2 + 2C1r*R + R^2
X^2 + Y^2 - 2C1x*X - 2C1y*Y > C1r^2 + 2C1r*R + R^2 - C1x^2 - C1y^2

vì vậy phương trình có thể viết lại như,

X^2 + Y^2 - 2C1x*X - 2C1y*Y > C1r^2 + 2C1r*R + R^2 - C1x^2 - C1y^2
X^2 + Y^2 - 2C2x*X - 2C2y*Y > C2r^2 + 2C2r*R + R^2 - C2x^2 - C2y^2
....
X^2 + Y^2 - 2Cnx*X - 2Cny*Y > Cnr^2 + 2Cnr*R + R^2 - Cnx^2 - Cny^2

Thực hiện

bắt đầu từ tọa độ của chấm trắng (Xw, Yw),

    var isValidLocation = function(x,y,r){
       var valid = true;
       for (var i = 0; i< circles.length; i++){
          var circle = circles[i];
          valid = valid && ((x*x + y*y - 2*circle.x*x - 2*circle.y*y) > (circle.radius*circle.radius + 2*circle.radius*r + r*r - circle.x*circle.x - circle.y*circle.y));
       }
       return valid;
      };

      var find = function(Xw,Yw,Rw){
        var radius = 0;
        while(true){
          for (var x=-1 * radius ;x <= radius; x++) {
            for (var y=-1 * radius;y <= radius; y++) {
               if (isValidLocation(Xw + x,Yw + y, Rw)){
                 drawCircle(Xw + x,Yw + y,Rw,"#0000FF");
                 return;
               }
            }   
          } 
          radius++;
        }
     }; 

tọa độ đầu tiên được tìm thấy để thỏa mãn tất cả các phương trình là vị trí của vòng tròn màu xanh


Ai đó có thể vui lòng giải thích những gì sai với phương pháp này?
Chim bồ câu bay thấp

Điều đó thật khó đọc. Sử dụng một số tên hay trừu tượng. Nó sẽ giết bạn để thêm một sơ đồ?
candied_orange

Theo như tôi có thể thấy, phương pháp này cố gắng chỉ tìm các vị trí hợp lệ cho vòng tròn màu xanh, nhưng không phải là vị trí gần nhất có thể. Điều này có thể được sửa, tuy nhiên, cách tiếp cận cũng làm cho giả định (rất có thể không hợp lệ) chỉ có một số hữu hạn các tọa độ giá trị nguyên.
Doc Brown

Nó bắt đầu từ tọa độ của chấm trắng và đi xung quanh nó mở rộng lưới tìm kiếm. Do đó, nó sẽ không phải đối mặt với bất kỳ tình huống nào có số lượng tọa độ vô hạn .. Cuối cùng, nó sẽ tìm thấy tọa độ khớp.
Chim bồ câu bay thấp

1
... Để có một giải pháp chính xác trong tọa độ nguyên, bạn cần sử dụng bán kính tăng dần và biến không gian tìm kiếm của bạn thành một vòng tròn bán kính này quanh điểm trắng. Và mặc dù hiệu quả ghi OP không phải là mối quan tâm của anh ấy, tuy nhiên, sẽ không nên thử nghiệm mọi cặp tọa độ đã được thử nghiệm trong mỗi vòng lặp lặp đi lặp lại.
Doc Brown

0
  • O là điểm mà bạn đang cố gắng để gần gũi
  • P là điểm mà bạn đang tìm kiếm (trung tâm của vòng tròn màu xanh
  • r là bán kính của vòng tròn màu xanh
  • C0 .. Cn là trung tâm của tất cả các vòng tròn giới hạn vị trí của màu xanh trên
  • vòng tròn mở rộng là một trong những vòng tròn có bán kính được mở rộng bởi r

    Có một số công việc phụ nếu O không ở trung tâm vòng tròn. Vì vậy, ngay bây giờ giả sử O == C0

Tính tất cả các giao điểm của tất cả các vòng tròn với C0, bằng cách sử dụng bán kính tương ứng của chúng cộng với r , tức là giao cắt các vòng tròn mở rộng với C0 mở rộng. Nếu không có giao lộ thì điểm bạn đang tìm là bất kỳ nơi nào trên C0, nếu có giao lộ, đối với mỗi giao lộ, hãy kiểm tra xem nó có nằm trong một vòng tròn mở rộng khác không (bạn có thể giới hạn mình trong các vòng tròn có giao điểm với C0). Lấy giao điểm đầu tiên không nằm trong một vòng tròn mở rộng khác như P, có thể có các giao lộ khác.

Nếu không có giao điểm giữa các vòng tròn mở rộng và C0 không nằm trong một vòng tròn mở rộng khác, hãy tính các giao điểm của tất cả các vòng tròn mở rộng với nhau. Sau đó kiểm tra các giao điểm này theo thứ tự khoảng cách đến O, một lần nữa, bất kỳ giao lộ nào nằm trong một vòng tròn mở rộng khác, nếu có loại bỏ, nếu không đó là kết quả của bạn.

Nếu bạn hình dung ra hình ảnh này vẽ một đường bao quanh tất cả các vòng tròn biểu thị vị trí có thể có cho vòng tròn màu xanh của bạn, lấy liên kết của tất cả các vòng tròn mở rộng sẽ chỉ ra khu vực vòng tròn màu xanh của bạn không thể. Điểm mà bạn đang tìm kiếm là điểm gần nhất không nằm trong liên minh đó. Nếu có bất kỳ điểm nào trên C0 không nằm trong liên kết đó là giải pháp, nếu C0 được bao phủ hoàn toàn thì P phải nằm trên giao điểm giữa hai vòng tròn mở rộng khác và nó phải nằm trong khu vực không được bao phủ bởi liên minh này (Tức là không phải trong một vòng tròn mở rộng ).

Đây là O (n ^ 2), có một số cách để cải thiện điều này mặc dù, một lưới có thể được sử dụng để giảm nỗ lực của tìm kiếm khôn ngoan, tôi cũng nghĩ rằng sắp xếp các vòng tròn theo độ gần của chúng với O, (khoảng cách giữa hai vòng tròn giảm bởi đài phát thanh) sẽ giúp giới hạn không gian tìm kiếm cho vùng phủ sóng và tìm kiếm giao lộ


0

Tra cứu giải pháp có thể

  1. Kiểm tra xem điểm trắng là giải pháp của chính nó. Nó bao gồm trường hợp với 0 vòng tròn màu đỏ và trường hợp tầm thường khi các vòng tròn màu đỏ cách xa điểm trắng.
  2. Một vòng tròn màu đỏ.
    1. Điểm trắng là tâm của vòng tròn. Các giải pháp có thể là số lượng điểm vô hạn trên vòng tròn với tâm của nó trong điểm trắng và bán kính là tổng của bán kính vòng tròn màu xanh và đường kính vòng tròn màu đỏ. Hãy gọi nó là vòng tròn màu xanh lá cây .
    2. Điểm trắng là một nơi khác. Chỉ có một giải pháp khả thi trên đường nối điểm trắng và tâm của vòng tròn đỏ, đó là bán kính của vòng tròn màu xanh cách điểm mà đường tròn màu đỏ cắt đường thẳng tới điểm trắng.
  3. Hai hoặc nhiều vòng tròn màu đỏ.
    1. Chúng ta hãy lần lượt lấy các vòng tròn màu đỏ và tìm kiếm giải pháp khả thi cho từng vòng tròn theo điểm 2 (một vòng tròn).
    2. Đối với mỗi cặp vòng tròn màu đỏ, hãy kiểm tra xem bạn có thể vẽ vòng tròn màu xanh chạm vào cả hai vòng tròn màu đỏ không. Tức là nếu khoảng cách giữa tâm của chúng bằng hoặc nhỏ hơn tổng bán kính của chúng cộng với đường kính của vòng tròn màu xanh. Nếu bạn có thể thì bạn có hai (hoặc một nếu các vòng tròn màu đỏ chính xác là một đường kính vòng tròn màu xanh) cách giải quyết có thể .

Tra cứu giải pháp thực tế trong số các giải pháp có thể

Bây giờ bạn có một tập hợp các điểm là giải pháp có thể , lặp qua chúng và kiểm tra từng điểm.

  1. Nếu điểm thực sự là một giải pháp. Không có vòng tròn màu đỏ nào nên có tâm của nó gần hơn bán kính của nó đến điểm này.
  2. Nếu nó gần với điểm trắng hơn giải pháp tìm thấy trước đó.
  3. Nếu bạn có vòng tròn màu xanh lá cây (điểm 2.1)
    • Nếu trong số các điểm riêng lẻ không có giải pháp nào thuộc về vòng tròn xanh thì vòng tròn xanh là câu trả lời.
    • Nếu bạn có các giải pháp riêng lẻ trên vòng tròn màu xanh lá cây và bạn cần bất kỳ giải pháp nào thì chỉ cần thực hiện một trong những giải pháp đó.
    • Nếu bạn có các giải pháp riêng lẻ trên vòng tròn màu xanh lá cây và bạn cần tất cả số lượng giải pháp không giới hạn thì bạn cần giải quyết một vấn đề khác. Bạn cần cắt từ vòng tròn màu xanh lá cây tất cả các cung được xác định bởi cặp giải pháp riêng lẻ từ mỗi vòng tròn màu đỏ.

NB: Tôi không nói rằng việc thực hiện thuật toán nên được mô tả chính xác. Bạn có thể cố gắng cải thiện hiệu suất bằng cách sử dụng lập trình động hoặc bỏ qua các giải pháp có thể, trong đó rõ ràng là chúng sẽ không hoạt động.

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.