blob: 4b695df7b67ac39932fddead4eb313ba9596e0ad [file] [log] [blame]
caryclark@google.com27accef2012-01-25 18:57:23 +00001#include "QuadraticUtilities.h"
caryclark@google.comd88e0892012-03-27 13:23:51 +00002#include <math.h>
caryclark@google.com27accef2012-01-25 18:57:23 +00003
4int quadraticRoots(double A, double B, double C, double t[2]) {
5 B *= 2;
6 double square = B * B - 4 * A * C;
7 if (square < 0) {
8 return 0;
9 }
10 double squareRt = sqrt(square);
11 double Q = (B + (B < 0 ? -squareRt : squareRt)) / -2;
caryclark@google.com78e17132012-04-17 11:40:34 +000012 double ratio;
caryclark@google.com27accef2012-01-25 18:57:23 +000013 int foundRoots = 0;
14 if ((Q <= A) ^ (Q < 0)) {
caryclark@google.com78e17132012-04-17 11:40:34 +000015 ratio = Q / A;
16 if (!isnan(ratio)) {
17 t[foundRoots++] = ratio;
18 }
caryclark@google.com27accef2012-01-25 18:57:23 +000019 }
20 if ((C <= Q) ^ (C < 0)) {
caryclark@google.com78e17132012-04-17 11:40:34 +000021 ratio = C / Q;
22 if (!isnan(ratio)) {
23 t[foundRoots++] = ratio;
24 }
caryclark@google.com27accef2012-01-25 18:57:23 +000025 }
26 return foundRoots;
27}
caryclark@google.com8dcf1142012-07-02 20:27:02 +000028
29void dxdy_at_t(const Quadratic& quad, double t, double& x, double& y) {
30 double a = t - 1;
31 double b = 1 - 2 * t;
32 double c = t;
33 if (&x) {
34 x = a * quad[0].x + b * quad[1].x + c * quad[2].x;
35 }
36 if (&y) {
37 y = a * quad[0].y + b * quad[1].y + c * quad[2].y;
38 }
39}
40
41void xy_at_t(const Quadratic& quad, double t, double& x, double& y) {
42 double one_t = 1 - t;
43 double a = one_t * one_t;
44 double b = 2 * one_t * t;
45 double c = t * t;
46 if (&x) {
47 x = a * quad[0].x + b * quad[1].x + c * quad[2].x;
48 }
49 if (&y) {
50 y = a * quad[0].y + b * quad[1].y + c * quad[2].y;
51 }
52}