mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2025-01-08 05:42:07 -05:00
Added Random and Failing Tests
This commit is contained in:
parent
4e2680e605
commit
5bdf3bce91
2 changed files with 1129 additions and 1024 deletions
|
@ -35,6 +35,11 @@
|
||||||
hari</p>
|
hari</p>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
|
<svg class="hide" version="1.1" id="svgrandom1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
width="200px" height="200px" viewBox="0 0 200 200" enable-background="new 0 0 200 200" xml:space="preserve">
|
||||||
|
<path d="M121.938,15.632c-13.717-12.536 -86.488,106.314 -97.28853,96.70168c-10.79979,-9.61253 74.75206,22.03522 62.05339,14.94206c-12.69866,-7.09316 -39.33589,-120.29063 -50.13215,-122.55235c-10.79626,-2.26173 20.61549,120.92844 6.21122,120.91582c-14.40427,-0.01263 95.8736,-97.47028 79.15607,-110.0072z" />
|
||||||
|
<path d="M112.56135,26.45534c-11.3324,-19.66938 2.46546,15.5079 -15.74899,1.46029c-18.21444,-14.04761 -66.32694,49.96681 -85.68888,45.03851c-19.36194,-4.9283 25.00762,66.13871 9.65758,51.54906c-15.35004,-14.58966 80.2128,-61.80948 76.57166,-81.27628c-3.64115,-19.4668 26.54102,2.89779 15.20863,-16.77158z" />
|
||||||
|
</svg>
|
||||||
|
|
||||||
<svg class="hide" version="1.1" id="glyphsys" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
<svg class="hide" version="1.1" id="glyphsys" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
width="200px" height="200px" viewBox="0 0 200 200" enable-background="new 0 0 200 200" xml:space="preserve">
|
width="200px" height="200px" viewBox="0 0 200 200" enable-background="new 0 0 200 200" xml:space="preserve">
|
||||||
|
|
|
@ -18,7 +18,7 @@ if (window.performance && window.performance.now) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function runTests() {
|
function runTests() {
|
||||||
var caption, pathA, pathB, group, testdata = [], testQueued = 0, testExecuted = 0;;
|
var caption, pathA, pathB, group, testdata = [], randomtestdata = [], testQueued = 0, testExecuted = 0;
|
||||||
|
|
||||||
var container = document.getElementById( 'container' );
|
var container = document.getElementById( 'container' );
|
||||||
|
|
||||||
|
@ -33,7 +33,11 @@ function runTests() {
|
||||||
console.log('\n' + testName);
|
console.log('\n' + testName);
|
||||||
paper.setup(canvas);
|
paper.setup(canvas);
|
||||||
var paths = handler();
|
var paths = handler();
|
||||||
testIntersections(paths[0], paths[1], caption, testName, testdata);
|
var success = testIntersections(paths[0], paths[1], caption, testName, testdata);
|
||||||
|
if( !success ){
|
||||||
|
window.p1 = paths[0].exportSVG();
|
||||||
|
window.p2 = paths[1].exportSVG();
|
||||||
|
}
|
||||||
testExecuted++;
|
testExecuted++;
|
||||||
if( testExecuted === testQueued ){
|
if( testExecuted === testQueued ){
|
||||||
plotData();
|
plotData();
|
||||||
|
@ -42,13 +46,28 @@ function runTests() {
|
||||||
return caption;
|
return caption;
|
||||||
}
|
}
|
||||||
|
|
||||||
var caption = document.createElement('h3');
|
// var caption = document.createElement('h3');
|
||||||
caption.appendChild(document.createTextNode("Randomised tests"));
|
// caption.appendChild(document.createTextNode("Randomised tests (may take a while...)"));
|
||||||
container.appendChild(caption);
|
// container.appendChild(caption);
|
||||||
var count = 100, randomData = [];
|
// var canvas = document.createElement('CANVAS');
|
||||||
while( count-- ){
|
// container.appendChild( canvas );
|
||||||
|
// paper.setup( canvas );
|
||||||
|
// doRandomTests( randomtestdata );
|
||||||
|
// window.d = randomtestdata;
|
||||||
|
// container.removeChild( canvas );
|
||||||
|
|
||||||
}
|
// runTest('random', function(){
|
||||||
|
// pathA = getRandomPath(5);
|
||||||
|
// pathB = getRandomPath(5);
|
||||||
|
// return [pathA, pathB];
|
||||||
|
// });
|
||||||
|
|
||||||
|
runTest('random 2', function(){
|
||||||
|
group = paper.project.importSVG( document.getElementById( 'svgrandom1' ) );
|
||||||
|
pathA = group.children[0];
|
||||||
|
pathB = group.children[1];
|
||||||
|
return [pathA, pathB];
|
||||||
|
});
|
||||||
|
|
||||||
runTest('Overlapping circles', function(){
|
runTest('Overlapping circles', function(){
|
||||||
pathA = new Path.Circle(new Point(80, 110), 50);
|
pathA = new Path.Circle(new Point(80, 110), 50);
|
||||||
|
@ -207,9 +226,6 @@ function runTests() {
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// Do randomised tests
|
|
||||||
|
|
||||||
|
|
||||||
// Plot the run times
|
// Plot the run times
|
||||||
function plotData(){
|
function plotData(){
|
||||||
prepareTest( 'Results', container, true );
|
prepareTest( 'Results', container, true );
|
||||||
|
@ -320,6 +336,7 @@ function runTests() {
|
||||||
txt = new PointText([630, ny+5]);
|
txt = new PointText([630, ny+5]);
|
||||||
txt.fillColor = '#000';
|
txt.fillColor = '#000';
|
||||||
txt.content = avgSpeedup + ' times';
|
txt.content = avgSpeedup + ' times';
|
||||||
|
view.draw();
|
||||||
|
|
||||||
var tool = new Tool();
|
var tool = new Tool();
|
||||||
tool.onMouseMove = function( e ){
|
tool.onMouseMove = function( e ){
|
||||||
|
@ -390,8 +407,8 @@ var pathStyleBoolean = {
|
||||||
|
|
||||||
// Better if path1 and path2 fit nicely inside a 200x200 pixels rect
|
// Better if path1 and path2 fit nicely inside a 200x200 pixels rect
|
||||||
function testIntersections( path1, path2, caption, testname, testdata, nomark) {
|
function testIntersections( path1, path2, caption, testname, testdata, nomark) {
|
||||||
var i, l, maxCount = 10, count = maxCount, st, t1, t2,
|
var i, l, maxCount = 1, count = maxCount, st, t1, t2,
|
||||||
ixsPaper, ixsFatline, success = false;
|
ixsPaper, ixsFatline, success = false, maxdiff = -Infinity;
|
||||||
try{
|
try{
|
||||||
path1.style = path2.style = pathStyleNormal;
|
path1.style = path2.style = pathStyleNormal;
|
||||||
|
|
||||||
|
@ -412,11 +429,22 @@ function testIntersections( path1, path2, caption, testname, testdata, nomark) {
|
||||||
t2 = (getTimestamp() - st) / maxCount;
|
t2 = (getTimestamp() - st) / maxCount;
|
||||||
if( !nomark ) console.timeEnd('fatline x ' + maxCount);
|
if( !nomark ) console.timeEnd('fatline x ' + maxCount);
|
||||||
|
|
||||||
var equal = true;
|
var found = 0, tol = 0.1;
|
||||||
for(i=0, l=ixsFatline.length; i<l && ixsPaper[i]; i++){
|
if( ixsFatline.length === ixsPaper.length ){
|
||||||
equal = equal && ixsPaper[i].point.equals( ixsPaper[i].point );
|
for(i=0, l=ixsFatline.length; i<l; i++){
|
||||||
|
pa = ixsFatline[i].point;
|
||||||
|
for (j = 0; j < ixsPaper.length; j++) {
|
||||||
|
if( !ixsPaper[j]._found ){
|
||||||
|
pb = ixsPaper[j].point;
|
||||||
|
if( Math.abs( pa.x - pb.x ) < tol && Math.abs( pa.y - pb.y ) < tol ){
|
||||||
|
++found;
|
||||||
|
ixsPaper[j]._found = true;
|
||||||
}
|
}
|
||||||
success = ( ixsPaper.length === ixsFatline.length ) && equal;
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
success = ixsPaper.length === found;
|
||||||
|
|
||||||
if( !nomark ){
|
if( !nomark ){
|
||||||
markIntersections( ixsPaper, '#00f', 'paperjs' );
|
markIntersections( ixsPaper, '#00f', 'paperjs' );
|
||||||
|
@ -437,7 +465,79 @@ function testIntersections( path1, path2, caption, testname, testdata, nomark) {
|
||||||
fatTime: t2,
|
fatTime: t2,
|
||||||
success: success
|
success: success
|
||||||
});
|
});
|
||||||
|
console.log( found );
|
||||||
}
|
}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
function doRandomTests( testdata ){
|
||||||
|
var p1 = new Path(), p2 = new Path(), ixspaper, ixsfat;
|
||||||
|
var seg = 5, maxseg = 20, maxiter = 10;
|
||||||
|
var i, j, halfseg = (maxseg / 2) | 0;
|
||||||
|
var p, hi, ho, st, t1, t2, success;
|
||||||
|
while( seg <= maxseg ){
|
||||||
|
for (i = 0; i < maxiter; i++) {
|
||||||
|
p1.removeSegments();
|
||||||
|
p2.removeSegments();
|
||||||
|
for (j = 0; j < seg; j++) {
|
||||||
|
p = new Point.random().multiply( [100, 100] );
|
||||||
|
v = new Point.random().multiply( [20, 20] );
|
||||||
|
p1.add( new Segment( p, v, v.multiply(-1) ) );
|
||||||
|
p1.closed = true;
|
||||||
|
p = new Point.random().multiply( [100, 100] );
|
||||||
|
v = new Point.random().multiply( [20, 20] );
|
||||||
|
p2.add( new Segment( p, v, v.multiply(-1) ) );
|
||||||
|
p2.closed = true;
|
||||||
|
}
|
||||||
|
st = getTimestamp();
|
||||||
|
ixspaper = p1.getIntersections( p2 );
|
||||||
|
t1 = (getTimestamp() - st);
|
||||||
|
st = getTimestamp();
|
||||||
|
ixsfat = getIntersections2( p1, p2 );
|
||||||
|
t2 = (getTimestamp() - st);
|
||||||
|
// Check against paperjs output
|
||||||
|
var found = 0, tol = 1;
|
||||||
|
if( ixsfat.length === ixspaper.length ){
|
||||||
|
for(i=0, l=ixsfat.length; i<l; i++){
|
||||||
|
pa = ixsfat[i].point;
|
||||||
|
for (j = 0; j < ixspaper.length; j++) {
|
||||||
|
if( !ixspaper[j]._found ){
|
||||||
|
pb = ixspaper[j].point;
|
||||||
|
if( Math.abs( pa.x - pb.x ) < tol && Math.abs( pa.y - pb.y ) < tol ){
|
||||||
|
++found;
|
||||||
|
ixspaper[j]._found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
success = ixspaper.length === found;
|
||||||
|
testdata.push({
|
||||||
|
curves: seg,
|
||||||
|
ixsfat: ixsfat.length,
|
||||||
|
ixspaper: ixspaper.length,
|
||||||
|
ratio: ixsfat.length / (seg),
|
||||||
|
paperTime: t1,
|
||||||
|
fatTime: t2,
|
||||||
|
speedup: t1 / t2,
|
||||||
|
success: success
|
||||||
|
});
|
||||||
|
}
|
||||||
|
++seg;
|
||||||
|
if( seg === halfseg ) maxiter = (maxiter / 2) | 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getRandomPath(seg){
|
||||||
|
seg = seg || 3;
|
||||||
|
var p = new Path(), pnt, hi, ho, v;
|
||||||
|
for (j = 0; j < seg; j++) {
|
||||||
|
pnt = new Point.random().multiply( [130, 130] );
|
||||||
|
v = new Point.random().multiply( [20, 20] );
|
||||||
|
p.add( new Segment( pnt, v, v.multiply(-1) ) );
|
||||||
|
p.closed = true;
|
||||||
|
}
|
||||||
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
function markIntersections( ixs, c, txt ){
|
function markIntersections( ixs, c, txt ){
|
||||||
|
|
Loading…
Reference in a new issue