Refactor RigidBodyBehaviors
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Eric NGUYEN 2022-08-17 15:39:37 +02:00
parent 286a5e9c00
commit 82eae4971e

View file

@ -181,6 +181,17 @@ export function constraintBodyInsideUnallocatedWidth(
); );
} }
/**
* Check if a container can fit inside a size space
* @param container Container to check
* @param sizePointer Size space to check
* @returns
*/
const isFitting = (
container: IContainerModel,
sizePointer: ISizePointer
): boolean => container.properties.width <= sizePointer.width;
/** /**
* Get the unallocated widths inside a container * Get the unallocated widths inside a container
* An allocated width is defined by its the widths of the children that are rigid bodies. * An allocated width is defined by its the widths of the children that are rigid bodies.
@ -222,10 +233,9 @@ function getAvailableWidths(
// We need to calculate the overlap between the two containers // We need to calculate the overlap between the two containers
// We only works with widths meaning in 1D (with lines) // We only works with widths meaning in 1D (with lines)
const newUnallocatedWidths = getAvailableWidthsTwoLines( const newUnallocatedWidths = getAvailableWidthsTwoLines(
unallocatedSpace.x, unallocatedSpace,
unallocatedSpace.x + unallocatedSpace.width,
childX, childX,
childX + childWidth childWidth
); );
// Concat the new list of SizePointer pointing to availables spaces // Concat the new list of SizePointer pointing to availables spaces
@ -240,38 +250,44 @@ function getAvailableWidths(
/** /**
* Returns the unallocated widths between two lines in 1D * Returns the unallocated widths between two lines in 1D
* @param unalloctedSpaceLeft left of the first line * @param unalloctedSpace unallocated space
* @param unallocatedSpaceRight rigth of the first line * @param rectX left of the second line
* @param rectLeft left of the second line * @param rectWidth width of the second line
* @param rectRight right of the second line
* @returns Available widths * @returns Available widths
*/ */
function getAvailableWidthsTwoLines( function getAvailableWidthsTwoLines(
unalloctedSpaceLeft: number, unallocatedSpace: ISizePointer,
unallocatedSpaceRight: number, rectX: number,
rectLeft: number, rectWidth: number
rectRight: number
): ISizePointer[] { ): ISizePointer[] {
// let object 1 be the unallocated space const unallocatedSpaceRight = unallocatedSpace.x + unallocatedSpace.width;
// and object 2 be the rect const rectRight = rectX + rectWidth;
if (unallocatedSpaceRight < rectLeft || const isNotOverlapping = unallocatedSpaceRight < rectX ||
unalloctedSpaceLeft > rectRight unallocatedSpace.x > rectRight;
) { if (isNotOverlapping) {
// object 1 and 2 are not overlapping return [unallocatedSpace];
return [{
x: unalloctedSpaceLeft,
width: unallocatedSpaceRight - unalloctedSpaceLeft
}];
} }
if (rectLeft < unalloctedSpaceLeft && rectRight > unallocatedSpaceRight) { const isOverlappingFullWidth = rectX < unallocatedSpace.x && rectRight > unallocatedSpaceRight;
// object 2 is overlapping full width if (isOverlappingFullWidth) {
return []; return [];
} }
if (unalloctedSpaceLeft >= rectLeft) { const isOverlappingOnTheLeft = unallocatedSpace.x >= rectX;
// object 2 is partially overlapping on the left if (isOverlappingOnTheLeft) {
return getAvailableWidthsLeft(unallocatedSpaceRight, rectRight);
}
const isOverlappingOnTheRight = rectRight >= unallocatedSpaceRight;
if (isOverlappingOnTheRight) {
return getAvailableWidthsRight(unallocatedSpace.x, rectRight);
}
return getAvailableWidthsMiddle(unallocatedSpace.x, unallocatedSpaceRight, rectX, rectRight);
}
function getAvailableWidthsLeft(unallocatedSpaceRight: number, rectRight: number): ISizePointer[] {
if (unallocatedSpaceRight - rectRight <= 0) { if (unallocatedSpaceRight - rectRight <= 0) {
return []; return [];
} }
@ -284,44 +300,40 @@ function getAvailableWidthsTwoLines(
]; ];
} }
if (rectRight >= unallocatedSpaceRight) { function getAvailableWidthsRight(unalloctedSpaceX: number, rectRight: number): ISizePointer[] {
// object 2 is partially overlapping on the right if (rectRight - unalloctedSpaceX <= 0) {
if (unalloctedSpaceLeft - rectRight <= 0) {
return []; return [];
} }
return [ return [
{ {
x: unalloctedSpaceLeft, x: unalloctedSpaceX,
width: rectRight - unalloctedSpaceLeft width: rectRight - unalloctedSpaceX
} }
]; ];
} }
// object 2 is overlapping in the middle function getAvailableWidthsMiddle(
unalloctedSpaceX: number,
unallocatedSpaceRight: number,
rectX: number,
rectRight: number
): ISizePointer[] {
const sizePointers: ISizePointer[] = []; const sizePointers: ISizePointer[] = [];
if (rectLeft - unalloctedSpaceLeft > 0) {
if (rectX - unalloctedSpaceX > 0) {
sizePointers.push({ sizePointers.push({
x: unalloctedSpaceLeft, x: unalloctedSpaceX,
width: rectLeft - unalloctedSpaceLeft width: rectX - unalloctedSpaceX
}); });
} }
if (unallocatedSpaceRight - rectRight > 0) { if (unallocatedSpaceRight - rectRight > 0) {
sizePointers.push({ sizePointers.push({
x: rectRight, x: rectRight,
width: unallocatedSpaceRight - rectRight width: unallocatedSpaceRight - rectRight
}); });
} }
return sizePointers; return sizePointers;
} }
/**
* Check if a container can fit inside a size space
* @param container Container to check
* @param sizePointer Size space to check
* @returns
*/
const isFitting = (
container: IContainerModel,
sizePointer: ISizePointer
): boolean => container.properties.width <= sizePointer.width;