mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-08-28 20:56:48 +02:00
Add fix for flipped edge markers
This commit is contained in:
@@ -52,18 +52,15 @@ export const getLineFunctionsWithOffset = (
|
|||||||
data: (Point | [number, number])[]
|
data: (Point | [number, number])[]
|
||||||
) {
|
) {
|
||||||
let offset = 0;
|
let offset = 0;
|
||||||
|
const DIRECTION =
|
||||||
|
pointTransformer(data[0]).x < pointTransformer(data[data.length - 1]).x ? 'left' : 'right';
|
||||||
if (i === 0 && Object.hasOwn(markerOffsets, edge.arrowTypeStart)) {
|
if (i === 0 && Object.hasOwn(markerOffsets, edge.arrowTypeStart)) {
|
||||||
// Handle first point
|
|
||||||
// Calculate the angle and delta between the first two points
|
|
||||||
const { angle, deltaX } = calculateDeltaAndAngle(data[0], data[1]);
|
const { angle, deltaX } = calculateDeltaAndAngle(data[0], data[1]);
|
||||||
// Calculate the offset based on the angle and the marker's dimensions
|
|
||||||
offset =
|
offset =
|
||||||
markerOffsets[edge.arrowTypeStart as keyof typeof markerOffsets] *
|
markerOffsets[edge.arrowTypeStart as keyof typeof markerOffsets] *
|
||||||
Math.cos(angle) *
|
Math.cos(angle) *
|
||||||
(deltaX >= 0 ? 1 : -1);
|
(deltaX >= 0 ? 1 : -1);
|
||||||
} else if (i === data.length - 1 && Object.hasOwn(markerOffsets, edge.arrowTypeEnd)) {
|
} else if (i === data.length - 1 && Object.hasOwn(markerOffsets, edge.arrowTypeEnd)) {
|
||||||
// Handle last point
|
|
||||||
// Calculate the angle and delta between the last two points
|
|
||||||
const { angle, deltaX } = calculateDeltaAndAngle(
|
const { angle, deltaX } = calculateDeltaAndAngle(
|
||||||
data[data.length - 1],
|
data[data.length - 1],
|
||||||
data[data.length - 2]
|
data[data.length - 2]
|
||||||
@@ -73,6 +70,41 @@ export const getLineFunctionsWithOffset = (
|
|||||||
Math.cos(angle) *
|
Math.cos(angle) *
|
||||||
(deltaX >= 0 ? 1 : -1);
|
(deltaX >= 0 ? 1 : -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const differenceToEnd = Math.abs(
|
||||||
|
pointTransformer(d).x - pointTransformer(data[data.length - 1]).x
|
||||||
|
);
|
||||||
|
const differenceInYEnd = Math.abs(
|
||||||
|
pointTransformer(d).y - pointTransformer(data[data.length - 1]).y
|
||||||
|
);
|
||||||
|
const differenceToStart = Math.abs(pointTransformer(d).x - pointTransformer(data[0]).x);
|
||||||
|
const differenceInYStart = Math.abs(pointTransformer(d).y - pointTransformer(data[0]).y);
|
||||||
|
const startMarkerHeight = markerOffsets[edge.arrowTypeStart as keyof typeof markerOffsets];
|
||||||
|
const endMarkerHeight = markerOffsets[edge.arrowTypeEnd as keyof typeof markerOffsets];
|
||||||
|
const extraRoom = 1;
|
||||||
|
|
||||||
|
// Adjust the offset if the difference is smaller than the marker height
|
||||||
|
if (
|
||||||
|
differenceToEnd < endMarkerHeight &&
|
||||||
|
differenceToEnd > 0 &&
|
||||||
|
differenceInYEnd < endMarkerHeight
|
||||||
|
) {
|
||||||
|
let adjustment = endMarkerHeight + extraRoom - differenceToEnd;
|
||||||
|
adjustment *= DIRECTION === 'right' ? -1 : 1;
|
||||||
|
// Adjust the offset by the amount needed to fit the marker
|
||||||
|
offset -= adjustment;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
differenceToStart < startMarkerHeight &&
|
||||||
|
differenceToStart > 0 &&
|
||||||
|
differenceInYStart < startMarkerHeight
|
||||||
|
) {
|
||||||
|
let adjustment = startMarkerHeight + extraRoom - differenceToStart;
|
||||||
|
adjustment *= DIRECTION === 'right' ? -1 : 1;
|
||||||
|
offset += adjustment;
|
||||||
|
}
|
||||||
|
|
||||||
return pointTransformer(d).x + offset;
|
return pointTransformer(d).x + offset;
|
||||||
},
|
},
|
||||||
y: function (
|
y: function (
|
||||||
@@ -81,8 +113,9 @@ export const getLineFunctionsWithOffset = (
|
|||||||
i: number,
|
i: number,
|
||||||
data: (Point | [number, number])[]
|
data: (Point | [number, number])[]
|
||||||
) {
|
) {
|
||||||
// Same handling as X above
|
|
||||||
let offset = 0;
|
let offset = 0;
|
||||||
|
const DIRECTION =
|
||||||
|
pointTransformer(data[0]).y < pointTransformer(data[data.length - 1]).y ? 'down' : 'up';
|
||||||
if (i === 0 && Object.hasOwn(markerOffsets, edge.arrowTypeStart)) {
|
if (i === 0 && Object.hasOwn(markerOffsets, edge.arrowTypeStart)) {
|
||||||
const { angle, deltaY } = calculateDeltaAndAngle(data[0], data[1]);
|
const { angle, deltaY } = calculateDeltaAndAngle(data[0], data[1]);
|
||||||
offset =
|
offset =
|
||||||
@@ -99,6 +132,40 @@ export const getLineFunctionsWithOffset = (
|
|||||||
Math.abs(Math.sin(angle)) *
|
Math.abs(Math.sin(angle)) *
|
||||||
(deltaY >= 0 ? 1 : -1);
|
(deltaY >= 0 ? 1 : -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const differenceToEnd = Math.abs(
|
||||||
|
pointTransformer(d).y - pointTransformer(data[data.length - 1]).y
|
||||||
|
);
|
||||||
|
const differenceInXEnd = Math.abs(
|
||||||
|
pointTransformer(d).x - pointTransformer(data[data.length - 1]).x
|
||||||
|
);
|
||||||
|
const differenceToStart = Math.abs(pointTransformer(d).y - pointTransformer(data[0]).y);
|
||||||
|
const differenceInXStart = Math.abs(pointTransformer(d).x - pointTransformer(data[0]).x);
|
||||||
|
const startMarkerHeight = markerOffsets[edge.arrowTypeStart as keyof typeof markerOffsets];
|
||||||
|
const endMarkerHeight = markerOffsets[edge.arrowTypeEnd as keyof typeof markerOffsets];
|
||||||
|
const extraRoom = 1;
|
||||||
|
|
||||||
|
// Adjust the offset if the difference is smaller than the marker height
|
||||||
|
if (
|
||||||
|
differenceToEnd < endMarkerHeight &&
|
||||||
|
differenceToEnd > 0 &&
|
||||||
|
differenceInXEnd < endMarkerHeight
|
||||||
|
) {
|
||||||
|
let adjustment = endMarkerHeight + extraRoom - differenceToEnd;
|
||||||
|
adjustment *= DIRECTION === 'up' ? -1 : 1;
|
||||||
|
// Adjust the offset by the amount needed to fit the marker
|
||||||
|
offset -= adjustment;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
differenceToStart < startMarkerHeight &&
|
||||||
|
differenceToStart > 0 &&
|
||||||
|
differenceInXStart < startMarkerHeight
|
||||||
|
) {
|
||||||
|
let adjustment = startMarkerHeight + extraRoom - differenceToStart;
|
||||||
|
adjustment *= DIRECTION === 'up' ? -1 : 1;
|
||||||
|
offset += adjustment;
|
||||||
|
}
|
||||||
return pointTransformer(d).y + offset;
|
return pointTransformer(d).y + offset;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user