" 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()
答案 0 :(得分:0)
您的公式看起来正确,这是您的数据。
你说pos
@ -2.5,7.5,-80.7在圆柱体内,但不能,因为圆柱体的最小值/最大值为-44.3到+77.7 。