在 3D 笛卡尔空间中,我在 XYZ 有一个半径为 240 的球体(主球体),在该球体内还有许多其他半径为 100 的球体(其他对象)。我需要能够找到沿边界球体边界的点,这些点不与其中的任何其他对象相交。
为简单起见,我们可以说主球体位于 0 0 0 处,半径为 240,内部有大约 33 个对象,每个对象在不同坐标处的半径为 100。
主要是用 Lua 编写,但 C/C++ 也很好。感谢您提供任何帮助,即使只是为我指出如何在数学上解决它的正确方向。
编辑:使用下面 David Eisenstat 提供的链接和信息,这是我正在使用的代码。它/似乎/可以工作,但还没有机会对其进行全面测试。
function randomSpherePoint(x, y, z, r)
local acos, sin, cos = math.acos, math.sin, math.cos
local u, v = math.random(), math.random()
local theta = 2 * PI * u
local phi = acos(2 * v - 1)
local px = x + (r * sin(phi) * cos(theta))
local py = y + (r * sin(phi) * sin(theta))
local pz = z + (r * cos(phi))
return px, py, pz
end
function fun_bordercheck()
local results = { }
local bx, by, bz, radius = -9197.944, 0, 0, 240 -- Border location and radius
for i = 1, 1000 do -- 1000 random points
local px, py, pz = randomSpherePoint(bx, by, bz, radius)
local n = 0
while (n < #space_objs) do
n = n + 1
if (xyz2range(space_objs[n].x, space_objs[n].y, space_objs[n].z, px, py, pz) <=100) then
break -- It hits, no point in checking any other objects. Skip to next random point
end
if (n == #space_objs) then -- We reached the end of the list. If we got this far, this is a possible location. Store it
results[#results+1] = { x = px, y = py, z = pz }
end
end -- while()
end -- for()
if (#results < 1) then
print("No points found.")
return
end
print(string.format("BorderCheck(): Found %d results.", #results))
for i = 1, #results do
Note(string.format("Point %d: %.3f %.3f %.3f", i, results[i].x, results[i].y, results[i].z))
end
end -- function()