UNPKG

11.6 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var fp_1 = require("lodash/fp");
4var geom_utils_1 = require("../geom-utils");
5var Angle_1 = require("../spinoffs/Angle");
6var edge_1 = require("./edge");
7/**
8 * getOrientationOfHyperedgeStartPoint
9 *
10 * Get orientation of the start point of an edge that is attached to another
11 * edge.
12 *
13 * @param referencedEdge {PvjsonEdge}
14 * @param startPoint {Point}
15 * @param otherPoint {Point}
16 * @return {Orientation}
17 */
18function getOrientationOfHyperedgeStartPoint(referencedEdge, startPoint, endPoint) {
19 if (!referencedEdge) {
20 throw new Error("Missing referencedEdge when calculating orientation of point attached to other edge.");
21 }
22 var currentPath = new geom_utils_1.SmartPath([startPoint, endPoint]);
23 var angleOfCurrentVectorSum = currentPath.sum.angle;
24 var referencedPath = new geom_utils_1.SmartPath(referencedEdge.points, referencedEdge);
25 // This is the angle of the line tangent to the referenced edge at
26 // startPoint.
27 var angleOfReferencedEdgeAtPointOnEdge = referencedPath.position(startPoint.attachmentDisplay.position[0]).angle;
28 var firstSegmentCalculations = geom_utils_1.START_SEGMENT_DETAILS_MAPS.map(function (startSegmentDetailsMap) {
29 /*
30 * referenced edge
31 * /
32 * /
33 * /.
34 * / angle (rad)
35 * / .
36 * /--------------
37 * / ^ | --------------
38 * / | | | |
39 * | ------------| |
40 * | | |
41 * firstSegment --------------
42 * (of current edge)
43 *
44 */
45 var orientation = startSegmentDetailsMap.orientation;
46 var orientationX = orientation[0], orientationY = orientation[1];
47 var firstSegmentEndPoint = {
48 x: startPoint.x + edge_1.DEFAULT_STUB_LENGTH * orientationX,
49 y: startPoint.y + edge_1.DEFAULT_STUB_LENGTH * orientationY
50 };
51 return {
52 firstSegmentEndPoint: firstSegmentEndPoint,
53 endPoint: endPoint,
54 emanationAngle: startSegmentDetailsMap.angle,
55 orientation: orientation
56 };
57 })
58 .map(function (_a) {
59 var firstSegmentEndPoint = _a.firstSegmentEndPoint, endPoint = _a.endPoint, emanationAngle = _a.emanationAngle, orientation = _a.orientation;
60 var isSameSide = geom_utils_1.sameSide(referencedEdge.points[0], fp_1.last(referencedEdge.points), firstSegmentEndPoint, endPoint);
61 var angleBetweenOrientationVectorAndCurrentEdge = Angle_1.distance(emanationAngle, angleOfCurrentVectorSum);
62 var angleBetweenOrientationVectorAndReferencedEdge = Angle_1.distance(angleOfReferencedEdgeAtPointOnEdge, emanationAngle);
63 return {
64 isSameSide: isSameSide,
65 angleBetweenOrientationVectorAndCurrentEdge: angleBetweenOrientationVectorAndCurrentEdge,
66 angleBetweenOrientationVectorAndVectorPerpendicularToReferencedEdge: Math.abs(angleBetweenOrientationVectorAndReferencedEdge - Math.PI / 2),
67 orientation: orientation
68 };
69 })
70 .sort(function (a, b) {
71 if (a.isSameSide && !b.isSameSide) {
72 return -1;
73 }
74 else if (!a.isSameSide && b.isSameSide) {
75 return 1;
76 }
77 else {
78 if (a.angleBetweenOrientationVectorAndVectorPerpendicularToReferencedEdge <
79 b.angleBetweenOrientationVectorAndVectorPerpendicularToReferencedEdge) {
80 return -1;
81 }
82 else if (a.angleBetweenOrientationVectorAndVectorPerpendicularToReferencedEdge >
83 b.angleBetweenOrientationVectorAndVectorPerpendicularToReferencedEdge) {
84 return 1;
85 }
86 else {
87 if (a.angleBetweenOrientationVectorAndCurrentEdge <
88 b.angleBetweenOrientationVectorAndCurrentEdge) {
89 return -1;
90 }
91 else if (a.angleBetweenOrientationVectorAndCurrentEdge >
92 b.angleBetweenOrientationVectorAndCurrentEdge) {
93 return 1;
94 }
95 else {
96 return 0;
97 }
98 }
99 }
100 });
101 var formatted = fp_1.map(function (firstSegmentCalculation) {
102 var angleBetweenOrientationVectorAndVectorPerpendicularToReferencedEdge = firstSegmentCalculation.angleBetweenOrientationVectorAndVectorPerpendicularToReferencedEdge, angleBetweenOrientationVectorAndCurrentEdge = firstSegmentCalculation.angleBetweenOrientationVectorAndCurrentEdge, isSameSide = firstSegmentCalculation.isSameSide;
103 return {
104 angleBetweenOrientationVectorAndVectorPerpendicularToReferencedEdge: String(angleBetweenOrientationVectorAndVectorPerpendicularToReferencedEdge /
105 Math.PI) + " * PI",
106 angleBetweenOrientationVectorAndCurrentEdge: String(angleBetweenOrientationVectorAndCurrentEdge / Math.PI) + " * PI",
107 isSameSide: isSameSide
108 };
109 }, firstSegmentCalculations);
110 return firstSegmentCalculations[0].orientation;
111}
112exports.getOrientationOfHyperedgeStartPoint = getOrientationOfHyperedgeStartPoint;
113// Uses the same sorting criteria as getOrientationOfHyperedgeStartPoint,
114// except with the obvious changes in direction to account for being the
115// endPoint instead of the startPoint.
116exports.getOrientationOfHyperedgeEndPoint = fp_1.flow(getOrientationOfHyperedgeStartPoint, geom_utils_1.flipOrientation);
117// Validate orientation of attachment display.
118//
119// When attached to a normal Node, we can calculate the orientation immediately
120// so this will return true right away.
121// When attached to an Edge or Group, we need to do more processing,
122// so this will at least initially return false.
123// TODO: Not sure whether the orientation of a point attached to an Edge or a
124// Group is ever set.
125function validateOrientation(orientation) {
126 return !!orientation && fp_1.isFinite(orientation[0]) && fp_1.isFinite(orientation[1]);
127}
128exports.validateOrientation = validateOrientation;
129/*
130 // NOTE: PathVisio-Java appears to try to avoid making an edge
131 // terminate into another edge at an approach angle of anything
132 // less than about 30 deg.
133 if (endPoint.hasOwnProperty("isAttachedTo")) {
134 const referencedEndPath = new SmartPath(endEntity.points, endEntity);
135 const angleOfReferencedEdgeAtPointOnEdge = referencedEndPath.position(
136 startPoint.attachmentDisplay.position[0]
137 ).angle;
138 if (
139 Math.abs(
140 START_SIDE_TO_EMANATION_ANGLE_MAPPINGS[endSide] -
141 angleOfReferencedEdgeAtPointOnEdge
142 ) <
143 30 * (Math.PI / 180)
144 ) {
145 // edge1 is almost parallel with edge2, making it hard to read, so we need to recalculate.
146 endPoint.orientation = getOrientationOfHyperedgeEndPoint(
147 endEntity,
148 endPoint,
149 startPoint
150 );
151 return getAndCompareSides(startPoint, endPoint, endEntity);
152 }
153 }
154//*/
155//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZW50YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZWRnZS9vcmllbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGdDQUFzRDtBQUN0RCw0Q0FNdUI7QUFDdkIsMkNBQTZDO0FBUTdDLCtCQUE2QztBQUU3Qzs7Ozs7Ozs7OztHQVVHO0FBQ0gsNkNBQ0UsY0FBMEIsRUFDMUIsVUFBd0MsRUFDeEMsUUFBc0M7SUFFdEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQ2Isc0ZBQXNGLENBQ3ZGLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBTSxXQUFXLEdBQUcsSUFBSSxzQkFBUyxDQUFDLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDMUQsSUFBTSx1QkFBdUIsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztJQUN0RCxJQUFNLGNBQWMsR0FBRyxJQUFJLHNCQUFTLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztJQUU1RSxrRUFBa0U7SUFDbEUsY0FBYztJQUNkLElBQU0sa0NBQWtDLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FDaEUsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FDekMsQ0FBQyxLQUFLLENBQUM7SUFFUixJQUFNLHdCQUF3QixHQUFHLHVDQUEwQixDQUFDLEdBQUcsQ0FBQyxVQUM5RCxzQkFBc0I7UUFFdEI7Ozs7Ozs7Ozs7Ozs7OztlQWVDO1FBRU8sSUFBQSxnREFBVyxDQUE0QjtRQUN4QyxJQUFBLDZCQUFZLEVBQUUsNkJBQVksQ0FBZ0I7UUFDakQsSUFBTSxvQkFBb0IsR0FBaUI7WUFDekMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEdBQUcsMEJBQW1CLEdBQUcsWUFBWTtZQUNwRCxDQUFDLEVBQUUsVUFBVSxDQUFD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
\No newline at end of file