Revision Difference
util.IsSphereIntersectingCone#560164
<function name="IsSphereIntersectingCone" parent="util" type="libraryfunc">
<description>Returns whether a sphere is intersecting a cone or not.</description>
<realm>Shared</realm>
<added>2023.08.08</added>⤶
<args>
<arg name="sphereCenter" type="Vector">The center position of the sphere to test.</arg>
<arg name="sphereRadius" type="number">The radius of the sphere to test.</arg>
<arg name="coneOrigin" type="Vector">The position of the cone tip.</arg>
<arg name="coneAxis" type="Vector">The direction of the cone.</arg>
<arg name="coneSine" type="number">The <page test="sine">math.sin</page> of the cone's angle.</arg>
<arg name="coneCosine" type="number">The <page test="cosine">math.cos</page> of the cone's angle.</arg>
</args>
<rets>
<ret name="" type="boolean">`true` if the sphere intersects the cone, `false` otherwise.</ret>
</rets>
</function>
<example>
<code>
function ENT:Draw()
local pos = self:GetPos()
local point = Vector( 0, 0, 0 )
local sphereRad = 20
local height = 100
local angle = 45 --[[degrees]] / 180 * math.pi -- converted to radians
local size = math.tan( angle ) * height
local segs = 32
local is = util.IsPointInCone( point, pos, self:GetUp(), math.cos( angle ), height )
local is2 = util.IsSphereIntersectingCone( point, sphereRad, pos, self:GetUp(), math.sin( angle ), math.cos( angle ) ) -- infinite height
local precalc = 1/segs * math.pi * 2
local center = pos
for i = 1, segs do
local pos1 = pos + math.sin( i * precalc ) * size * self:GetForward() + math.cos( i * precalc ) * size * self:GetRight() + self:GetUp() * height
local pos2 = pos + math.sin( (i-1) * precalc ) * size * self:GetForward() + math.cos( (i-1) * precalc ) * size * self:GetRight() + self:GetUp() * height
render.DrawLine( pos2, pos1, is and Color( 0, 255, 0 ) or Color( 255, 0, 0 ) )
render.DrawLine( pos2, center, is and Color( 0, 255, 0 ) or Color( 255, 0, 0 ) )
end
render.DrawLine( pos, point, is and Color( 0, 255, 0 ) or Color( 255, 0, 0 ) )
debugoverlay.Sphere( point, sphereRad,0.01, is2 and Color( 0, 255, 0 ) or Color( 255, 0, 0 ) )
end
</code>
</example>