2 * Copyright Droids Corporation (2009)
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 * Revision : $Id: f16.h,v 1.6.4.3 2008-05-10 15:06:26 zer0 Exp $
26 #include <vect_base.h>
29 static inline float sq(float x)
34 uint8_t pt_is_inside_circle(const point_t *p, circle_t *c)
39 if ((v.x * v.x + v.y * v.y) < (c->r * c->r))
47 * 1 one intersection point
48 * 2 two intersection points
50 * p1, p2 arguments are the crossing points coordinates. Both p1 and
51 * p2 are dummy for 0 result. When result is 1, p1 and p2 are set to
54 uint8_t circle_intersect(const circle_t *c1, const circle_t *c2,
55 point_t *p1, point_t *p2)
61 /* create circles with same radius, but centered on 0,0 : it
62 * will make process easier */
71 http://www.loria.fr/~roegel/notes/note0001.pdf */
74 c = sq(cb.x) + sq(cb.y) - sq(cb.r) + sq(ca.r);
76 (4. * (sq(a) + sq(b)) * (sq(c) - sq(b) * sq(ca.r)) );
84 e = sq(cb.r) - sq((2. * c - sq(a)) / (2. * a));
90 p1->x = (2. * a * c - sqrt(d)) / (2. * (sq(a) + sq(b)));
98 p1->x = (2. * a * c - sqrt(d)) / (2. * (sq(a) + sq(b)));
99 p1->y = (c - a * p1->x) / b;
100 p2->x = (2. * a * c + sqrt(d)) / (2. * (sq(a) + sq(b)));
101 p2->y = (c - a * p2->x) / b;