서클에 가장 가까운 최적 값 찾기


12

아래는 이미지의 예입니다. 중간에 흰색 점이 있고 모든 빨간색 원이 이미 존재하는 경우 파란색 원에 대해 가장 가까운 위치를 찾고 싶습니다 (명확한 위치에 있음). . 그 위치를 어떻게 찾을 수 있습니까?

나를위한 성능은이 응용 프로그램의 주요 관심사가 아닙니다.

여기에 이미지 설명을 입력하십시오


1
검은 색 원의 의미는 무엇입니까? 파란색 원을 그 위에 놓을 수 있습니까?
Ewan

2
따라서 파란색 원을 다른 원과 겹치지 않고 흰색 점에서 가능한 가장 짧은 거리가되도록 파란색 원을 배치 할 수있는 위치를 원하십니까?
Robert Harvey


2
모든 서클은 항상 최소한 한 곳에서 다른 서클과 접촉합니까?
Robert Harvey

답변:


4

파란색 원의 위치에 흰색 점까지의 최단 거리를 제공하지 않는 경우가 많았 기 때문에 일반적인 해결책은 아닙니다. 예를 들어, 100 개의 빨간 공이 함께 그룹화되어 있고 흰색 점이이 빨간 공 그룹에서 멀리 떨어져 있으면, 빨간 공 중 어느 것도 파란 점의 위치에 영향을 미치지 않을 것입니다. . 모든 계산 세부 사항도 표시하지 않습니다. 어쨌든 솔루션 (파란색 원)이 두 개의 빨간색 원에 접하는 구성의 하위 집합의 경우 다음이 작동해야합니다
.1) R이 파란색 원의 반경이되게하십시오
.2) 모든 빨간색 원 쌍을 반복합니다. 나는 이것이 O (n2)라는 것을 알고 있습니다.
3) 각각의 반경 ri 및 rj를 갖는 (xi, yi) 및 (xj, yj)에 중심을 갖는 각 원 쌍 i, j에 대해, 원 쌍 사이의 거리의 제곱을 계산

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

4) 모든 원을

dij^2<R^2

목록으로.

5)리스트를 순회하면서 i와 j 서클에 반지름 R 탄젠트의 2 개 솔루션을 찾습니다. 이렇게하려면이 방정식을이 이미지와 함께 사용하십시오 한 쌍의 빨간색 원에 대한 두 개의 파란색 원 후보

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

위의 정보를 통해 i 및 j 원에 접하는 두 원의 중심 (X1ij, Y1ij) 및 (X2ij, Y2ij)를 찾을 수 있습니다. 각 후보 파란색 원에 대해 다른 모든 빨간색 원을 반복하고 겹치지 않는지 확인하십시오. 그들이 흰색 원까지의 거리를 확인하지 않으면 그것을 폐기하는 경우. 더 작은 거리를 유지하면 원 쌍 목록을 순회 할 때 해결책이 있다고 생각합니다. 알고리즘은 O (n3)처럼 보입니다.


서클이 하나 뿐인 경우 작동하지 않습니다
Ewan

또는 두 개의 원이지만 둘 다 외부에 목표점이 있음
Ewan

문제는 당신이 당신이 가지고있는 모든 에지의 경우 캔트이다
이완

또한. 이러한 경우에 대한 고유 한 솔루션이 있습니다
Ewan

솔루션이 올바르거나 최소한 모든 경계 사례를 지적하는 모든 가정을 기록해야합니다. 그들 중 일부는 분명 할 수 있지만, 그렇지 않은 것도 있습니다. 예를 들어 흰색 점을 모든 빨간색 원에서 분리하고 흰색 점이 가장 가까운 원에서 R보다 작은 선을 그릴 수 있으면 작동하지 않습니다.
Vlad

2

점에 가장 가까운 배치는 점 위에 있거나 원을 터치합니다.

따라서 먼저 점을 확인한 다음 기존의 각 원의 가장자리 주위에 새 원을 굴려 점에서 거리를 계산하고 갈 때 겹치는 경우 최소 거리 지점을 추적하십시오. 모든 원을 통과했을 때 중지하십시오.

즉. 녹색 선의 모든 점과 흰색 원을 확인하십시오. 녹색 선은 빨간색과 파란색의 반지름을 가진 원입니다.

가능한 중심점

이러한 모서리를 덮을 수 있도록 교차점뿐만 아니라 녹색 선 전체를 확인해야합니다.

단일 원 케이스

분명히 순회의 단계 크기는 성능 측면에서 중요합니다. 그러나 성능이 문제가되지 않음을 나타내므로 출력 값의 해상도에 해당하는 값을 선택하십시오. 즉 플로트, 긴?

설명:

내 제안은 원 주위의 모든 지점 을 각 지점의 다른 모든 원 과 겹치도록 테스트하는 것입니다 . 영리하지 않습니다.

그림의 예가 원의 수와 해상도를 나타내는 경우 표준 PC에서는 문제가되지 않습니다.

약 20 * 2 π * 200 포인트 * 20 교차 테스트 = 4800000 반복을 위해 평균 반경 200의 20 개의 원이 있습니다.

노트 :

이와 같은 반복적 인 접근 방식은 스텝 크기,이 경우 출력 해상도가 결과에 크게 영향을 줄 수 있다는 점에서 결함이 있습니다.

두 개의 빨간색 원이 2 픽셀 떨어져 있고 1 픽셀 반경의 파란색 원이 그 사이를 쥐고 있다고 가정 해보십시오. 파란색 원의 중심으로 두 픽셀 중 하나를 분명히 사용하면 빨간색 중 하나와 겹칩니다. 그러나 중심이 두 픽셀 사이에 있다면 원을위한 공간이 있습니다.

따라서 출력의 해상도에 대해 묻는 내 의견. 당신이 말한 것은 무엇이든 될 수 있습니다.

파란색 원의 반지름만큼 반지름이 증가한 각 원 쌍에 대한 연립 방정식을 풀 수도 있습니다.

이렇게하면 파란색 원이 반복보다 두 개의 빨간색 원에 더 정확하게 닿는 지점이 생깁니다.

하나. 이 작업 만 수행하면 잘못되거나 응답이없는 몇 가지 조건이 있습니다. 즉.

1 개 또는 서클 없음

2 개 이상의 원이지만 목표 지점이 멀리 있고 바깥에 있습니다.

많은 원이지만 목표 지점이 표면에 가깝습니다.


2
그가 다른 원의 바깥쪽으로 파란색 원의 가장자리를 굴려야한다는 것은 알아 내기 쉬운 부분입니다. 어려운 부분은 방정식 / 계산을 계산하는 것입니다.
Robert Harvey

1
정말? 그것의 단지 (x-x1) ^ 2 + (y-y1) ^ 2 = (r + r1) ^ 2
Ewan

2
그리고 다음 지점을 다시 시도 할 때 모든 작업을 다시 수행해야합니다. 나는 OP가 성과는 문제가 아니라고 말했지만 우주의 더위가 죽기 전에 완료되어야한다.
Robert Harvey

2
10 개의 공감대를받을 수 있는지 여부를 알 수있는 유일한 방법은 C # 코드를 게시하고 어떻게되는지 확인하는 것입니다.
Robert Harvey

2
내가 일어날 것이라고 생각하는 것은 OP가 그의 숙제에 대한 답변으로 이것을 코딩하고 우리는 다시는 그로부터 소식을 듣지 않을 것입니다
Ewan

1

이 plunk 에는 작업 코드가 포함되어 있습니다.

개념

주어진 원은 C1, C2 .... Cn

원 Cn의 좌표는 Cnx, Cny, 반지름은 Cr

필요한 원의 반지름은 R

파란색 원이 X, Y 위치에 있고 다른 원과 충돌하지 않으면 다음 방정식이 참입니다.

(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

첫 번째 방정식을 바꾸고

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

방정식을 다음과 같이 다시 쓸 수 있습니다.

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

이행

흰색 점 (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++;
        }
     }; 

모든 방정식을 만족시키는 첫 번째 좌표는 파란색 원의 위치입니다.


누군가이 접근 방식의 문제점을 설명해 주시겠습니까?
Low Flying Pelican

읽기 어렵습니다. 좋은 이름과 추상화를 사용하십시오. 다이어그램을 추가하면 죽일까요?
candied_orange

내가 볼 수있는 한,이 방법은 파란색 원에 유효한 위치 만 찾으려고하지만 가능한 가장 가까운 위치는 찾지 않습니다. 이 문제는 해결 될 수 있지만이 방법은 유한 수의 정수 값 좌표 만 있다고 가정합니다.
Doc Brown

흰색 점의 좌표에서 시작하여 검색 그리드를 확장합니다. 그것 때문에 무한한 수의 좌표가있는 상황에 직면하지 않을 것입니다. 결국 일치하는 좌표를 찾을 수 있습니다.
Low Flying Pelican

1
... 정수 좌표의 올바른 솔루션을 얻으려면 증가하는 반경을 사용하고 검색 공간을 흰색 점 주위 의이 반경의 원으로 만들어야합니다. OP가 쓴 효율성은 그의 관심사가 아니지만 그럼에도 불구하고 모든 루프에서 이미 테스트 된 모든 좌표 쌍을 반복해서 테스트하지 않는 것이 좋습니다.
Doc Brown

0
  • O 당신이 가까이하려고하는 포인트
  • P 는 당신이 찾고있는 지점입니다 (파란색 원의 중심
  • r 은 파란색 원의 반지름
  • C0 .. Cn 은 파란색의 배치를 제한하는 모든 원의 중심입니다
  • 확장 원 은 반지름이 r로 확장 된 원 중 하나입니다.

    O 가 원 중심이 아닌 경우 추가 작업이 있습니다. 이제 O == C0이라고 가정하십시오.

각각의 반지름과 r 을 사용하여 C0과 모든 원의 모든 교집합 을 계산합니다. 즉, 확장 원과 확장 C0이 교차합니다. 교차점이없는 경우 찾고있는 점은 C0의 아무 곳에 나 있고, 교차점이있는 경우 각 교차점에 대해 다른 확장 된 원 안에 있는지 확인합니다 (C0과 교차 한 원으로 제한 할 수 있음). 다른 확장 원이 아닌 첫 번째 교차로를 P로 가져 가십시오. 다른 교차점이있을 수 있습니다.

확장 된 원과 C0 사이에 다른 확장 된 원 안에 있지 않은 교차점이없는 경우 모든 확장 된 원이 서로 교차하는 지점을 계산하십시오. 그런 다음 O까지의 거리 순서대로 이러한 교차점을 확인하십시오. 다시 교차점 중 하나라도 다른 확장 원 안에 있는지 여부를 확인하십시오.

당신이 이것을 상상한다면, 모든 원 주위에 파란색 원의 가능한 위치를 나타내는 선을 그리는 것을 상상해보십시오. 모든 확장 원을 합치면 파란색 원이 될 수없는 영역을 나타냅니다 . 당신이 찾고있는 지점은 그 노동 조합에없는 가장 가까운 지점입니다. C0에 솔루션이 아닌 합집합에없는 점이 있으면 C0이 완전히 덮힌 경우 P는 두 개의 다른 확장 원 사이의 교차점에 있어야하며 덮지 않은 영역에 있어야합니다. 이 조합 (즉 , 확장 된 원이 아님).

이것은 O (n ^ 2)입니다.이를 향상시킬 수있는 몇 가지 방법이 있습니다 . 그리드 쌍을 사용하여 현명한 검색의 노력을 줄일 수 있습니다. 또한 O와의 근접성에 따라 원을 정렬한다고 생각합니다. 두 개의 원은 라디오로 줄어 듭니다) 적용 범위 및 교차로 검색을위한 검색 공간을 제한하는 데 도움이됩니다.


0

가능한 솔루션 조회

  1. 흰색 점 자체가 해결책인지 확인하십시오. 빨간색 원이 0 인 경우와 빨간색 원이 흰색 점에서 먼 경우 사소한 경우를 포함합니다.
  2. 하나의 빨간색 원.
    1. 흰색 점은 원의 중심입니다. 가능한 해결책 은 원의 중심이 흰색 점과 반지름이 파란색 원 반지름과 빨간색 원 지름의 합인 원의 무한 점 수입니다. 녹색 원 이라고하겠습니다 .
    2. 화이트 포인트는 다른 곳에 있습니다. 선에 흰색 점과 빨간색 원의 중심을 연결하는 가능한 솔루션 은 하나뿐입니다 . 빨간색 원이 선을지나 흰색 점을 향하는 지점에서 파란색 원의 반지름입니다.
  3. 두 개 이상의 빨간색 원.
    1. 빨간 원을 하나씩 가져 가서 점 2 (원 하나)에 따라 각각에 대해 가능한 해결책 을 찾으십시오 .
    2. 빨간색 원의 각 쌍에 대해 빨간색 원을 모두 만지는 파란색 원을 그릴 수 있는지 확인합시다. 즉, 중심 간의 거리가 반경과 파란색 원의 지름의 합보다 작거나 같은 경우. 가능한 경우 두 가지 (또는 빨간색 원이 정확히 하나의 파란색 원 직경 인 경우 하나) 가능한 해결책이 있습니다.

가능한 솔루션 중 실제 솔루션 조회

이제 가능한 해결책 이되는 일련의 포인트가 있으며 ,이를 통해 반복하고 각각을 확인하십시오.

  1. 요점이 실제로 해결책이라면. 빨간색 원의 중심이이 점의 반지름보다 가까워서는 안됩니다.
  2. 이전에 찾은 솔루션보다 백색 점에 더 가까운 경우.
  3. 당신이있는 경우 녹색 원 (포인트 2.1)
    • 개별 포인트 중 녹색 원에 속하는 솔루션이 없으면 녹색 원이 답입니다.
    • 녹색 원에 개별 솔루션이 있고 솔루션이 필요한 경우 그 중 하나만 선택하십시오.
    • 녹색 원에 개별 솔루션이 있고 무제한의 솔루션이 모두 필요한 경우 다른 문제를 해결해야합니다. 녹색 원에서 각 빨간색 원의 개별 솔루션 쌍으로 정의 된 모든 호를 잘라 내야합니다.

NB : 알고리즘의 구현이 정확하게 기술되어야한다고 말하는 것이 아닙니다. 동적 프로그래밍을 사용하거나 작동하지 않는 것이 확실한 솔루션을 건너 뛰어 성능을 향상시킬 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.