1

在过去的几天里,我一直在为这个问题绞尽脑汁,而对于我的一生来说,似乎可以找到问题代码。本质上,此代码生成具有 x 和 y 坐标和半径的随机数量的对象,然后代码检查新对象是否与任何其他对象发生碰撞,如果没有,则将其添加到主数组中然后返回调用函数。我的问题是,当我加载页面时,所有对象都在那里,但有些对象仍然相互碰撞,我不知道为什么。任何人都可以看到这个问题吗?

public function Generate($chunkX, $chunkY) {
    if (!(isset($this->ChunkX) && isset($this->ChunkY) )) {
        $this->ChunkX = $chunkX;
        $this->ChunkY = $chunkY;
    }
    $counter = 0;
    $this->ObjectLocations = array();
    $totalAstroids = $this->GetAstroidNo();


    while ($counter < $totalAstroids) {
        $tempObjectLocations = array();
        //X and Y Chunk Coordinates
        $tempObjectLocations['chunkX'] = $chunkX;
        $tempObjectLocations['chunkY'] = $chunkY;
        //X and Y coordinates for the object.
        $tempObjectLocations['coordX'] = rand(4, 60);
        $tempObjectLocations['coordY'] = rand(4, 60);
        $tempObjectLocations['radius'] = rand(4, 12);
        //Checks if objects already exist in array
        if (count($this->ObjectLocations) > 0) {

            //if the object does not collide with any other object 
            //the location will be added into the database
            if ($this->isColliding($tempObjectLocations) == false) {
                array_push($this->ObjectLocations, $tempObjectLocations);
                $counter += 1;
            }
            // if object is the first created insert into table.
        } else {
            array_push($this->ObjectLocations, $tempObjectLocations);
            $counter += 1;
        }
    }

    return $this->ObjectLocations;
}
public function isColliding($obj1) {
    //Checks if object conflicts with nearby objects
    $a = count($this->ObjectLocations);
    for ($i = 0; $i < $a; $i++) {
        $obj2 = $this->ObjectLocations[$i];

        //Calculates the distance between two points
        $distance = sqrt(($obj1['coordX'] - $obj2['coordX']) ^ 2 + ($obj1['coordY'] - $obj2['coordY']) ^ 2);

        //Checks if the distance between the two objects is 
        //more than the radius of both objects added together
        if ($distance < ($obj1['radius'] + $obj2['radius'] )) {
            return true;
        }
    }
    return false;
}

json结果

parseResponse([
{
    "chunkX": "1",
    "chunkY": "1",
    "coordX": 54,
    "coordY": 17,
    "radius": 8
},
{
    "chunkX": "1",
    "chunkY": "1",
    "coordX": 41,
    "coordY": 57,
    "radius": 12
},
{
    "chunkX": "1",
    "chunkY": "1",
    "coordX": 42,
    "coordY": 36,
    "radius": 8
},
{
    "chunkX": "1",
    "chunkY": "1",
    "coordX": 40,
    "coordY": 58,
    "radius": 8
},
{
    "chunkX": "1",
    "chunkY": "1",
    "coordX": 25,
    "coordY": 58,
    "radius": 12
},
{
    "chunkX": "1",
    "chunkY": "1",
    "coordX": 57,
    "coordY": 8,
    "radius": 10
},
{
    "chunkX": "1",
    "chunkY": "1",
    "coordX": 46,
    "coordY": 17,
    "radius": 11
},
{
    "chunkX": "1",
    "chunkY": "1",
    "coordX": 42,
    "coordY": 29,
    "radius": 8
},
{
    "chunkX": "1",
    "chunkY": "1",
    "coordX": 18,
    "coordY": 58,
    "radius": 11
},
{
    "chunkX": "1",
    "chunkY": "1",
    "coordX": 59,
    "coordY": 5,
    "radius": 11
},
{
    "chunkX": "1",
    "chunkY": "1",
    "coordX": 15,
    "coordY": 56,
    "radius": 12
}

]);

4

2 回答 2

2

我有一些提议。在你的isColliding

public function isColliding($obj1) {
    //Checks if object conflicts with nearby objects
    $a = count($this->ObjectLocations);
    for ($i = 0; $i < $a; $i++) {
        $obj2 = $this->ObjectLocations[$i];

        //Calculates the distance between two points
        $distance = sqrt(($obj1['coordX'] - $obj2['coordX']) ^ 2 + ($obj1['coordY'] - $obj2['coordY']) ^ 2);

        //Checks if the distance between the two objects is 
        //more than the radius of both objects added together
        if ($distance < ($obj1['radius'] + $obj2['radius'] )) { // -> Bad idea !
            return true;
        }
    }
    return false;
}

我已经标记了不好的地方。为什么 ?因为您将小行星视为质点,但实际上并非如此。如果它们的半径之和等于它们之间的距离,它们仍然会相互碰撞。所以这个条件应该是这样的:

if ($distance <= ($obj1['radius'] + $obj2['radius'] )) { // -> Should work :)
                return true;
            }

每个人都在看,但看不到。有一些基本错误(当然我也没有看到这个:))。在 PHP中, ^运算符是 XOR 运算符而不是幂运算符 :),因此脚本的正确表示法是:

public function isColliding($obj1) {
    //Checks if object conflicts with nearby objects
    $a = count($this->ObjectLocations);
    for ($i = 0; $i < $a; $i++) {
        $obj2 = $this->ObjectLocations[$i];

        //Calculates the distance between two points
//correct ^2 to pow function
        $distance = sqrt(pow($obj1['coordX'] - $obj2['coordX'], 2) + pow($obj1['coordY'] - $obj2['coordY'], 2));

        //Checks if the distance between the two objects is 
        //more than the radius of both objects added together
        if ($distance < ($obj1['radius'] + $obj2['radius'] )) { // -> Bad idea !
            return true;
        }
    }
    return false;
}
于 2013-04-22T12:55:19.030 回答
0

也许没有帮助的答案,但是......我认为你的 IF/ELSE 语句应该导致两种不同的状态?

        if ($this->isColliding($tempObjectLocations) == false) {
            array_push($this->ObjectLocations, $tempObjectLocations);
            $counter += 1;
        }
        // if object is the first created insert into table.
    } else {
        array_push($this->ObjectLocations, $tempObjectLocations);
        $counter += 1;
    }

正如我所看到的,无论它是否碰撞,你都将它推入一个数组?

于 2013-04-22T12:26:45.787 回答