| 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 "SkPathOpsQuad.h" | 9 #include "SkPathOpsQuad.h" |
| 10 #include "SkPathOpsTriangle.h" | 10 #include "SkPathOpsTriangle.h" |
| 11 | 11 |
| 12 // from http://blog.gludion.com/2009/08/distance-to-quadratic-bezier-curve.html | 12 // from http://blog.gludion.com/2009/08/distance-to-quadratic-bezier-curve.html |
| 13 // (currently only used by testing) | 13 // (currently only used by testing) |
| 14 double SkDQuad::nearestT(const SkDPoint& pt) const { | 14 double SkDQuad::nearestT(const SkDPoint& pt) const { |
| 15 SkDVector pos = fPts[0] - pt; | 15 SkDVector pos = fPts[0] - pt; |
| 16 // search points P of bezier curve with PM.(dP / dt) = 0 | 16 // search points P of bezier curve with PM.(dP / dt) = 0 |
| 17 // a calculus leads to a 3d degree equation : | 17 // a calculus leads to a 3d degree equation : |
| 18 SkDVector A = fPts[1] - fPts[0]; | 18 SkDVector A = fPts[1] - fPts[0]; |
| 19 SkDVector B = fPts[2] - fPts[1]; | 19 SkDVector B = fPts[2] - fPts[1]; |
| 20 B -= A; | 20 B -= A; |
| 21 double a = B.dot(B); | 21 double a = B.dot(B); |
| 22 double b = 3 * A.dot(B); | 22 double b = 3 * A.dot(B); |
| 23 double c = 2 * A.dot(A) + pos.dot(B); | 23 double c = 2 * A.dot(A) + pos.dot(B); |
| 24 double d = pos.dot(A); | 24 double d = pos.dot(A); |
| 25 double ts[3]; | 25 double ts[3]; |
| 26 int roots = SkDCubic::RootsValidT(a, b, c, d, ts); | 26 int roots = SkDCubic::RootsValidT(a, b, c, d, ts); |
| 27 double d0 = pt.distanceSquared(fPts[0]); | 27 double d0 = pt.distanceSquared(fPts[0]); |
| 28 double d2 = pt.distanceSquared(fPts[2]); | 28 double d2 = pt.distanceSquared(fPts[2]); |
| 29 double distMin = SkTMin<double>(d0, d2); | 29 double distMin = SkTMin(d0, d2); |
| 30 int bestIndex = -1; | 30 int bestIndex = -1; |
| 31 for (int index = 0; index < roots; ++index) { | 31 for (int index = 0; index < roots; ++index) { |
| 32 SkDPoint onQuad = xyAtT(ts[index]); | 32 SkDPoint onQuad = xyAtT(ts[index]); |
| 33 double dist = pt.distanceSquared(onQuad); | 33 double dist = pt.distanceSquared(onQuad); |
| 34 if (distMin > dist) { | 34 if (distMin > dist) { |
| 35 distMin = dist; | 35 distMin = dist; |
| 36 bestIndex = index; | 36 bestIndex = index; |
| 37 } | 37 } |
| 38 } | 38 } |
| 39 if (bestIndex >= 0) { | 39 if (bestIndex >= 0) { |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 * c = C | 284 * c = C |
| 285 */ | 285 */ |
| 286 void SkDQuad::SetABC(const double* quad, double* a, double* b, double* c) { | 286 void SkDQuad::SetABC(const double* quad, double* a, double* b, double* c) { |
| 287 *a = quad[0]; // a = A | 287 *a = quad[0]; // a = A |
| 288 *b = 2 * quad[2]; // b = 2*B | 288 *b = 2 * quad[2]; // b = 2*B |
| 289 *c = quad[4]; // c = C | 289 *c = quad[4]; // c = C |
| 290 *b -= *c; // b = 2*B - C | 290 *b -= *c; // b = 2*B - C |
| 291 *a -= *b; // a = A - 2*B + C | 291 *a -= *b; // a = A - 2*B + C |
| 292 *b -= *c; // b = 2*B - 2*C | 292 *b -= *c; // b = 2*B - 2*C |
| 293 } | 293 } |
| OLD | NEW |