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 2288 - (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 2288 real{} initPosns = load("posns.nrrd");
13 : lamonts 2125 int numBoids = length(initVelocities)/2;
14 : lamonts 2288 real boidRadius = 2;
15 :     real queryRadius = 50;
16 :     int DESIRED_SEPARTION = 30;
17 : lamonts 2125 int MAX_SPEED = 2;
18 :     real MAX_FORCE = 0.05;
19 :     real boundsFactor = 10.0;
20 :     input int width;
21 :     input int height;
22 : lamonts 2288 real cellSize=queryRadius;
23 : lamonts 2125 int NORTH = 0;
24 :     int SOUTH = 1;
25 :     int WEST = 2;
26 :     int EAST = 3;
27 : lamonts 2288 real threshold = 0.02;
28 : lamonts 2125
29 : lamonts 2288 vec2 xDom = [0,width];
30 :     vec2 yDom = [height,0];
31 :    
32 :     real xSamples = floor((xDom[1] - xDom[0])/cellSize);
33 :     real ySamples = floor((yDom[0] - yDom[1])/cellSize);
34 :    
35 :     vec4 qWinDim = [xDom[0],xDom[1],yDom[0],yDom[1]];
36 :     vec2 qGridDim = [xSamples ,ySamples];
37 :     vec2 qCellDim = [cellSize,cellSize];
38 :    
39 :    
40 :     strand Boid(int i,real vx, real vy, real px, real py) {
41 :     vec2 pos = [px,py];
42 : lamonts 2125 vec2 vel = [vx,vy];
43 :     int id = i;
44 :     output vec4 boidInfo = [pos[0],pos[1],vel[0],vel[1]];
45 :     update {
46 : lamonts 2288
47 : lamonts 2125 vec2 cohereVec = [0.0,0.0];
48 :     vec2 alignVec = [0.0,0.0];
49 :     vec2 seperateVec = [0.0,0.0];
50 :     vec4 wrapDimensions = [-boundsFactor,
51 :     height + boundsFactor,
52 :     -boundsFactor,
53 :     width + boundsFactor];
54 :     int count = 0;
55 : lamonts 2288 int count2 = 0;
56 :     foreach(Boid neighbor in sphere(queryRadius)){
57 :     real d = |pos - neighbor.pos|;
58 :     cohereVec += neighbor.pos;
59 :     alignVec += neighbor.vel;
60 :     count+=1;
61 : lamonts 2125
62 : lamonts 2288 if(d < DESIRED_SEPARTION) {
63 :     seperateVec = seperateVec + (normalize(pos-neighbor.pos)/d);
64 :     count2+=1;
65 :     }
66 : lamonts 2125 }
67 :    
68 :     if(count > 0) {
69 : lamonts 2288 cohereVec /= real(count);
70 :     alignVec /= real(count);
71 : lamonts 2125 }
72 : lamonts 2288 if(count2 > 0) {
73 :     seperateVec /= real(count2);
74 :     }
75 : lamonts 2125
76 :     real isZero = alignVec • alignVec;
77 :    
78 :     // limit the force
79 :     if ( isZero != 0 && |alignVec| > MAX_FORCE) {
80 :     alignVec = normalize(alignVec);
81 :     alignVec *= MAX_FORCE;
82 :     }
83 :    
84 :    
85 :     vec2 diff = cohereVec - pos;
86 :     isZero = cohereVec • cohereVec;
87 :    
88 :     if(|diff| > 0 && isZero != 0){
89 :    
90 :     cohereVec = normalize(cohereVec);
91 :    
92 :     if(|diff| < 100.0) {
93 :     cohereVec *= (MAX_SPEED*(|diff|/100.0));
94 :     }else {
95 :     cohereVec *= MAX_SPEED;
96 :     }
97 :    
98 :     cohereVec -= vel;
99 :    
100 :     // limit the force
101 :     if (|cohereVec| > MAX_FORCE) {
102 :     cohereVec = normalize(cohereVec);
103 :     cohereVec *= MAX_FORCE;
104 :     }
105 :     }
106 :     else{
107 :     cohereVec = [0.0,0.0];
108 :     }
109 :    
110 :    
111 :     vec2 acceleration = cohereVec + alignVec + seperateVec;
112 :     vel += acceleration;
113 :    
114 :     if (|vel| > MAX_SPEED){
115 :     vel = normalize(cohereVec);
116 :     vel *= MAX_SPEED;
117 :     }
118 :    
119 :     pos += vel;
120 :    
121 : lamonts 2288 //Wrapping Code, if a boid goes outside the window
122 : lamonts 2125 real posX = wrapDimensions[EAST] if pos[0] < wrapDimensions[WEST]
123 :     else wrapDimensions[WEST] if pos[0] > wrapDimensions[EAST]
124 :     else pos[0];
125 :    
126 :     real posY = wrapDimensions[SOUTH] if pos[1] < wrapDimensions[NORTH]
127 :     else wrapDimensions[NORTH] if pos[1] > wrapDimensions[SOUTH]
128 :     else pos[1];
129 :    
130 : lamonts 2288 pos = [posX,posY];
131 : lamonts 2125
132 :     boidInfo = [pos[0],pos[1], vel[0], vel[1]];
133 :     }
134 :     }
135 :    
136 : lamonts 2288 initially {Boid(i,initVelocities{i*2},initVelocities{i*2+1},initPosns{i*2},
137 :     initPosns{i*2+1}) | i in 0 .. numBoids-1 };

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