diff --git a/demo/data/contours-1.js b/demo/data/contours-1.js index 5deace6..a90d48f 100644 --- a/demo/data/contours-1.js +++ b/demo/data/contours-1.js @@ -1,6 +1,7 @@ define( function(require) { - return {"xMin":-18,"yMin":109,"xMax":439,"yMax":483,"unicode":[57357],"advanceWidth":633,"leftSideBearing":-18,"name":"uniE00D","contours":[[{"x":-18,"y":382,"onCurve":true},{"x":6,"y":370},{"x":36,"y":370,"onCurve":true},{"x":68,"y":370},{"x":94,"y":385,"onCurve":true},{"x":133,"y":347},{"x":189,"y":347,"onCurve":true},{"x":245,"y":347},{"x":285,"y":385,"onCurve":true},{"x":324,"y":422},{"x":324,"y":476,"onCurve":true},{"x":324,"y":480},{"x":324,"y":483,"onCurve":true},{"x":336,"y":483,"onCurve":true},{"x":336,"y":171,"onCurve":true},{"x":-18,"y":171,"onCurve":true}],[{"x":439,"y":210,"onCurve":true},{"x":437,"y":259},{"x":400,"y":295,"onCurve":true},{"x":360,"y":332},{"x":304,"y":332,"onCurve":true},{"x":250,"y":332},{"x":212,"y":298,"onCurve":true},{"x":185,"y":314},{"x":151,"y":314,"onCurve":true},{"x":103,"y":314},{"x":37,"y":251},{"x":37,"y":160},{"x":70,"y":129,"onCurve":true},{"x":83,"y":117},{"x":97,"y":109,"onCurve":true},{"x":97,"y":210,"onCurve":true}]]} + return {"name":"uniE016","unicode":[57366],"xMin":146,"xMax":573,"yMin":119,"yMax":546,"leftSideBearing":146,"advanceWidth":926,"contours":[[{"x":146,"y":490,"onCurve":true},{"x":146,"y":518},{"x":165,"y":531,"onCurve":true},{"x":177,"y":543},{"x":202,"y":546,"onCurve":true},{"x":517,"y":546,"onCurve":true},{"x":542,"y":543},{"x":561,"y":531,"onCurve":true},{"x":573,"y":518},{"x":573,"y":490,"onCurve":true},{"x":573,"y":175,"onCurve":true},{"x":573,"y":153},{"x":561,"y":138,"onCurve":true},{"x":542,"y":125},{"x":517,"y":119,"onCurve":true},{"x":202,"y":119,"onCurve":true},{"x":177,"y":125},{"x":165,"y":138,"onCurve":true},{"x":146,"y":153},{"x":146,"y":175,"onCurve":true},{"x":146,"y":490,"onCurve":true}]]}; + } ); diff --git a/demo/js/editor.js b/demo/js/editor.js index 2312197..c9ba0f9 100644 --- a/demo/js/editor.js +++ b/demo/js/editor.js @@ -10,7 +10,7 @@ define( function(require) { var editor = require('editor/main'); - var shape_baidu = require('demo/../data/contours-12'); + var shape_baidu = require('demo/../data/contours-1'); var currentEditor; diff --git a/demo/js/segmentCross.js b/demo/js/segmentCross.js index 33895fd..4bbb6da 100644 --- a/demo/js/segmentCross.js +++ b/demo/js/segmentCross.js @@ -1,7 +1,7 @@ /** * @file quadraticBezier.js * @author mengke01 - * @date + * @date * @description * 二次贝塞尔直线相交演示 */ @@ -22,7 +22,7 @@ define( var width = canvas.offsetWidth; var height = canvas.offsetHeight; - var points = [{"x":563.5776234567902,"y":637.5320987654322,"onCurve":true},{"x":563.5776234567902,"y":433.53209876543207,"onCurve":true},{"x":543,"y":478},{"x":10000,"y":478}] ; + var points = [{"x":300,"y":300,"onCurve":true},{"x":350,"y":350,"onCurve":true},{"x":200,"y":200},{"x":400,"y":400}]; $('[data-index]').each(function(index, item) { if(!points[index]) { @@ -62,15 +62,15 @@ define( } function draw() { - + ctx.clearRect(0, 0, width, height); - //绘制2次贝塞尔曲线 + //绘制2次贝塞尔曲线 ctx.beginPath(); ctx.strokeStyle='black'; - ctx.moveTo(points[0].x, points[0].y); + ctx.moveTo(points[0].x, points[0].y); ctx.lineTo(points[1].x, points[1].y); - + ctx.moveTo(points[2].x, points[2].y); if (points[3]) { ctx.lineTo(points[3].x, points[3].y); @@ -89,7 +89,7 @@ define( if(r) { ctx.beginPath(); r.forEach(function(item) { - ctx.moveTo(item.x, item.y); + ctx.moveTo(item.x, item.y); ctx.arc(item.x, item.y, 4, 0, Math.PI * 2, true); }); ctx.fill(); @@ -101,7 +101,7 @@ define( }; entry.init(); - + return entry; } -); \ No newline at end of file +); diff --git a/src/graphics/isSegmentCross.js b/src/graphics/isSegmentCross.js index 4956402..869af29 100644 --- a/src/graphics/isSegmentCross.js +++ b/src/graphics/isSegmentCross.js @@ -99,6 +99,31 @@ define( var seg1 = [s1.y - s0.y, -(s1.x - s0.x), s0.y * (s1.x - s0.x) - s0.x * (s1.y - s0.y)]; var seg2 = [t1.y - t0.y, -(t1.x - t0.x), t0.y * (t1.x - t0.x) - t0.x * (t1.y - t0.y)]; + // 直线退化成点 + if (seg1[0] === seg1[1] && seg1[0] === seg1[2] && seg1[0] === 0) { + if ( + Math.abs((t1.y - s0.y) * (t0.x - s0.x) - (t0.y - s0.y) * (t1.x - s0.x)) <= 0.001 + && s0.x >= t0.x && s0.x <= t1.x + ) { + return [s0]; + } + else { + return false; + } + } + + if (seg2[0] === seg2[1] && seg2[0] === seg2[2] && seg2[0] === 0) { + if ( + Math.abs((s1.y - t0.y) * (s0.x - t0.x) - (s0.y - t0.y) * (s1.x - t0.x)) <= 0.001 + && t0.x >= s0.x && t0.x <= s1.x + ) { + return [t0]; + } + else { + return false; + } + } + // x轴重叠 if (seg1[1] === seg2[1] && seg1[1] === 0) { if (s1.x === t1.x) { diff --git a/src/graphics/pathJoin.js b/src/graphics/pathJoin.js index ace383b..1c6dd3b 100644 --- a/src/graphics/pathJoin.js +++ b/src/graphics/pathJoin.js @@ -84,7 +84,7 @@ define( return paths.filter(function (path) { return path.length > 2; }).map(function (path) { - return reducePath(deInterpolate(path)); + return reducePath(deInterpolate(path)).reverse(); }); } diff --git a/src/graphics/util.js b/src/graphics/util.js index d788d03..52d251d 100644 --- a/src/graphics/util.js +++ b/src/graphics/util.js @@ -94,7 +94,7 @@ define( * @return {number} */ function getPointHash(p) { - return Math.floor(7 * Math.floor(p.x * 11) + 31 * Math.floor(p.y * 131)); + return Math.floor(7 * Math.floor(p.x * 10) + 131 * Math.floor(p.y * 100)); } return { diff --git a/unittest/spec/graphics/isSegmentCross.spec.js b/unittest/spec/graphics/isSegmentCross.spec.js new file mode 100644 index 0000000..91703ef --- /dev/null +++ b/unittest/spec/graphics/isSegmentCross.spec.js @@ -0,0 +1,65 @@ + +define( + function (require) { + + var isSegmentCross = require('graphics/isSegmentCross'); + + describe('测试直线相交', function () { + + it('test cross', function () { + var result = isSegmentCross({"x":209,"y":358,"onCurve":true},{"x":341,"y":228,"onCurve":true},{"x":200,"y":200},{"x":396,"y":401}); + expect(result.length).toEqual(1); + expect(result[0].x).toBeCloseTo(283, 0); + expect(result[0].y).toBeCloseTo(285, 0); + }); + + it('test hoz', function () { + var result = isSegmentCross({"x":246,"y":272,"onCurve":true},{"x":289,"y":171,"onCurve":true},{"x":200,"y":200},{"x":343,"y":200}); + expect(result.length).toEqual(1); + expect(result[0].x).toBeCloseTo(276.6, 0); + expect(result[0].y).toEqual(200); + }); + + it('test vertical', function () { + var result = isSegmentCross({"x":144,"y":302,"onCurve":true},{"x":288,"y":172,"onCurve":true},{"x":201,"y":133},{"x":201,"y":351}); + expect(result.length).toEqual(1); + expect(result[0].x).toEqual(201); + expect(result[0].y).toBeCloseTo(250.5, 0); + }); + + it('test parallel', function () { + var result = isSegmentCross({"x":201,"y":314,"onCurve":true},{"x":201,"y":197,"onCurve":true},{"x":201,"y":151},{"x":201,"y":354}); + expect(result.length).toEqual(2); + expect(result[0].x).toEqual(201); + expect(result[0].y).toEqual(197); + expect(result[1].x).toEqual(201); + expect(result[1].y).toEqual(314); + }); + + + it('test parallel cross', function () { + var result = isSegmentCross({"x":201,"y":314,"onCurve":true},{"x":201,"y":197,"onCurve":true},{"x":201,"y":149},{"x":201,"y":267}); + expect(result.length).toEqual(2); + expect(result[0].x).toEqual(201); + expect(result[0].y).toEqual(197); + expect(result[1].x).toEqual(201); + expect(result[1].y).toEqual(267); + }); + + it('test parallel cross', function () { + var result = isSegmentCross({"x":300,"y":300,"onCurve":true},{"x":350,"y":350,"onCurve":true},{"x":200,"y":200},{"x":400,"y":400}); + expect(result.length).toEqual(2); + expect(result[0].x).toEqual(300); + expect(result[0].y).toEqual(300); + expect(result[1].x).toEqual(350); + expect(result[1].y).toEqual(350); + }); + + it('test parallel not cross', function () { + var result = isSegmentCross({"x":312,"y":261,"onCurve":true},{"x":375,"y":323,"onCurve":true},{"x":200,"y":200},{"x":400,"y":400}); + expect(result).toBe(false); + }); + + }); + } +); diff --git a/unittest/spec/main.js b/unittest/spec/main.js index 05a06ed..67eaef6 100644 --- a/unittest/spec/main.js +++ b/unittest/spec/main.js @@ -8,7 +8,6 @@ define( function (require) { // math - require('./math/gaussian-elimination.spec'); require('./math/getBezierQ2T.spec'); // ttf @@ -16,5 +15,6 @@ define( // graphics require('./graphics/vector.spec'); + require('./graphics/isSegmentCross.spec'); } ); diff --git a/unittest/spec/math/gaussian-elimination.spec.js b/unittest/spec/math/gaussian-elimination.spec.js deleted file mode 100644 index 6705b08..0000000 --- a/unittest/spec/math/gaussian-elimination.spec.js +++ /dev/null @@ -1,31 +0,0 @@ - -define( - function (require) { - - var gauss = require('math/gaussian-elimination'); - - describe('测试基本线性方程组', function () { - - it('test one', function () { - var $A = [[4]]; - var $x = [8]; - var $result = gauss($A, $x); - expect($result).toEqual([2]); - }); - - it('test two', function () { - var $A = [[1, 1], [2, 1]]; - var $x = [10, 16]; - var $result = gauss($A, $x); - expect($result).toEqual([6, 4]); - }); - - it('test three', function () { - var $A = [[1, 1, 1], [2, 1, 2], [1, 2, 3]]; - var $x = [6, 10, 14]; - var $result = gauss($A, $x); - expect($result).toEqual([1, 2, 3]); - }); - }); - } -);