2015-02-07 35 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。