是在定义的三维圆柱体内的位置



"pos"是圆柱体内部的三维坐标。

"pos2"是一个不在圆柱体内部的三维坐标。

然而,当运行下面的代码时,它会确定两者都在圆柱体之外。我的"ContainsVector"函数背后的数学有问题吗?

出于可读性的原因,以下是hastbin中的相同代码:http://hastebin.com/giquwomuko.lua

Vector3 = {
    new = function(x0, y0, z0)
        return {x = x0, y = y0, z = z0}
    end
}

CylinderRegion = {
    New = function(self, center, height, r)
        return {
            Center = center;
            Bottom = center.y - height / 2;
            Top = center.y + height / 2;
            Radius = r;
            Height = height;
            Volume = math.pi * r^2 * height;
            PrintProperties = function(self)
                for prop, val in pairs(self) do
                    if type(val) == "number" then
                        print("Cylinder "..prop..": "..tostring(val))
                    elseif type(val) == "table" then
                        print("Cylinder "..prop..": "..tostring(val.x..", "..val.y..", "..val.z))
                    end
                end
                print("n")
            end;
            ContainsVector = function(self, vector)
                --vector is between top and bottom
                if vector.y < self.Top and vector.y > self.Bottom then
                    local x0 = self.Center.x
                    local z0 = self.Center.z
                    local r = self.Radius
                    local x1 = vector.x
                    local z1 = vector.z
                    local cont = math.sqrt((x1-x0)*(x1-x0) + (z1-z0)*(z1-z0)) < r
                    return cont
                end
                return false
            end
        }
    end;
}

function main()
    local pos = Vector3.new(-2.5, 7.5, -80.7)
    local pos2 = Vector3.new(9.3, 2.5, -60.5)
    local region = CylinderRegion:New(Vector3.new(13.9, 14.2, 16.7), 28.4, 61)
    print("Created new cylinder with the following properties:n")
    region:PrintProperties()
    local ex = region:ContainsVector(pos)
    local ex2 = region:ContainsVector(pos2)
    if ex then
        print("pos ("..tostring(pos.x..", "..pos.y..", "..pos.z)..") is inside the cylinder!")
    else
        print("pos ("..tostring(pos.x..", "..pos.y..", "..pos.z)..") is NOT inside the cylinder!")
    end
    if ex2 then
        print("pos2 ("..tostring(pos2.x..", "..pos2.y..", "..pos2.z)..") is inside the cylinder!")
    else
        print("pos2 ("..tostring(pos2.x..", "..pos2.y..", "..pos2.z)..") is NOT inside the cylinder!")
    end
end

local s, e = pcall(main)
if not s then
    print(e)
end
io.read()

您的公式看起来不错,这是您的数据。

你说pos@-2.5,7.5,-80.7在圆柱体内,但它不可能是,因为圆柱体的z的最小值/最大值是-44.3到+77.7。

最新更新