알고리즘

boids

조규현15 2023. 4. 23. 13:55
반응형

Boids 알고리즘은 많겠지만 간단한 알고리즘을 써봤습니다.

 

youtube 영상에서 boids 시뮬레이션을 보고, gtihub 주소가 있어 확인했습니다.
https://github.com/jackaperkins/boids

 

GitHub - jackaperkins/boids: The age old boids project!

The age old boids project! Contribute to jackaperkins/boids development by creating an account on GitHub.

github.com

 

내용 중 boids 알고리즘 부분은 다소 간단하게 확인할 수 있습니다.

 

"boids.pde" 내용으로 아래 절차를 따르고 있습니다.

 

1. update

1-1. collect boids

1-2. adjust parameters

1-2-1. friend ( F ) : collecting nearest boids
1-2-2. crowd ( C - Red ) : push out other boids
1-2-3. avoid ( A ) : avoid objects
1-2-4. cohes ( C - Sky ) : cohes that nearst boids
1-2-5. noise ( N ) : randomize

1-3. sum of parmeters

1-4. update shape ( color )

 

핵심은 아래 내용입니다.

1. 내 인접 Boid 들을 수집하고 friend 로 취급한다.

friends 의 direction ( 이전 update 의 이동 진행 방향 ) 을 더한다.

* direction 은 normal vector 입니다

* 이 값에 나와 대상의 distance ( 거리 ) 를 나누어 줍니다

 

이를 통해 거리가 가까울 수록 가중치가 더 큽니다.

 

2. Crowd 거리 내 Boid 의 위치와 나의 반대 방향 ( 멀어지는 ) 을 더한다.

이 역시 distance 에 따라 가중치를 다르게 적용합니다.

* 가까울 수록 가중치가 더 커지므로 무조건 멀어집니다

 

3. Avoid 대상들의 위치의 반대 방향을 더합니다 ( crowd 와 유사 )

* avoid 는 crowd 보다 우선 순위가 높으므로 가중치를 따로 더 해줍니다

 

4. Cohesion 대상들의 중심점 ( center of weight ) 의 위치로 가까워지는 방향을 더한다.

 * distance 의 가중치가 아닌 0.05 ( 매직넘버.. ) 를 적용합니다

 

5. Random ( noise ) 의 적은 가중치를 더합니다.

 

위 Parameters 의 합을 다음 이동에 반영합니다.

주의할 점은 weight 들의 sum 으로 이동이 결정되기 때문에 각각의 요소 ( parameter ) 가 가지는

중요도를 적절하게 결정해야 하며 ( 본문에서는 magic number )

그들의 sum 을 조정하기 위해 각 요소들은 Normal Vector 를 사용한다는 점 입니다.

 

적용되는 환경에 따라 새로운 weight 들을 설정하고 적용하여도 재밌을 듯 싶어 흥미가 가는 내용이였습니다.

 

나머지 GroupId 라고 표현했지만 Shape 는 Friend Boid 의 shape 의 avg ( 평균 ) 을 적용하여 동일한 값을 갖도록 유도합니다. 이는 color ( 군집에 따라 다름 ) 을 보여주기 위한 내용입니다.

 

그럼 더 좋은 아이디어가 있다면 적용해보고 싶네요.

 

c# 으로 포팅한 github repository 를 공유하며 마무리합니다.

https://github.com/keicoon/boids

반응형

'알고리즘' 카테고리의 다른 글

Minkowski Sum  (1) 2024.04.26
Alias method Algorithm  (0) 2023.04.27
피보나치 힙  (0) 2015.12.15
문자열 매칭 알고리즘  (0) 2015.12.05
A* Algorithm  (0) 2015.11.25