Line circle intersection: Difference between revisions

m
→‎{{header|Phix}}: added syntax colouring, marked p2js compatible
(Added AutoHotkey)
m (→‎{{header|Phix}}: added syntax colouring, marked p2js compatible)
Line 1,859:
{{trans|Go}}
{{trans|zkl}}
<!--<lang Phix>constant epsilon = 1e(phixonline)-14 -- say>
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
atom cx, cy, r, x1, y1, x2, y2
<span style="color: #008080;">constant</span> <span style="color: #000000;">epsilon</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1e-14</span> <span style="color: #000080;font-style:italic;">-- say</span>
 
<span style="color: #004080;">atom</span> <span style="color: #000000;">cx</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cy</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y2</span>
function sq(atom x) return x*x end function
 
<span style="color: #008080;">function</span> <span style="color: #000000;">sq</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">return</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">*</span><span style="color: #000000;">x</span> <span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
function within(atom x, y)
--
<span style="color: #008080;">function</span> <span style="color: #000000;">within</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">)</span>
-- checks whether a point is within a segment
<span style="color: #000080;font-style:italic;">--
-- ie: <-------d1------->
-- checks whether a point <--d2--><---d3---> --is within, d2+d3 ~=a d1segment
-- ie: x1,y1^ ^x,y ^x2,y2&lt;-------d1-------&gt;
-- &lt;--d2--&gt;&lt;---d3---&gt; -- within, d2+d3 ~= d1
-- vs:
-- <-d2-> x1,y1^ ^x,y ^x2,y2
-- vs:
-- <-----------d3---------> -- not "", d2+d3 > d1
-- &lt;-d2-&gt;
-- ^x,y - and obviously ditto when x,y is (say) out here^
-- &lt;-----------d3---------&gt; -- not "", d2+d3 &gt; d1
--
-- (obviously only works when ^x,y is- onand theobviously sameditto linewhen as x1x,y1y tois x2,y2(say) out here^
--
-- (obviously only works when x,y is on the same line as x1,y1 to x2,y2)
atom d1 := sqrt(sq(x2-x1) + sq(y2-y1)), -- distance between end-points
--</span>
d2 := sqrt(sq(x -x1) + sq(y -y1)), -- distance from point to one end
<span style="color: #004080;">atom</span> <span style="color: #000000;">d1</span> <span style="color: #0000FF;">:=</span> <span style="color: #7060A8;">sqrt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sq</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x2</span><span style="color: #0000FF;">-</span><span style="color: #000000;">x1</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">sq</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y2</span><span style="color: #0000FF;">-</span><span style="color: #000000;">y1</span><span style="color: #0000FF;">)),</span> <span style="color: #000080;font-style:italic;">-- distance between end-points</span>
d3 := sqrt(sq(x2-x ) + sq(y2-y )), -- distance from point to other end
<span style="color: #000000;">d2</span> <span style="color: #0000FF;">:=</span> <span style="color: #7060A8;">sqrt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sq</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">x1</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">sq</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">y1</span><span style="color: #0000FF;">)),</span> <span style="color: #000080;font-style:italic;">-- distance from point to one end</span>
delta := (d2 + d3) - d1
<span style="color: #000000;">d3</span> <span style="color: #0000FF;">:=</span> <span style="color: #7060A8;">sqrt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sq</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x2</span><span style="color: #0000FF;">-</span><span style="color: #000000;">x</span> <span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">sq</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y2</span><span style="color: #0000FF;">-</span><span style="color: #000000;">y</span> <span style="color: #0000FF;">)),</span> <span style="color: #000080;font-style:italic;">-- distance from point to other end</span>
return abs(delta) < epsilon -- true if delta is less than a small tolerance
<span style="color: #000000;">delta</span> <span style="color: #0000FF;">:=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">d2</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">d3</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">d1</span>
end function
<span style="color: #008080;">return</span> <span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">delta</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;"><</span> <span style="color: #000000;">epsilon</span> <span style="color: #000080;font-style:italic;">-- true if delta is less than a small tolerance</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
function pf(atom x,y)
return sprintf("(%g,%g)",{x,y})
<span style="color: #008080;">function</span> <span style="color: #000000;">pf</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">)</span>
end function
<span style="color: #008080;">return</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"(%g,%g)"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">})</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
function intersects(bool bSegment)
--
<span style="color: #008080;">function</span> <span style="color: #000000;">intersects</span><span style="color: #0000FF;">(</span><span style="color: #004080;">bool</span> <span style="color: #000000;">bSegment</span><span style="color: #0000FF;">)</span>
-- Returns the intersection points (if any) of a circle, center (cx,cy) with radius r,
<span style="color: #000080;font-style:italic;">--
-- and line containing the points (x1,y1) and (x2,y2) being either infinite or limited
-- Returns the intersection points (if any) of a circle, center (cx,cy) with radius r,
-- to the segment drawn between those points.
-- and line containing the points (x1,y1) and (x2,y2) being either infinite or limited
--
-- to the segment drawn between those points.
sequence res = {}
--</span>
atom A = y2 - y1, sqA = sq(A),
<span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
B = x1 - x2, sqB = sq(B),
<span style="color: #004080;">atom</span> <span style="color: #000000;">A</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">y2</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">y1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">sqA</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">sq</span><span style="color: #0000FF;">(</span><span style="color: #000000;">A</span><span style="color: #0000FF;">),</span>
C = x2*y1 - x1*y2, sqC = sq(C),
<span style="color: #000000;">B</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">x1</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">x2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">sqB</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">sq</span><span style="color: #0000FF;">(</span><span style="color: #000000;">B</span><span style="color: #0000FF;">),</span>
sqr = r*r-cx*cx-cy*cy,
<span style="color: #000000;">C</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">x2</span><span style="color: #0000FF;">*</span><span style="color: #000000;">y1</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">x1</span><span style="color: #0000FF;">*</span><span style="color: #000000;">y2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">sqC</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">sq</span><span style="color: #0000FF;">(</span><span style="color: #000000;">C</span><span style="color: #0000FF;">),</span>
a := sqA + sqB,
<span style="color: #000000;">sqr</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">*</span><span style="color: #000000;">r</span><span style="color: #0000FF;">-</span><span style="color: #000000;">cx</span><span style="color: #0000FF;">*</span><span style="color: #000000;">cx</span><span style="color: #0000FF;">-</span><span style="color: #000000;">cy</span><span style="color: #0000FF;">*</span><span style="color: #000000;">cy</span><span style="color: #0000FF;">,</span>
b, c
<span style="color: #000000;">a</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">sqA</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">sqB</span><span style="color: #0000FF;">,</span>
bool bDivA = false
<span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">c</span>
if abs(B)<epsilon then -- B is zero or close to it
<span style="color: #004080;">bool</span> <span style="color: #000000;">bDivA</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span>
b = 2 * (B*C + A*B*cx - sqA*cy)
<span style="color: #008080;">if</span> <span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">B</span><span style="color: #0000FF;">)<</span><span style="color: #000000;">epsilon</span> <span style="color: #008080;">then</span> <span style="color: #000080;font-style:italic;">-- B is zero or close to it</span>
c = sqC + 2*A*C*cx - sqA*sqr
<span style="color: #000000;">b</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">2</span> <span style="color: #0000FF;">*</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">B</span><span style="color: #0000FF;">*</span><span style="color: #000000;">C</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">A</span><span style="color: #0000FF;">*</span><span style="color: #000000;">B</span><span style="color: #0000FF;">*</span><span style="color: #000000;">cx</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">sqA</span><span style="color: #0000FF;">*</span><span style="color: #000000;">cy</span><span style="color: #0000FF;">)</span>
bDivA = true -- (and later divide by A instead!)
<span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">sqC</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">*</span><span style="color: #000000;">A</span><span style="color: #0000FF;">*</span><span style="color: #000000;">C</span><span style="color: #0000FF;">*</span><span style="color: #000000;">cx</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">sqA</span><span style="color: #0000FF;">*</span><span style="color: #000000;">sqr</span>
else
<span style="color: #000000;">bDivA</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span> <span style="color: #000080;font-style:italic;">-- (and later divide by A instead!)</span>
b = 2 * (A*C + A*B*cy - sqB*cx)
<span style="color: #008080;">else</span>
c = sqC + 2*B*C*cy - sqB*sqr
<span style="color: #000000;">b</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">2</span> <span style="color: #0000FF;">*</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">A</span><span style="color: #0000FF;">*</span><span style="color: #000000;">C</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">A</span><span style="color: #0000FF;">*</span><span style="color: #000000;">B</span><span style="color: #0000FF;">*</span><span style="color: #000000;">cy</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">sqB</span><span style="color: #0000FF;">*</span><span style="color: #000000;">cx</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">sqC</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">*</span><span style="color: #000000;">B</span><span style="color: #0000FF;">*</span><span style="color: #000000;">C</span><span style="color: #0000FF;">*</span><span style="color: #000000;">cy</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">sqB</span><span style="color: #0000FF;">*</span><span style="color: #000000;">sqr</span>
atom d := b*b - 4*a*c -- discriminant
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if d>=0 then -- (-ve means line & circle do not intersect)
<span style="color: #004080;">atom</span> <span style="color: #000000;">d</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">*</span><span style="color: #000000;">b</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">*</span><span style="color: #000000;">a</span><span style="color: #0000FF;">*</span><span style="color: #000000;">c</span> <span style="color: #000080;font-style:italic;">-- discriminant</span>
d = sqrt(d)
<span style="color: #008080;">if</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #000080;font-style:italic;">-- (-ve means line & circle do not intersect)</span>
atom ux,uy, vx,vy
<span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sqrt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">d</span><span style="color: #0000FF;">)</span>
if bDivA then
<span style="color: #004080;">atom</span> <span style="color: #000000;">ux</span><span style="color: #0000FF;">,</span><span style="color: #000000;">uy</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">vx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">vy</span>
{uy,vy} = sq_div(sq_sub({+d,-d},b),2*a)
<span style="color: #008080;">if</span> <span style="color: #000000;">bDivA</span> <span style="color: #008080;">then</span>
{ux,vx} = sq_div(sq_sub(sq_mul(-B,{uy,vy}),C),A)
<span style="color: #0000FF;">{</span><span style="color: #000000;">uy</span><span style="color: #0000FF;">,</span><span style="color: #000000;">vy</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_div</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_sub</span><span style="color: #0000FF;">({+</span><span style="color: #000000;">d</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">d</span><span style="color: #0000FF;">},</span><span style="color: #000000;">b</span><span style="color: #0000FF;">),</span><span style="color: #000000;">2</span><span style="color: #0000FF;">*</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)</span>
else
<span style="color: #0000FF;">{</span><span style="color: #000000;">ux</span><span style="color: #0000FF;">,</span><span style="color: #000000;">vx</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_div</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_sub</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_mul</span><span style="color: #0000FF;">(-</span><span style="color: #000000;">B</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">uy</span><span style="color: #0000FF;">,</span><span style="color: #000000;">vy</span><span style="color: #0000FF;">}),</span><span style="color: #000000;">C</span><span style="color: #0000FF;">),</span><span style="color: #000000;">A</span><span style="color: #0000FF;">)</span>
{ux,vx} = sq_div(sq_sub({+d,-d},b),2*a)
<span style="color: #008080;">else</span>
{uy,vy} = sq_div(sq_sub(sq_mul(-A,{ux,vx}),C),B)
<span style="color: #0000FF;">{</span><span style="color: #000000;">ux</span><span style="color: #0000FF;">,</span><span style="color: #000000;">vx</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_div</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_sub</span><span style="color: #0000FF;">({+</span><span style="color: #000000;">d</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">d</span><span style="color: #0000FF;">},</span><span style="color: #000000;">b</span><span style="color: #0000FF;">),</span><span style="color: #000000;">2</span><span style="color: #0000FF;">*</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #0000FF;">{</span><span style="color: #000000;">uy</span><span style="color: #0000FF;">,</span><span style="color: #000000;">vy</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_div</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_sub</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_mul</span><span style="color: #0000FF;">(-</span><span style="color: #000000;">A</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">ux</span><span style="color: #0000FF;">,</span><span style="color: #000000;">vx</span><span style="color: #0000FF;">}),</span><span style="color: #000000;">C</span><span style="color: #0000FF;">),</span><span style="color: #000000;">B</span><span style="color: #0000FF;">)</span>
if not bSegment or within(ux,uy) then
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
res = append(res,pf(ux,uy))
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">bSegment</span> <span style="color: #008080;">or</span> <span style="color: #000000;">within</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ux</span><span style="color: #0000FF;">,</span><span style="color: #000000;">uy</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #000000;">pf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ux</span><span style="color: #0000FF;">,</span><span style="color: #000000;">uy</span><span style="color: #0000FF;">))</span>
if d!=0 and (not bSegment or within(vx,vy)) then
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
res = append(res,pf(vx,vy))
<span style="color: #008080;">if</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">and</span> <span style="color: #0000FF;">(</span><span style="color: #008080;">not</span> <span style="color: #000000;">bSegment</span> <span style="color: #008080;">or</span> <span style="color: #000000;">within</span><span style="color: #0000FF;">(</span><span style="color: #000000;">vx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">vy</span><span style="color: #0000FF;">))</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #000000;">pf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">vx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">vy</span><span style="color: #0000FF;">))</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
return res
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end function
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
-- cx cy r x1 y1 x2 y2 bSegment
constant tests = {{3,-5,3,{{-10,11, 10,-9,false},
<span style="color: #000080;font-style:italic;">-- cx cy r x1 y1 {-10,11,-11,12,true},x2 y2 bSegment</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,{{-</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">11</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">10</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">9</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">},</span>
{ 3,-2, 7,-2,false}}},
<span style="color: #0000FF;">{-</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">11</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">11</span><span style="color: #0000FF;">,</span><span style="color: #000000;">12</span><span style="color: #0000FF;">,</span><span style="color: #004600;">true</span><span style="color: #0000FF;">},</span>
{0, 0,4,{{ 0,-3, 0, 6,false},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">3</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">7</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">}}},</span>
{ 0,-3, 0, 6,true}}},
<span style="color: #0000FF;">{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,{{</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">},</span>
{4, 2,5,{{ 6, 3, 10, 7,false},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #004600;">true</span><span style="color: #0000FF;">}}},</span>
{ 7, 4, 11, 8,true}}}}
<span style="color: #0000FF;">{</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,{{</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">10</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">7</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">},</span>
 
<span style="color: #0000FF;">{</span> <span style="color: #000000;">7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">11</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">8</span><span style="color: #0000FF;">,</span><span style="color: #004600;">true</span><span style="color: #0000FF;">}}}}</span>
for t=1 to length(tests) do
{cx, cy, r, sequence lines} = tests[t]
<span style="color: #008080;">for</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
string circle = sprintf("Circle at %s radius %d",{pf(cx,cy),r})
<span style="color: #004080;">sequence</span> <span style="color: #000000;">lines</span>
for l=1 to length(lines) do
<span style="color: #0000FF;">{</span><span style="color: #000000;">cx</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cy</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">lines</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">tests</span><span style="color: #0000FF;">[</span><span style="color: #000000;">t</span><span style="color: #0000FF;">]</span>
{x1, y1, x2, y2, bool bSegment} = lines[l]
<span style="color: #004080;">string</span> <span style="color: #000000;">circle</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Circle at %s radius %d"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">pf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">cy</span><span style="color: #0000FF;">),</span><span style="color: #000000;">r</span><span style="color: #0000FF;">})</span>
sequence res = intersects(bSegment)
<span style="color: #008080;">for</span> <span style="color: #000000;">l</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lines</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
string ls = iff(bSegment?"segment":" line"),
<span style="color: #004080;">bool</span> <span style="color: #000000;">bSegment</span>
at = iff(length(res)?"intersect at "&join(res," and ")
<span style="color: #0000FF;">{</span><span style="color: #000000;">x1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">bSegment</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">lines</span><span style="color: #0000FF;">[</span><span style="color: #000000;">l</span><span style="color: #0000FF;">]</span>
:"do not intersect")
<span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">intersects</span><span style="color: #0000FF;">(</span><span style="color: #000000;">bSegment</span><span style="color: #0000FF;">)</span>
printf(1,"%s and %s %s to %s %s.\n",{circle,ls,pf(x1,y1),pf(x2,y2),at})
<span style="color: #004080;">string</span> <span style="color: #000000;">ls</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">bSegment</span><span style="color: #0000FF;">?</span><span style="color: #008000;">"segment"</span><span style="color: #0000FF;">:</span><span style="color: #008000;">" line"</span><span style="color: #0000FF;">),</span>
circle = repeat(' ',length(circle))
<span style="color: #000000;">at</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">)?</span><span style="color: #008000;">"intersect at "</span><span style="color: #0000FF;">&</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" and "</span><span style="color: #0000FF;">)</span>
end for
<span style="color: #0000FF;">:</span><span style="color: #008000;">"do not intersect"</span><span style="color: #0000FF;">)</span>
end for</lang>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s and %s %s to %s %s.\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">circle</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ls</span><span style="color: #0000FF;">,</span><span style="color: #000000;">pf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y1</span><span style="color: #0000FF;">),</span><span style="color: #000000;">pf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y2</span><span style="color: #0000FF;">),</span><span style="color: #000000;">at</span><span style="color: #0000FF;">})</span>
<span style="color: #000000;">circle</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">' '</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">circle</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</lang>-->
{{out}}
<pre>
7,795

edits