1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | var fp_1 = require("lodash/fp");
|
4 | var geom_utils_1 = require("../geom-utils");
|
5 | var Angle_1 = require("../spinoffs/Angle");
|
6 | var 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 | */
|
18 | function 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 | }
|
112 | exports.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.
|
116 | exports.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.
|
125 | function validateOrientation(orientation) {
|
126 | return !!orientation && fp_1.isFinite(orientation[0]) && fp_1.isFinite(orientation[1]);
|
127 | }
|
128 | exports.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 |