shape ops work in progress
more quadratics work
git-svn-id: http://skia.googlecode.com/svn/trunk@3643 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/Intersection/op.htm b/experimental/Intersection/op.htm
index b2c9123..2078396 100644
--- a/experimental/Intersection/op.htm
+++ b/experimental/Intersection/op.htm
@@ -69,11 +69,55 @@
path.lineTo(326.610535, 34.0393639);
path.close();
</div>
+<div id="test_5div">
+original:
+path.moveTo(0, 0);
+path.quadTo(20, 0, 20, 20);
+path.lineTo(0, 0);
+path.close();
+path.moveTo(0, 20);
+path.quadTo(0, 0, 20, 0);
+path.lineTo(0, 20);
+path.close();
+simplified:
+path.moveTo(0, 0);
+path.lineTo(5, 5);
+path.quadTo(0, 10, 0, 20);
+path.lineTo(20, 20);
+path.quadTo(20, 10, 15, 5);
+path.lineTo(20, 0);
+path.quadTo(14.1421356, 0, 10, 1.71572876);
+path.quadTo(5.85786438, 0, 0, 0);
+path.close();
+</div>
+<div id="test_6div">
+original:
+path.moveTo(0, 20);
+path.quadTo(20, 0, 40, 20);
+path.lineTo(0, 20);
+path.close();
+path.moveTo(40, 10);
+path.quadTo(20, 30, 0, 10);
+path.lineTo(40, 10);
+path.close();
+simplified:
+path.moveTo(0, 10);
+path.quadTo(2.92893219, 12.9289322, 5.85786438, 15);
+path.quadTo(2.92893219, 17.0710678, 0, 20);
+path.lineTo(40, 20);
+path.quadTo(37.0710678, 17.0710678, 34.1421356, 15);
+path.quadTo(37.0710678, 12.9289322, 40, 10);
+path.lineTo(0, 10);
+path.close();
+</div>
+
</div>
<script type="text/javascript">
var testDivs = [
+ test_5div,
+ test_6div,
test_4div,
test_3div,
test_2div,
@@ -96,16 +140,26 @@
var contourStrs = test.split("path.close();");
var pattern = /-?\d+\.*\d*/g;
for (var c in contourStrs) {
- var points = contourStrs[c].match(pattern);
- var pts = [];
- for (var wd in points) {
- var num = parseFloat(points[wd]);
- if (isNaN(num)) continue;
- pts.push(num );
+ var contour = contourStrs[c];
+ var verbStrs = contour.split("path");
+ var verbs = [];
+ for (var v in verbStrs) {
+ var verbStr = verbStrs[v];
+ var points = verbStr.match(pattern);
+ var pts = [];
+ for (var wd in points) {
+ var num = parseFloat(points[wd]);
+ if (isNaN(num)) continue;
+ pts.push(num);
+ }
+ if (pts.length > 0)
+ verbs.push(pts);
}
- contours.push(pts);
+ if (verbs.length > 0)
+ contours.push(verbs);
}
- tests.push(contours);
+ if (contours.length > 0)
+ tests.push(contours);
}
function init(test) {
@@ -116,13 +170,15 @@
var xmax = -Infinity;
var ymin = Infinity;
var ymax = -Infinity;
- for (pts in test) {
- var pt = test[pts];
- for (i = 0; i < pt.length; i += 2) {
- xmin = Math.min(xmin, pt[i]);
- ymin = Math.min(ymin, pt[i + 1]);
- xmax = Math.max(xmax, pt[i]);
- ymax = Math.max(ymax, pt[i + 1]);
+ for (var contours in test) {
+ var contour = test[contours];
+ for (var verbs in contour) {
+ var verb = contour[verbs];
+ var last = verb.length;
+ xmin = Math.min(xmin, verb[0]);
+ ymin = Math.min(ymin, verb[1]);
+ xmax = Math.max(xmax, verb[last - 2]);
+ ymax = Math.max(ymax, verb[last - 1]);
}
}
var subscale = 1;
@@ -183,27 +239,46 @@
ctx.fillText(num.toFixed(0), 0, i * unit + _at_y + 0);
}
ctx.strokeStyle = "red";
- for (pts in test) {
- var pt = test[pts];
- var x = pt[0];
- var y = pt[1];
+ var contours, verbs, pts;
+ for (contours in test) {
+ var contour = test[contours];
+ if (contours == 2) ctx.strokeStyle = "blue";
ctx.beginPath();
- ctx.moveTo(xoffset + x * unit, yoffset + y * unit);
- for (i = 2; i < pt.length; i += 2) {
- x = pt[i];
- y = pt[i + 1];
- ctx.lineTo(xoffset + x * unit, yoffset + y * unit);
+ var first = true;
+ for (verbs in contour) {
+ var verb = contour[verbs];
+ switch (verb.length) {
+ case 2:
+ if (first) {
+ ctx.moveTo(xoffset + verb[0] * unit, yoffset + verb[1] * unit);
+ first = false;
+ } else
+ ctx.lineTo(xoffset + verb[0] * unit, yoffset + verb[1] * unit);
+ break;
+ case 4:
+ ctx.quadraticCurveTo(xoffset + verb[0] * unit, yoffset + verb[1] * unit,
+ xoffset + verb[2] * unit, yoffset + verb[3] * unit);
+ break;
+ case 6:
+ ctx.bezierCurveTo(xoffset + verb[0] * unit, yoffset + verb[1] * unit,
+ xoffset + verb[2] * unit, yoffset + verb[3] * unit,
+ xoffset + verb[4] * unit, yoffset + verb[5] * unit);
+ break;
+ }
}
ctx.stroke();
}
ctx.fillStyle="blue";
- for (pts in test) {
- var pt = test[pts];
- for (i = 0; i < pt.length; i += 2) {
- x = pt[i];
- y = pt[i + 1];
- drawPoint(x, y, xoffset, yoffset, unit);
+ for (contours in test) {
+ var contour = test[contours];
+ for (verbs in contour) {
+ var verb = contour[verbs];
+ for (i = 0; i < verb.length; i += 2) {
+ x = verb[i];
+ y = verb[i + 1];
+ drawPoint(x, y, xoffset, yoffset, unit);
+ }
}
}
}