这个位置是否在一个定义好的三维圆柱体内部。

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

"pos2"是在圆柱体外的三维坐标。

然而,在运行下面的代码时,它确定两者都在圆柱体外。我的“ContainsVector”函数的数学有什么问题吗?

出于可读性的原因,这里是相同的代码: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()
点赞
用户4402825
用户4402825

你的公式看起来是正确的,问题出在数据上。

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

2015-02-07 06:04:08