Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(584)

Side by Side Diff: src/pathops/SkDCubicToQuads.cpp

Issue 131103009: update pathops to circle sort (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: disable old test that still fails on linux 32 release Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/pathops/SkDCubicIntersection.cpp ('k') | src/pathops/SkDLineIntersection.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 http://stackoverflow.com/questions/2009160/how-do-i-convert-the-2-control-points -of-a-cubic-curve-to-the-single-control-poi 2 http://stackoverflow.com/questions/2009160/how-do-i-convert-the-2-control-points -of-a-cubic-curve-to-the-single-control-poi
3 */ 3 */
4 4
5 /* 5 /*
6 Let's call the control points of the cubic Q0..Q3 and the control points of the quadratic P0..P2. 6 Let's call the control points of the cubic Q0..Q3 and the control points of the quadratic P0..P2.
7 Then for degree elevation, the equations are: 7 Then for degree elevation, the equations are:
8 8
9 Q0 = P0 9 Q0 = P0
10 Q1 = 1/3 P0 + 2/3 P1 10 Q1 = 1/3 P0 + 2/3 P1
11 Q2 = 2/3 P1 + 1/3 P2 11 Q2 = 2/3 P1 + 1/3 P2
12 Q3 = P2 12 Q3 = P2
13 In your case you have Q0..Q3 and you're solving for P0..P2. There are two ways t o compute P1 from 13 In your case you have Q0..Q3 and you're solving for P0..P2. There are two ways t o compute P1 from
14 the equations above: 14 the equations above:
15 15
16 P1 = 3/2 Q1 - 1/2 Q0 16 P1 = 3/2 Q1 - 1/2 Q0
17 P1 = 3/2 Q2 - 1/2 Q3 17 P1 = 3/2 Q2 - 1/2 Q3
18 If this is a degree-elevated cubic, then both equations will give the same answe r for P1. Since 18 If this is a degree-elevated cubic, then both equations will give the same answe r for P1. Since
19 it's likely not, your best bet is to average them. So, 19 it's likely not, your best bet is to average them. So,
20 20
21 P1 = -1/4 Q0 + 3/4 Q1 + 3/4 Q2 - 1/4 Q3 21 P1 = -1/4 Q0 + 3/4 Q1 + 3/4 Q2 - 1/4 Q3
22 22
23
24 SkDCubic defined by: P1/2 - anchor points, C1/C2 control points 23 SkDCubic defined by: P1/2 - anchor points, C1/C2 control points
25 |x| is the euclidean norm of x 24 |x| is the euclidean norm of x
26 mid-point approx of cubic: a quad that shares the same anchors with the cubic an d has the 25 mid-point approx of cubic: a quad that shares the same anchors with the cubic an d has the
27 control point at C = (3·C2 - P2 + 3·C1 - P1)/4 26 control point at C = (3·C2 - P2 + 3·C1 - P1)/4
28 27
29 Algorithm 28 Algorithm
30 29
31 pick an absolute precision (prec) 30 pick an absolute precision (prec)
32 Compute the Tdiv as the root of (cubic) equation 31 Compute the Tdiv as the root of (cubic) equation
33 sqrt(3)/18 · |P2 - 3·C2 + 3·C1 - P1|/2 · Tdiv ^ 3 = prec 32 sqrt(3)/18 · |P2 - 3·C2 + 3·C1 - P1|/2 · Tdiv ^ 3 = prec
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 for (int idx = 0; idx < last; ++idx) { 177 for (int idx = 0; idx < last; ++idx) {
179 part = subDivide(inflectT[idx], inflectT[idx + 1]); 178 part = subDivide(inflectT[idx], inflectT[idx + 1]);
180 addTs(part, precision, inflectT[idx], inflectT[idx + 1], ts); 179 addTs(part, precision, inflectT[idx], inflectT[idx + 1], ts);
181 } 180 }
182 part = subDivide(inflectT[last], 1); 181 part = subDivide(inflectT[last], 1);
183 addTs(part, precision, inflectT[last], 1, ts); 182 addTs(part, precision, inflectT[last], 1, ts);
184 return; 183 return;
185 } 184 }
186 addTs(*this, precision, 0, 1, ts); 185 addTs(*this, precision, 0, 1, ts);
187 } 186 }
OLDNEW
« no previous file with comments | « src/pathops/SkDCubicIntersection.cpp ('k') | src/pathops/SkDLineIntersection.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698