기본 원과 특정 거리를두고 임의의 위치에 원을 생성하고 싶습니다. 원이 서로 교차해서는 안됩니다. 다른 모든 원과 교차하지 않는 경우 각 원을 확인하는 메소드를 만들었습니다. (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
}
충돌이 발생한 경우 어디에서 새 좌표를 다시 생성해야합니까? 내 목표는 내가 찾을 때까지 새로운 "collisionless"좌표를 찾는 것입니다 ... – Engo
내가 쓴대로 - '반복주기'시작 부분에. 생활 비유 - 바구니에 공을 던져. 놓친 경우 다시 시도하십시오. – MBo