2015-02-07 2 views
0

"pos"는 실린더 내부에있는 3D 좌표입니다.정의 된 3D 실린더 내부의 위치입니다.

"pos2"는 실린더 내부에 있지 않은 3D 좌표입니다.

그러나 아래 코드를 실행하면 두 코드가 모두 실린더 밖에 있다고 판단됩니다. "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() 
+0

[this] (https://stackoverflow.com/help/mcve)를 읽으십시오. – philipxy

+0

내 질문에 문제를 8 줄로 좁혔는데, 나는 가독성과 이해를 위해 전체 표를 추가했다. – Elmub

+0

이해. 그러나 중간 값을 포함하여 입력 및 예상 출력 및 출력을 제공해야합니다. 또한 문제는 당신이 생각하는 곳이 아닐 수도 있습니다. – philipxy

답변

0

이 수식이 제대로 보이지 : 가독성을 이유로

, 여기 hastebin에서 동일한 코드입니다.

당신은 -2.5, 7.5 -80.7 실린더 내에 pos @ 말하지만 실린더 (Z)의 최소/최대를 77.7 -44.3 발이기 때문에 는 않을있다.