2014-12-16 2 views
0

저는 현재 진행중인 컨설팅 프로젝트에 대한 막판 요청과 함께 엄청나게 바쁩니다.두 개의 원이 겹치는 부분 얻기

나는 무작위 크기의 원의 시리즈를 그리는 서피스 뷰 SurfaceView가 : 기본적으로 여기

내가 달성하기 위해 노력하고 있습니다 것입니다. 각 원은 50-100의 반경을 가질 수 있습니다.

는 x는 y 값 임의로 랜덤 반경

각 원은 그 원 (X, Y COORD 년대 및 반경)를 나타내는 오브젝트로 생성하고이리스트에 추가와 함께 생성된다.

일단 모두 만들어지면 그려집니다.

문제는이 서클 중 어느 것도 겹치지 않도록하려는 것입니다.

나는 조금 어려움을 겪고 있습니다. 이것은 어려운 일이 아니었지만 불행히도 나를위한 것입니다.

x = 100 + (int) (Math.random() * (mCanvasWidth - 200)); 
    y = 100 + (int) (Math.random() * (mCanvasHeight - 200)); 
    radius = 50 + (int) (Math.random() * 99); 
    color[0] = (float) (Math.random() * 360); 
    color[1] = 1; 
    color[2] = 1; 

    String radVal = String.valueOf(radius); 

    circle circ = new circle(x, y, radius, Color.HSVToColor(128, color), radVal); 

    boolean addit = true; 



    for (dot d : Dots) { 
     int leftSide = d.get_x() - radius; 
     int rightSide = d.get_x() + radius; 

     int xBoundary = x + radius; 
     int yBoundary = y + radius; 

     int exist_xLeft = d.get_x() - d.get_radius(); 
     int exist_xRight = d.get_x() + d.get_radius(); 
     int exist_yTop = d.get_y() - d.get_radius(); 
     int exist_yBottom = d.get_y() + d.get_radius(); 

     if ((xBoundary > exist_xLeft) && (xBoundary < exist_xRight)) 
     { 
      if (yBoundary > (exist_yTop) && (yBoundary < exist_yBottom)) { 
       addit = false; 
       break; 
      } 
     } 
    } 

    if (addit) 
     circles.add(mdot); 

    if (circles.size() >= 5) 
     running = false; 

이 그 다음은 원 목록을 반복 처리 캔버스를 그립니다

다음은 지금까지 (내가 친절 ... 그것은 가까이하지 알고) 내 코드입니다.

어디에서 충돌 감지에 실패했는지에 대한 제안 사항이 있습니까?

+0

이 대답은 내가 필요로 무엇을 준 : http://stackoverflow.com/questions/306316/determine-if-two-rectangles-overlap-each- 기타 – tronious

+0

@markE 더 설명해 주시겠습니까? 나는 다음의 값을 가정하여 표현식을 테스트하려고 시도했다 :'cx1 = 0; cy1 = 0; r1 = 5; cx2 = 9; cy2 = 0; r2 = 5;'. 이 경우 원이 충돌하지 않습니까? –

+0

@markE - 귀하의 제안에 감사드립니다. 난 당신의 솔루션을 시도하고 그것은 작동하지 않습니다. 나는 아직도 중첩을 경험한다 ... 사소한 중첩에도 불구하고 ... 여전히 중첩이있다. – tronious

답변

0

2 원은 다음과 같이 충돌하는 경우 감지 할 수 있습니다 감안할 때

:

  • centerpoints의 CX1, CY1 & CX2, CY2

  • 주어진 반경 R1 & R2,

그런 다음 NE 2 원이 충돌하는 경우 :

areColliding=((cx2-cx1)*(cx2-cx1)+(cy2-cy1)*(cy2-cy1))<((r1+r2)*(r1+r2)); 
+0

일반 영어의 표현은 "두 중심점 사이의 거리가 반경의 합보다 작은 경우 원이 충돌합니다."라는 의미입니다. –

관련 문제