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

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