CoolFace
Datasetpublic

basant307/AI_Governance_Project

sourceHugging Faceapache-2.0updated 2mo agoView on Hugging Face
0likes48downloads
arrow-shapes.mjs344 linesDownload Raw Back to base
1import * as math from '../../../math.mjs';2import * as is from '../../../is.mjs';3import * as util from '../../../util/index.mjs';4 5var BRp = {};6 7BRp.arrowShapeWidth = 0.3;8 9BRp.registerArrowShapes = function(){10  var arrowShapes = this.arrowShapes = {};11  var renderer = this;12 13  // Contract for arrow shapes:14  // 0, 0 is arrow tip15  // (0, 1) is direction towards node16  // (1, 0) is right17  //18  // functional api:19  // collide: check x, y in shape20  // roughCollide: called before collide, no false negatives21  // draw: draw22  // spacing: dist(arrowTip, nodeBoundary)23  // gap: dist(edgeTip, nodeBoundary), edgeTip may != arrowTip24 25  var bbCollide = function( x, y, size, angle, translation, edgeWidth, padding ){26    var x1 = translation.x - size / 2 - padding;27    var x2 = translation.x + size / 2 + padding;28    var y1 = translation.y - size / 2 - padding;29    var y2 = translation.y + size / 2 + padding;30 31    var inside = (x1 <= x && x <= x2) && (y1 <= y && y <= y2);32 33    return inside;34  };35 36  var transform = function( x, y, size, angle, translation ){37    var xRotated = x * Math.cos( angle ) - y * Math.sin( angle );38    var yRotated = x * Math.sin( angle ) + y * Math.cos( angle );39 40    var xScaled = xRotated * size;41    var yScaled = yRotated * size;42 43    var xTranslated = xScaled + translation.x;44    var yTranslated = yScaled + translation.y;45 46    return {47      x: xTranslated,48      y: yTranslated49    };50  };51 52  var transformPoints = function( pts, size, angle, translation ){53    var retPts = [];54 55    for( var i = 0; i < pts.length; i += 2 ){56      var x = pts[ i ];57      var y = pts[ i + 1];58 59      retPts.push( transform( x, y, size, angle, translation ) );60    }61 62    return retPts;63  };64 65  var pointsToArr = function( pts ){66    var ret = [];67 68    for( var i = 0; i < pts.length; i++ ){69      var p = pts[ i ];70 71      ret.push( p.x, p.y );72    }73 74    return ret;75  };76 77  var standardGap = function( edge ) {78    return edge.pstyle( 'width' ).pfValue * edge.pstyle( 'arrow-scale' ).pfValue * 2;79  };80 81  var defineArrowShape = function( name, defn ){82    if( is.string( defn ) ){83      defn = arrowShapes[ defn ];84    }85 86    arrowShapes[ name ] = util.extend( {87      name: name,88 89      points: [90        -0.15, -0.3,91        0.15, -0.3,92        0.15, 0.3,93        -0.15, 0.394      ],95 96      collide: function( x, y, size, angle, translation, padding ){97        var points = pointsToArr( transformPoints( this.points, size + 2 * padding, angle, translation ) );98        var inside = math.pointInsidePolygonPoints( x, y, points );99 100        return inside;101      },102 103      roughCollide: bbCollide,104 105      draw: function( context, size, angle, translation ){106        var points = transformPoints( this.points, size, angle, translation );107 108        renderer.arrowShapeImpl( 'polygon' )( context, points );109      },110 111      spacing: function( edge ){112        return 0;113      },114 115      gap: standardGap116    }, defn );117  };118 119  defineArrowShape( 'none', {120    collide: util.falsify,121 122    roughCollide: util.falsify,123 124    draw: util.noop,125 126    spacing: util.zeroify,127 128    gap: util.zeroify129  } );130 131  defineArrowShape( 'triangle', {132    points: [133      -0.15, -0.3,134      0, 0,135      0.15, -0.3136    ]137  } );138 139  defineArrowShape( 'arrow', 'triangle' );140 141  defineArrowShape( 'triangle-backcurve', {142    points: arrowShapes[ 'triangle' ].points,143 144    controlPoint: [ 0, -0.15 ],145 146    roughCollide: bbCollide,147 148    draw: function( context, size, angle, translation, edgeWidth ){149      var ptsTrans = transformPoints( this.points, size, angle, translation );150      var ctrlPt = this.controlPoint;151      var ctrlPtTrans = transform( ctrlPt[0], ctrlPt[1], size, angle, translation );152 153      renderer.arrowShapeImpl( this.name )( context, ptsTrans, ctrlPtTrans );154    },155 156    gap: function( edge ) {157      return standardGap(edge) * 0.8;158    }159  } );160 161  defineArrowShape( 'triangle-tee', {162    points: [163      0, 0,164      0.15, -0.3,165      -0.15, -0.3,166      0, 0167    ],168 169    pointsTee: [170      -0.15, -0.4,171      -0.15, -0.5,172      0.15, -0.5,173      0.15, -0.4174    ],175 176    collide: function( x, y, size, angle, translation, edgeWidth, padding ){177      var triPts = pointsToArr( transformPoints( this.points, size + 2 * padding, angle, translation ) );178      var teePts = pointsToArr( transformPoints( this.pointsTee, size + 2 * padding, angle, translation ) );179 180      var inside = math.pointInsidePolygonPoints( x, y, triPts ) || math.pointInsidePolygonPoints( x, y, teePts );181 182      return inside;183    },184 185    draw: function( context, size, angle, translation, edgeWidth ){186      var triPts = transformPoints( this.points, size, angle, translation );187      var teePts = transformPoints( this.pointsTee, size, angle, translation );188 189      renderer.arrowShapeImpl( this.name )( context, triPts, teePts );190    }191  } );192 193  defineArrowShape( 'circle-triangle', {194    radius: 0.15,195    pointsTr: [0, -0.15, 0.15, -0.45, -0.15, -0.45, 0, -0.15],196    collide: function collide(x, y, size, angle, translation, edgeWidth, padding) {197      var t = translation;198      var circleInside = Math.pow(t.x - x, 2) + Math.pow(t.y - y, 2) <= Math.pow((size + 2 * padding) * this.radius, 2);199      var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation));200      return math.pointInsidePolygonPoints(x, y, triPts) || circleInside;201    },202    draw: function draw(context, size, angle, translation, edgeWidth) {        203      var triPts = transformPoints(this.pointsTr, size, angle, translation);204      renderer.arrowShapeImpl(this.name)(context, triPts, translation.x, translation.y, this.radius * size);205    },206    spacing: function spacing(edge) {207      return renderer.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.radius;208    }209  } );210 211  defineArrowShape( 'triangle-cross', {212    points: [213      0, 0,214      0.15, -0.3,215      -0.15, -0.3,216      0, 0217    ],218 219    baseCrossLinePts: [220      -0.15, -0.4,    // first half of the rectangle221      -0.15, -0.4,222      0.15, -0.4,    // second half of the rectangle223      0.15, -0.4224    ],225 226    crossLinePts: function( size, edgeWidth ){227      // shift points so that the distance between the cross points matches edge width228      var p = this.baseCrossLinePts.slice();229      var shiftFactor = edgeWidth / size;230      var y0 = 3;231      var y1 = 5;232 233      p[y0] = p[y0] - shiftFactor;234      p[y1] = p[y1] - shiftFactor;235 236      return p;237    },238 239    collide: function( x, y, size, angle, translation, edgeWidth, padding ){240      var triPts = pointsToArr( transformPoints( this.points, size + 2 * padding, angle, translation ) );241      var teePts = pointsToArr( transformPoints( this.crossLinePts( size, edgeWidth ), size + 2 * padding, angle, translation ) );242      var inside = math.pointInsidePolygonPoints( x, y, triPts ) || math.pointInsidePolygonPoints( x, y, teePts );243 244      return inside;245    },246 247    draw: function( context, size, angle, translation, edgeWidth ){248      var triPts = transformPoints( this.points, size, angle, translation );249      var crossLinePts = transformPoints( this.crossLinePts( size, edgeWidth ), size, angle, translation );250 251      renderer.arrowShapeImpl( this.name )( context, triPts, crossLinePts );252    }253  } );254 255  defineArrowShape( 'vee', {256    points: [257      -0.15, -0.3,258      0, 0,259      0.15, -0.3,260      0, -0.15261    ],262 263    gap: function( edge ){264      return standardGap(edge) * 0.525;265    }266  } );267 268  defineArrowShape( 'circle', {269    radius: 0.15,270 271    collide: function( x, y, size, angle, translation, edgeWidth, padding ){272      var t = translation;273      var inside = ( Math.pow( t.x - x, 2 ) + Math.pow( t.y - y, 2 ) <= Math.pow( (size + 2 * padding) * this.radius, 2 ) );274 275      return inside;276    },277 278    draw: function( context, size, angle, translation, edgeWidth ){279      renderer.arrowShapeImpl( this.name )( context, translation.x, translation.y, this.radius * size );280    },281 282    spacing: function( edge ){283      return renderer.getArrowWidth( edge.pstyle( 'width' ).pfValue, edge.pstyle( 'arrow-scale' ).value )284        * this.radius;285    }286  } );287 288  defineArrowShape( 'tee', {289    points: [290      -0.15, 0,291      -0.15, -0.1,292      0.15, -0.1,293      0.15, 0294    ],295 296    spacing: function( edge ){297      return 1;298    },299 300    gap: function( edge ){301      return 1;302    }303  } );304 305  defineArrowShape( 'square', {306    points: [307      -0.15, 0.00,308      0.15, 0.00,309      0.15, -0.3,310      -0.15, -0.3311    ]312  } );313 314  defineArrowShape( 'diamond', {315    points: [316      -0.15, -0.15,317      0, -0.3,318      0.15, -0.15,319      0, 0320    ],321 322    gap: function( edge ){323      return edge.pstyle( 'width' ).pfValue * edge.pstyle( 'arrow-scale' ).value;324    }325  } );326 327  defineArrowShape( 'chevron', {328    points: [329      0, 0,330      -0.15, -0.15,331      -0.1, -0.2,332      0, -0.1,333      0.1, -0.2,334      0.15, -0.15335    ],336 337    gap: function( edge ){338      return 0.95 * edge.pstyle( 'width' ).pfValue * edge.pstyle( 'arrow-scale' ).value;339    }340  } );341 342};343 344export default BRp;
basant307/AI_Governance_Project · CoolFace