| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 #include "SkLineParameters.h" | 7 #include "SkLineParameters.h" |
| 8 #include "SkPathOpsCubic.h" | 8 #include "SkPathOpsCubic.h" |
| 9 #include "SkPathOpsLine.h" | 9 #include "SkPathOpsLine.h" |
| 10 #include "SkPathOpsQuad.h" | 10 #include "SkPathOpsQuad.h" |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 if (approximately_zero(s[i])) { | 148 if (approximately_zero(s[i])) { |
| 149 return num; | 149 return num; |
| 150 } | 150 } |
| 151 } | 151 } |
| 152 s[num++] = 0; | 152 s[num++] = 0; |
| 153 return num; | 153 return num; |
| 154 } | 154 } |
| 155 if (approximately_zero(A + B + C + D)) { // 1 is one root | 155 if (approximately_zero(A + B + C + D)) { // 1 is one root |
| 156 int num = SkDQuad::RootsReal(A, A + B, -D, s); | 156 int num = SkDQuad::RootsReal(A, A + B, -D, s); |
| 157 for (int i = 0; i < num; ++i) { | 157 for (int i = 0; i < num; ++i) { |
| 158 if (AlmostEqualUlps(s[i], 1)) { | 158 if (AlmostDequalUlps(s[i], 1)) { |
| 159 return num; | 159 return num; |
| 160 } | 160 } |
| 161 } | 161 } |
| 162 s[num++] = 1; | 162 s[num++] = 1; |
| 163 return num; | 163 return num; |
| 164 } | 164 } |
| 165 double a, b, c; | 165 double a, b, c; |
| 166 { | 166 { |
| 167 double invA = 1 / A; | 167 double invA = 1 / A; |
| 168 a = B * invA; | 168 a = B * invA; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 179 double r; | 179 double r; |
| 180 double* roots = s; | 180 double* roots = s; |
| 181 if (R2MinusQ3 < 0) { // we have 3 real roots | 181 if (R2MinusQ3 < 0) { // we have 3 real roots |
| 182 double theta = acos(R / sqrt(Q3)); | 182 double theta = acos(R / sqrt(Q3)); |
| 183 double neg2RootQ = -2 * sqrt(Q); | 183 double neg2RootQ = -2 * sqrt(Q); |
| 184 | 184 |
| 185 r = neg2RootQ * cos(theta / 3) - adiv3; | 185 r = neg2RootQ * cos(theta / 3) - adiv3; |
| 186 *roots++ = r; | 186 *roots++ = r; |
| 187 | 187 |
| 188 r = neg2RootQ * cos((theta + 2 * PI) / 3) - adiv3; | 188 r = neg2RootQ * cos((theta + 2 * PI) / 3) - adiv3; |
| 189 if (!AlmostEqualUlps(s[0], r)) { | 189 if (!AlmostDequalUlps(s[0], r)) { |
| 190 *roots++ = r; | 190 *roots++ = r; |
| 191 } | 191 } |
| 192 r = neg2RootQ * cos((theta - 2 * PI) / 3) - adiv3; | 192 r = neg2RootQ * cos((theta - 2 * PI) / 3) - adiv3; |
| 193 if (!AlmostEqualUlps(s[0], r) && (roots - s == 1 || !AlmostEqualUlps(s[1
], r))) { | 193 if (!AlmostDequalUlps(s[0], r) && (roots - s == 1 || !AlmostDequalUlps(s
[1], r))) { |
| 194 *roots++ = r; | 194 *roots++ = r; |
| 195 } | 195 } |
| 196 } else { // we have 1 real root | 196 } else { // we have 1 real root |
| 197 double sqrtR2MinusQ3 = sqrt(R2MinusQ3); | 197 double sqrtR2MinusQ3 = sqrt(R2MinusQ3); |
| 198 double A = fabs(R) + sqrtR2MinusQ3; | 198 double A = fabs(R) + sqrtR2MinusQ3; |
| 199 A = SkDCubeRoot(A); | 199 A = SkDCubeRoot(A); |
| 200 if (R > 0) { | 200 if (R > 0) { |
| 201 A = -A; | 201 A = -A; |
| 202 } | 202 } |
| 203 if (A != 0) { | 203 if (A != 0) { |
| 204 A += Q / A; | 204 A += Q / A; |
| 205 } | 205 } |
| 206 r = A - adiv3; | 206 r = A - adiv3; |
| 207 *roots++ = r; | 207 *roots++ = r; |
| 208 if (AlmostEqualUlps(R2, Q3)) { | 208 if (AlmostDequalUlps(R2, Q3)) { |
| 209 r = -A / 2 - adiv3; | 209 r = -A / 2 - adiv3; |
| 210 if (!AlmostEqualUlps(s[0], r)) { | 210 if (!AlmostDequalUlps(s[0], r)) { |
| 211 *roots++ = r; | 211 *roots++ = r; |
| 212 } | 212 } |
| 213 } | 213 } |
| 214 } | 214 } |
| 215 return static_cast<int>(roots - s); | 215 return static_cast<int>(roots - s); |
| 216 } | 216 } |
| 217 | 217 |
| 218 // from http://www.cs.sunysb.edu/~qin/courses/geometry/4.pdf | 218 // from http://www.cs.sunysb.edu/~qin/courses/geometry/4.pdf |
| 219 // c(t) = a(1-t)^3 + 3bt(1-t)^2 + 3c(1-t)t^2 + dt^3 | 219 // c(t) = a(1-t)^3 + 3bt(1-t)^2 + 3c(1-t)t^2 + dt^3 |
| 220 // c'(t) = -3a(1-t)^2 + 3b((1-t)^2 - 2t(1-t)) + 3c(2t(1-t) - t^2) + 3dt^2 | 220 // c'(t) = -3a(1-t)^2 + 3b((1-t)^2 - 2t(1-t)) + 3c(2t(1-t) - t^2) + 3dt^2 |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 514 SkDebugf("{{"); | 514 SkDebugf("{{"); |
| 515 int index = 0; | 515 int index = 0; |
| 516 do { | 516 do { |
| 517 fPts[index].dump(); | 517 fPts[index].dump(); |
| 518 SkDebugf(", "); | 518 SkDebugf(", "); |
| 519 } while (++index < 3); | 519 } while (++index < 3); |
| 520 fPts[index].dump(); | 520 fPts[index].dump(); |
| 521 SkDebugf("}}\n"); | 521 SkDebugf("}}\n"); |
| 522 } | 522 } |
| 523 #endif | 523 #endif |
| OLD | NEW |