Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /examples/boids/boids.diderot
ViewVC logotype

Annotation of /examples/boids/boids.diderot

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2128 - (view) (download)

1 : lamonts 2125 /*! \file flock.diderot
2 :     *
3 :     * \author Lamont Samuels
4 :     *
5 :     * This example is an implementation of Chris Reynolds Boids algorithm. It represents an example of using Spatial communication
6 :     */
7 :     /*
8 :     * COPYRIGHT (c) 2012 The Diderot Project (http://diderot-language.cs.uchicago.edu)
9 :     * All rights reserved.
10 :     */
11 : lamonts 2128 real{} initVelocities = load("velocities.nrrd");
12 : lamonts 2125 int numBoids = length(initVelocities)/2;
13 :     int strandSize = 2;
14 :     real query_radius = 50;
15 :     int MAX_SPEED = 2;
16 :     real MAX_FORCE = 0.05;
17 :     int stepsMax = 10000;
18 :     real boundsFactor = 10.0;
19 :     input int width;
20 :     input int height;
21 :     int NORTH = 0;
22 :     int SOUTH = 1;
23 :     int WEST = 2;
24 :     int EAST = 3;
25 :    
26 :     strand Boid(int i,real vx, real vy) {
27 :     vec2 pos = [real(width)/2.0,real(height)/2.0];
28 :     vec2 vel = [vx,vy];
29 :     int steps = 0;
30 :     int id = i;
31 :     output vec4 boidInfo = [pos[0],pos[1],vel[0],vel[1]];
32 :     update {
33 :     vec2 cohereVec = [0.0,0.0];
34 :     vec2 alignVec = [0.0,0.0];
35 :     vec2 seperateVec = [0.0,0.0];
36 :     vec4 wrapDimensions = [-boundsFactor,
37 :     height + boundsFactor,
38 :     -boundsFactor,
39 :     width + boundsFactor];
40 :     int count = 0;
41 :    
42 :     foreach(Boid neighbor in sphere(query_radius)){
43 :     real d = dist(pos,neighbor.pos);
44 :    
45 :     if(d > 0) {
46 :     cohereVec += neighbor.pos;
47 :     alignVec += neighbor.vel;
48 :     seperateVec = seperateVec + (normalize(pos-neighbor.pos)/d);
49 :     count+=1;
50 :     }
51 :     }
52 :    
53 :     if(count > 0) {
54 :     cohereVec /= real(count);
55 :     alignVec /= real(count);
56 :     seperateVec /= real(count);
57 :     }
58 :    
59 :     real isZero = alignVec • alignVec;
60 :    
61 :     // limit the force
62 :     if ( isZero != 0 && |alignVec| > MAX_FORCE) {
63 :     alignVec = normalize(alignVec);
64 :     alignVec *= MAX_FORCE;
65 :     }
66 :    
67 :    
68 :     vec2 diff = cohereVec - pos;
69 :     isZero = cohereVec • cohereVec;
70 :    
71 :     if(|diff| > 0 && isZero != 0){
72 :    
73 :     cohereVec = normalize(cohereVec);
74 :    
75 :     if(|diff| < 100.0) {
76 :     cohereVec *= (MAX_SPEED*(|diff|/100.0));
77 :     }else {
78 :     cohereVec *= MAX_SPEED;
79 :     }
80 :    
81 :     cohereVec -= vel;
82 :    
83 :     // limit the force
84 :     if (|cohereVec| > MAX_FORCE) {
85 :     cohereVec = normalize(cohereVec);
86 :     cohereVec *= MAX_FORCE;
87 :     }
88 :     }
89 :     else{
90 :     cohereVec = [0.0,0.0];
91 :     }
92 :    
93 :    
94 :     vec2 acceleration = cohereVec + alignVec + seperateVec;
95 :     vel += acceleration;
96 :    
97 :     if (|vel| > MAX_SPEED){
98 :     vel = normalize(cohereVec);
99 :     vel *= MAX_SPEED;
100 :     }
101 :    
102 :     pos += vel;
103 :    
104 :     /* Wrapping Code, if a boid goes outside the window */
105 :     real posX = wrapDimensions[EAST] if pos[0] < wrapDimensions[WEST]
106 :     else wrapDimensions[WEST] if pos[0] > wrapDimensions[EAST]
107 :     else pos[0];
108 :    
109 :     real posY = wrapDimensions[SOUTH] if pos[1] < wrapDimensions[NORTH]
110 :     else wrapDimensions[NORTH] if pos[1] > wrapDimensions[SOUTH]
111 :     else pos[1];
112 :    
113 :     pos = [posX,posY];
114 :    
115 :     boidInfo = [pos[0],pos[1], vel[0], vel[1]];
116 :     }
117 :     }
118 :    
119 :     initially {Boid(i,initVelocities{i*2},initVelocities{i*2+1}) | i in 0 .. numBoids-1 };
120 :    

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0