2015-02-07 50 views
0

“pos”是圆柱体内部的三维坐标系。位于定义的3d圆柱体内的位置

“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() 
+0

阅读[this](https://stackoverflow.com/help/mcve)。 – philipxy 2015-02-07 05:07:56

+0

我把问题缩小到了8行,在我的问题中,我只是添加了整个表,以便阅读和理解 – Elmub 2015-02-07 05:22:40

+0

了解。但是你应该给予输入和期望的输出和输出,包括中间值。此外,问题可能不在你认为的地方。 – philipxy 2015-02-07 05:47:50

回答

0

你的公式看的权利,这是你的数据。

你说pos @ -2.5,7.5,-80.7是在气缸内,但它不能是,由于Z的对气缸的最小/最大为-44.3至77.7。