2013-04-30 55 views
2

碰撞我一直在尋找一些僞代碼boids和C++寫的。但是,我發現boids偶爾會相互碰撞。鑑於僞代碼的簡單性,我認爲我已經正確編寫了它。然而,當我顯示所有boids的位置時,它們中的一些具有相同的座標。類鳥羣相互

從鏈接的僞代碼:

PROCEDURE rule2(boid bJ) 

    Vector c = 0; 

    FOR EACH BOID b 
     IF b != bJ THEN 
      IF |b.position - bJ.position| < 100 THEN 
       c = c - (b.position - bJ.position) 
      END IF 
     END IF 
    END 

    RETURN c 

END PROCEDURE 

我的代碼是:

std::pair <signed int, signed int> keep_distance(std::vector <Boid> & boids, Boid & boid){ 
    signed int dx = 0; 
    signed int dy = 0; 
    for(Boid & b : boids){ 
     if (boid != b){  // this checks an "id" number, not location 
      if (b.dist(boid) < MIN_DIST){ 
       dx -= b.get_x() - boid.get_x(); 
       dy -= b.get_y() - boid.get_y(); 
      } 
     } 
    } 
    return std::pair <signed int, signed int> (dx, dy); 
} 

MIN_DIST = 100; 

unsigned int Boid::dist(const Boid & b){ 
    return (unsigned int) sqrt((b.x - x) * (b.x - x) + (b.y - y) * (b.y - y)); 
} 

唯一的主要區別是這兩個代碼之間應該是代替vector c,即時使用組件。

我在用的移動周圍的每個BOID功能的順序是:

center_of_mass(boids, new_boids[i]);      // rule 1 
    match_velocity(boids, new_boids[i]);      // rule 3 
    keep_within_bound(new_boids[i]); 
    tendency_towards_place(new_boids[i], mouse_x, mouse_y); 
    keep_distance(boids, new_boids[i]);      // rule 2 

是有什麼明顯的即時通訊沒有看到?也許一些愚蠢的矢量算術我做錯了?

+0

'int'是默認簽名的,所以如果你願意,你可以寫'int'而不是'signed int'。 – 2013-04-30 22:14:00

+1

是嚴重無益 – calccrypto 2013-04-30 22:15:15

回答

3

的規則不說,類鳥羣之間不會發生衝突。他們只是不想。 :)

正如你在這個片段中看到:

FOR EACH BOID b 
     v1 = rule1(b) 
     v2 = rule2(b) 
     v3 = rule3(b) 

     b.velocity = b.velocity + v1 + v2 + v3 
     b.position = b.position + b.velocity 
    END 

沒有檢查,以確保它們不會發生碰撞。如果數字出來不利,他們仍然會相互衝突。

話雖這麼說,如果你得到的多類鳥羣完全相同的位置,它仍然是非常不可能的,雖然。它會指向編程錯誤。

+0

我認爲香港專業教育學院只看到最多2類鳥羣相撞隨時步 – calccrypto 2013-04-30 22:16:09

+0

是的,但你如何定義發生衝突?如果你正在做浮點運算,兩次得到完全相同的值是不太可能的。哦,你正在使用整數。不理我! :D – Sarien 2013-04-30 22:19:20

+0

哦。即時通訊使用整數值的像素。我應該改變他們浮動? – calccrypto 2013-04-30 22:20:20

2

在文章後面他有這樣的代碼:

ROCEDURE move_all_boids_to_new_positions() 
    Vector v1, v2, v3, ... 
    Integer m1, m2, m3, ... 
    Boid b 
    FOR EACH BOID b 
     v1 = m1 * rule1(b) 
     v2 = m2 * rule2(b) 
     v3 = m3 * rule3(b) 
     b.velocity = b.velocity + v1 + v2 + v3 + ... 
     b.position = b.position + b.velocity 
    END 
END PROCEDURE 

(儘管實際上我會讓M1一個double而非Integer)如果rule1是命名不良規則,使得類鳥羣試圖避開對方,只需增加m1的價值,他們將變得彼此更快。而且,增加MIN_DIST將導致他們發現,他們即將碰到對方更快,並降低(在功能limit_velocityvlim)其最大速度將讓他們更三立反應附近碰撞。

正如其他人所提到的,沒有什麼是100%保證的碰撞沒有發生的,但這些調整將會使碰撞的可能性較小。