位置是否在定义的3d圆柱体内

时间:2015-02-07 05:03:26

标签: 3d lua

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

" POS2"是一个不在圆柱体内的3d坐标。

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

出于可读性的原因,这里的代码与hastebin中的代码相同: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()

1 个答案:

答案 0 :(得分:0)

您的公式看起来正确,这是您的数据。

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