10 quads.a = realloc(quads.a, sizeof(Quad) * quads.max);
12 sysfatal("could not realloc quads: %r");
20 if(quads.l == quads.max)
23 q = quads.a + quads.l++;
24 memset(q->c, 0, sizeof(QB)*4);
32 quadins(Body *nb, double size)
41 if(space.t == EMPTY) {
54 qxy = b->x < qx ? 0 : 1;
55 qxy |= b->y < qy ? 0 : 2;
57 if((qb->q = quad(b)) == nil)
59 qb->q->c[qxy].t = BODY;
64 mass = q->mass + nb->mass;
65 q->x = (q->x*q->mass + nb->x*nb->mass) / mass;
66 q->y = (q->y*q->mass + nb->y*nb->mass) / mass;
69 qxy = nb->x < qx ? 0 : 1;
70 qxy |= nb->y < qy ? 0 : 2;
71 if(q->c[qxy].t == EMPTY) {
74 STATS(if(d > quaddepth) quaddepth = d;)
81 qx += qxy&1 ? size/2 : -size/2;
82 qy += qxy&2 ? size/2 : -size/2;
87 quadcalc(QB qb, Body *b, double size)
89 double fx÷❨m₁m₂❩, fy÷❨m₁m₂❩, dx, dy, h, G÷h³;
91 for(;;) switch(qb.t) {
93 sysfatal("quadcalc: No such type");
101 h = hypot(hypot(dx, dy), ε);
103 fx÷❨m₁m₂❩ = dx * G÷h³;
104 fy÷❨m₁m₂❩ = dy * G÷h³;
105 b->newa.x += fx÷❨m₁m₂❩ * qb.b->mass;
106 b->newa.y += fy÷❨m₁m₂❩ * qb.b->mass;
113 if(h != 0.0 && size/h < θ) {
116 fx÷❨m₁m₂❩ = dx * G÷h³;
117 fy÷❨m₁m₂❩ = dy * G÷h³;
118 b->newa.x += fx÷❨m₁m₂❩ * qb.q->mass;
119 b->newa.y += fy÷❨m₁m₂❩ * qb.q->mass;
124 quadcalc(qb.q->c[0], b, size);
125 quadcalc(qb.q->c[1], b, size);
126 quadcalc(qb.q->c[2], b, size);
128 break; /* quadcalc(q->q[3], b, size); */
135 quads.a = calloc(5, sizeof(Body));
137 sysfatal("could not allocate quads: %r");