2016-10-29 2 views
0

기본 원과 특정 거리를두고 임의의 위치에 원을 생성하고 싶습니다. 원이 서로 교차해서는 안됩니다. 다른 모든 원과 교차하지 않는 경우 각 원을 확인하는 메소드를 만들었습니다. (158,290)를JavaScript에서 재귀를 사용하는 충돌 감지 원

if (collision > 0) { 
    console.log("GENERATE NEW RANDOM COORDINATE") 
    generateRandomCoordinate(d, r) 
} 

결과가

당신이 출력에서 ​​볼 수 있듯이, 내 응용 프로그램은 새로운 좌표 를 생성 충돌 감지는 일을하지만, 내 코드의 재귀 부분은 작동하지 않습니다 충돌을 감지하면 (138,272). 그러나 여전히 (138,272)에 개의 서클을 그립니다.

왜 이런 일이 발생하는지 알고 싶습니다.

generateRandomCoordinate 기능

function generateRandomCoordinate(d, r) { 
    var phi = Math.random() * 2 * Math.PI 
    var x = topicCoordinates[0].x + Math.round(d * Math.cos(phi)) 
    var y = topicCoordinates[0].y + Math.round(d * Math.sin(phi)) 
    var collision = 0 
    for (var j = 0; j < topicCoordinates.length; j++) { 
     var dx = x - topicCoordinates[j].x 
     var dy = y - topicCoordinates[j].y 
     var distance = Math.sqrt(dx * dx + dy * dy) 

     if (distance < r + topicCoordinates[j].r) { 
      collision++ 
      console.log("COLLISION DETECTED BETWEEN POINT(" + "x: " + x + ", y: " + y + ") AND POINT(x1: " + topicCoordinates[j].x + ", y1: " + topicCoordinates[j].y + ")") 
     } 
    } 
    if (collision > 0) { 
     console.log("GENERATE NEW RANDOM COORDINATE") 
     generateRandomCoordinate(d, r) 
    } 

    var topicCoordinate = { 
     "x": x, 
     "y": y, 
     "r": r 
    } 
    return topicCoordinate 
} 

는 generateRandomCoordinate 기능

var randomCoordinate = generateRandomCoordinate(d, r) 
x = randomCoordinate.x 
y = randomCoordinate.y 
r = randomCoordinate.r 
} 

console.log("ADDED POINT(x: " + x + ", y: " + y + ", r: " + r + ")") 
var topicCoordinate = { 
    "x": x, 
    "y": y, 
    "r": r 
} 
topicCoordinates.push(topicCoordinate) 
drawCircle(x, y, r) 

출력

에게 호출 ... 좀 더 효율적인 방법을 알고 있다면 알려 주시기 바랍니다

UPDATE 작업 코드

function generateRandomCoordinate(d, r) { 
    var collision = true 
    while (collision) { 
     collision = false 
     var phi = Math.random() * 2 * Math.PI 
     var x = topicCoordinates[0].x + Math.round(d * Math.cos(phi)) 
     var y = topicCoordinates[0].y + Math.round(d * Math.sin(phi)) 
     for (var j = 0; j < topicCoordinates.length; j++) { 
      var dx = x - topicCoordinates[j].x 
      var dy = y - topicCoordinates[j].y 
      var distance = Math.sqrt(dx * dx + dy * dy) 

      if (distance < r + topicCoordinates[j].r) { 
       collision = true 
       console.log("COLLISION DETECTED BETWEEN POINT(" + "x: " + x + ", y: " + y + ") AND POINT(x1: " + topicCoordinates[j].x + ", y1: " + topicCoordinates[j].y + ")") 
      } 
     } 
    } 

    var topicCoordinate = { "x" : x, "y" : y, "r" : r } 
    return topicCoordinate 
} 

답변

1

재귀 함수 호출 필요가 없습니다. 그래서 외부 기능은 내부 X에 대해 알고하지 않습니다 변수의 자신의 내부 복사본을 포함하는 모든 재귀 호출 레벨 기능 인스턴스에 대한 y로 - - 은 그냥 재귀 혼란에 관하여 (의사)

repeat 
    iscollision = false 
    generate x,y 
    for other circles check 
     if collision occurs 
      iscollision = true 
      break //no need to check later circles  
until iscollision = false 

주기를 구성 당신은하지 않습니다 이 코드 조각으로 반환하십시오.

if (collision > 0) { 
    vvvvvvvvvvvvvvvvvv 
    generateRandomCoordinate(d, r) 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
} 
+0

충돌이 발생한 경우 어디에서 새 좌표를 다시 생성해야합니까? 내 목표는 내가 찾을 때까지 새로운 "collisionless"좌표를 찾는 것입니다 ... – Engo

+0

내가 쓴대로 - '반복주기'시작 부분에. 생활 비유 - 바구니에 공을 던져. 놓친 경우 다시 시도하십시오. – MBo