basant307/AI_Governance_Project
048
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;