in packages/shared/src/coordinate.ts [445:520]
export function calcExtendsLineSegmentOfRect(
targetRect: Rect,
referRect: Rect
) {
if (
referRect.right < targetRect.right &&
targetRect.left <= referRect.right
) {
//右侧
if (referRect.bottom < targetRect.top) {
//上方
return {
start: { x: referRect.right, y: referRect.bottom },
end: { x: targetRect.right, y: referRect.bottom },
}
} else if (referRect.top > targetRect.bottom) {
//下方
return {
start: { x: referRect.right, y: referRect.top },
end: { x: targetRect.right, y: referRect.top },
}
}
} else if (
referRect.left > targetRect.left &&
targetRect.right >= referRect.left
) {
//左侧
if (referRect.bottom < targetRect.top) {
//上方
return {
start: { x: targetRect.left, y: referRect.bottom },
end: { x: referRect.left, y: referRect.bottom },
}
} else if (referRect.top > targetRect.bottom) {
//下方
return {
start: { x: targetRect.left, y: referRect.top },
end: { x: referRect.left, y: referRect.top },
}
}
}
if (referRect.top < targetRect.top && targetRect.bottom >= referRect.top) {
//refer在上方
if (referRect.right < targetRect.left) {
//右侧
return {
start: { x: referRect.right, y: referRect.bottom },
end: { x: referRect.right, y: targetRect.bottom },
}
} else if (referRect.left > targetRect.right) {
//左侧
return {
start: { x: referRect.left, y: referRect.bottom },
end: { x: referRect.left, y: targetRect.bottom },
}
}
} else if (
referRect.bottom > targetRect.bottom &&
referRect.top <= targetRect.bottom
) {
//refer下方
if (referRect.right < targetRect.left) {
//右侧
return {
start: { x: referRect.right, y: targetRect.top },
end: { x: referRect.right, y: referRect.top },
}
} else if (referRect.left > targetRect.right) {
//左侧
return {
start: { x: referRect.left, y: targetRect.top },
end: { x: referRect.left, y: referRect.top },
}
}
}
}