Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Splitting a large part into smaller parts with total volume and orientation remaining constant?

Asked by
widest 0
6 years ago

I've been trying to work on a method for splitting one large, rectangular part into a set number of smaller parts (always a perfect square amount for mathematical simplicity) along its smallest axis (so that if the part had an x,y,z size of 1,2,3, the generated parts would maintain their x position while varying their y and z positions, all having a constant size), but for some reason, while my code does generate the parts, it does not properly orient them. I know that it won't work for rotated parts or anything because I'm using plain position and not CFrame (not sure how to implement CFrame into this), but the code should be working for non-rotated parts, but I've no luck with them so far. Here is what I've got, I'd greatly appreciate some help in fixing it.

function splitPart(part, numPieces) --numPieces must be a perfect square
    local smallestAxis = "x"
    local size = part.Size
    local pos = part.Position
    part:Destroy()
    if size.X>=size.Y and size.Z>=size.Y then
        smallestAxis = "y"
    elseif size.X>=size.Z and size.Y>=size.Z then
        smallestAxis = "z"
    end
    if smallestAxis=="x" then
        local maxHeight = size.Y
        local maxWidth = size.Z
        local length = size.X
        local height = maxHeight/math.sqrt(numPieces)
        local width = maxWidth/math.sqrt(numPieces)
        local currentX = pos.X --these are offsets from the "origin" bottom left corner
        local currentY = pos.Y-size.Y/2
        local currentZ = pos.Z-size.Z/2
        for i=1,numPieces do
            local p = Instance.new("Part", workspace)
            p.Anchored = true
            p.Size = Vector3.new(length, height, width)
            p.Position = Vector3.new(currentX, currentY, currentZ)
            currentY = currentY + height
            if currentY == maxHeight then
                currentY = 0
                currentZ = currentZ + width
            end
        end
    elseif smallestAxis=="y" then
        local height = size.Y
        local maxWidth = size.Z
        local maxLength = size.X
        local length = maxLength/math.sqrt(numPieces)
        local width = maxWidth/math.sqrt(numPieces)
        local currentX = pos.X-size.X/2 --these are offsets from the "origin" bottom left corner
        local currentY = pos.Y
        local currentZ = pos.Z-size.Z/2
        for i=1,numPieces do
            local p = Instance.new("Part", workspace)
            p.Anchored = true
            p.Size = Vector3.new(length, height, width)
            p.Position = Vector3.new(currentX, currentY, currentZ)
            currentZ = currentZ + width
            if currentZ == maxWidth then
                currentZ = 0
                currentX = currentX + length
            end
        end
    else
        local maxHeight = size.Y
        local width = size.Z
        local maxLength = size.X
        local length = maxLength/math.sqrt(numPieces)
        local height = maxHeight/math.sqrt(numPieces)
        local currentX = pos.X-size.X/2 --these are offsets from the "origin" bottom left corner
        local currentY = pos.Y-size.Y/2
        local currentZ = pos.Z
        for i=1,numPieces do
            local p = Instance.new("Part", workspace)
            p.Anchored = true
            p.Size = Vector3.new(length, height, width)
            p.Position = Vector3.new(currentX, currentY, currentZ)
            currentX = currentX + length
            if currentX == maxLength then
                currentX = 0
                currentY = currentY + height
            end
        end

    end
end
splitPart(workspace.Part, 4)

Note: If someone can come up with a solution that works on all three axis without keeping one constant but also not making parts too small, that'd be great too.

Answer this question