Change Details
cameo/area.c |
84 | 84 | /* |
85 | 85 | * Solve |
86 | 86 | * |
| 87 | * ax+by = e |
| 88 | * cx+dy = f |
| 89 | * |
| 90 | * with Cramer's rule: |
| 91 | * http://en.wikipedia.org/wiki/Cramer's_rule |
| 92 | */ |
| 93 | |
| 94 | static int cramer2(double a, double b, double c, double d, double e, double f, |
| 95 | double *x, double *y) |
| 96 | { |
| 97 | double det; |
| 98 | |
| 99 | det = a*d-b*c; |
| 100 | if (fabs(det) < EPSILON) |
| 101 | return 0; |
| 102 | *x = (e*d-b*f)/det; |
| 103 | *y = (a*f-e*c)/det; |
| 104 | return 1; |
| 105 | } |
| 106 | |
| 107 | |
| 108 | /* |
| 109 | * Solve |
87 | 110 | * ax+na*bx = cx+nb*dx |
88 | 111 | * ay+na*by = cy+nb*dy |
89 | 112 | * |
... | ... | |
91 | 114 | * |
92 | 115 | * na*bx + nb*-dx = cx-ax |
93 | 116 | * na*by + nb*-dy = cy-ay |
94 | | * |
95 | | * which we the solve with Cramer's rule: |
96 | | * http://en.wikipedia.org/wiki/Cramer's_rule |
97 | 117 | */ |
98 | 118 | |
99 | 119 | static int intersect(double ax, double ay, double bx, double by, |
100 | 120 | double cx, double cy, double dx, double dy, double *na, double *nb) |
101 | 121 | { |
102 | | double det; |
103 | | |
104 | | det = dx*by-bx*dy; |
105 | | if (fabs(det) < EPSILON) |
106 | | return 0; |
107 | | |
108 | | *na = (dx*(cy-ay)-dy*(cx-ax))/det; |
109 | | *nb = (bx*(cy-ay)-by*(cx-ax))/det; |
110 | | return 1; |
| 122 | return cramer2(bx, -dx, by, -dy, cx-ax, cy-ay, na, nb); |
111 | 123 | } |
112 | 124 | |
113 | 125 | |
Download the corresponding diff file