[英]Collision detection circles using recursion in JavaScript
我想在距主圓特定距離的隨機位置上生成圓。 圓圈不應該相交。 我創建了一種方法來檢查每個圓圈是否沒有與所有其他圓圈相交。 沖突檢測可以完成它的工作,但是我代碼中的遞歸部分不起作用:
if (collision > 0) {
console.log("GENERATE NEW RANDOM COORDINATE")
generateRandomCoordinate(d, r)
}
結果
從輸出中可以看到,我的應用在檢測到碰撞(138,272)時會生成新的坐標(158,290)。 但是,它仍在(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)
輸出量
更新工作代碼
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
}
不需要遞歸函數調用。 只是組織循環(偽代碼)
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
關於遞歸混亂-對於每個遞歸調用級別的函數實例都包含自己的變量內部副本,因此外部函數不知道內部x,y-您不會在此代碼段中返回它們:
if (collision > 0) {
vvvvvvvvvvvvvvvvvv
generateRandomCoordinate(d, r)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.