Talk:Find the intersection of two lines: Difference between revisions

Content added Content deleted
m (added a missing verb (uses indentatations ...).)
m (→‎a REXX version of a REXX version: added/changed wording in the REXX section header, formatted the REXX program logic to be able to be viewed on a single screen.)
Line 1: Line 1:
==a REXX version of a REXX version==
==a REXX version of a REXX version==
This REXX version is a re-write of version 2 of the REXX entry, with:
This REXX version is a re-write of version 2 of the REXX entry,   with:
::*   added the required comment so that this REXX version would execute on VM/CMS and MVS/TSO
::*   added the required comment so that this REXX version would execute on VM/CMS and MVS/TSO
::*   aligned indentation for all   '''do-end'''   blocks   (and encapsulated statements)
::*   aligned indentation for all   '''do-end'''   blocks   (and encapsulated statements)
::*   elided superfluous zeroes and decimal points in (decimal) integers
::*   elided distracting superfluous zeros in integers
::*   elides the superfluous and detracting use of concatenation   ('''││''')
::*   elided superfluous decimal points in integers
::*   elides the superfluous and distracting use of concatenation   ('''││''')
::*   a unique symbol instead of a null literal for a special case
::*   a unique symbol instead of a null literal for a special case
::*   aligns the data points and results in the output
::*   aligns the data points and results in the output
::*   adds whitespace to make arithmetic computations more perusable
::*   adds whitespace to make arithmetic computations more perusable
::*   eschews title-case capitalization
::*   eschews title-case capitalizations
::*   maintains the same line for the   '''then'''   clause and the   '''if'''   clause   (no split statements)
::*   maintains the same line for the   '''then'''   clause and the   '''if'''   clause   (no split statements)
::*   uses indentations for all REXX statements in the function
::*   uses indentations for all REXX statements in the function
Line 15: Line 16:
::*   REXX variables to hold long literals that would otherwise cause excessive wide REXX statements
::*   REXX variables to hold long literals that would otherwise cause excessive wide REXX statements
::* &nbsp; a comma &nbsp; (instead of a slash) &nbsp; to separate the &nbsp; <big> '''x &nbsp; y''' </big> &nbsp; coördinates of the data points.
::* &nbsp; a comma &nbsp; (instead of a slash) &nbsp; to separate the &nbsp; <big> '''x &nbsp; y''' </big> &nbsp; coördinates of the data points.
::* &nbsp; elides superfluous &nbsp; '''do-end''' &nbsp; block structures
::* &nbsp; elides superfluous &nbsp; '''do-end''' &nbsp; block structures; &nbsp; less clutter, easier to read
::* &nbsp; a lot more whitespace within REXX statements and the REXX program's output
::* &nbsp; added more whitespace within some REXX statements and the REXX program's output
::* &nbsp; tests all data possibilities &nbsp; (for showing all the tested non-intersecting conditions)
::* &nbsp; tests all data possibilities &nbsp; (for showing all the tested non-intersecting conditions)
::* &nbsp; for viewing the calculation in its entirity, all program logic was kept within single viewable screen

{{trans|REXX (version 2)}}
{{trans|REXX (version 2)}}
<lang rexx>/*REXX program finds (possibly) the intersection of two lines (with diagnostic errors).*/
<lang rexx>/*REXX program finds (possibly) the intersection of two lines (with diagnostic errors).*/
Line 28: Line 31:
say iSect( 0 0 3 3 0 1 6 7 )
say iSect( 0 0 3 3 0 1 6 7 )
say iSect( 0 0 3 3 8 8 8 8 )
say iSect( 0 0 3 3 8 8 8 8 )
exit /* ═══a═══ ═══b═══ ═══c═══ ═══d═══ stick a fork in it, we're all done. */
exit /* ═══a═══ ═══b═══ ═══c═══ ═══c═══ stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
iSect: procedure; parse arg xa ya xb yb xc yc xd yd
iSect: procedure; parse arg xa ya xb yb xc yc xd yd /*optain args from invocation. */
$=. /*the intersection or error msg.*/
if xa=xb then do; k1=. /*the slope is infinite. */
x1=xa /*the X's intersection is XA */
if ya=yb then $= 'points A and B are identical'
end /* [↑] AB is a vertical line. */
else do; k1=(yb-ya) / (xb-xa) /*compute the slope of AB */
d1=ya - k1 * xa /*calc. intersection with Y axis*/
end /* [↑] AB isn't a vertical line*/
if xc=xd then do; k2=. /*the slope is infinite. */
x2=xc /*the C's intersection is XC */
if yc=yd then $= 'points C and D are identical'
end /* [↑] CD is a vertical line. */
else do; k2=(yd-yc) / (xd-xc) /*compute the slope of CD */
d2=yc - k2 * xc /*calc. intersection with Y axis*/
end /* [↑] CD isn't a vertical line*/
@ident= 'lines AB and CD are identical' /*literal to help shorten a line*/
@ident= 'lines AB and CD are identical' /*literal to help shorten a line*/
@paral= 'lines AB and CD are parallel' /* " " " " " " */
@paral= 'lines AB and CD are parallel' /* " " " " " " */
$=. /*the intersection or error msg.*/
/* [↓] no special case so far···*/
if xa=xb then do /*is AB a vertical line? */
if $=. then if k1=. then if k2=. then if x1=x2 then $=@ident /*identical. */
k1=. /*the slope is infinite. */
else $=@paral /*parallel. */
x1=xa /*the X's intersection is XA */
else do; x=x1 /*use X1 */
if ya=yb then $= 'points A and B are identical'
y=k2 * x + d2 /*Y from CD */
end
end
else do /*AB isn't a vertical line. */
else if k2=. then do; x=x2 /*X from CD */
k1=(yb-ya) / (xb-xa) /*compute the slope of AB */
y=k1 * x + d1 /*Y from AB */
d1=ya - k1 * xa /*calc. intersection with Y axis*/
end
end
else if k1=k2 then if d1=d2 then $= @ident
else $= @paral

if xc=xd then do /*is CD a vertical line? */
else do; x=(d2-d1) / (k1-k2)
k2=. /*the slope is infinite. */
y=k1 * x + d1
x2=xc /*the C's intersection is XC */
end /* [↑] normal*/
if yc=yd then $= 'points C and D are identical'
end
else do /*CD isn't a vertical line. */
k2=(yd-yc) / (xd-xc) /*compute the slope of CD */
d2=yc - k2 * xc /*calc. intersection with Y axis*/
end

if $=. then do /*no special case so far ··· */
if k1=. then if k2=. then if x1=x2 then $=@ident /*identical. */
else $=@paral /*parallel. */
else do
x=x1 /*use X1 */
y=k2 * x + d2 /*Y from CD */
end
else if k2=. then do /*vertical CD*/
x=x2 /*X from CD */
y=k1 * x + d1 /*Y from AB */
end
else if k1=k2 then if d1=d2 then $= @ident
else $= @paral
else do /*normal.*/
x=(d2-d1) / (k1-k2)
y=k1 * x + d1
end /*normal line*/
end

if $=. then $= 'intersection is at (' || x","y')' /*$ ¬defined?*/
if $=. then $= 'intersection is at (' || x","y')' /*$ ¬defined?*/
info=left( 'a=('xa","ya')', 12) left( 'b=('xb","yb')', 12),
@ = left( 'a=('xa","ya')', 12) left( 'b=('xb","yb')', 12), /*whitespace.*/
left( 'c=('xc","yc')', 12) left( 'd=('xd","yd')', 12)
left( 'c=('xc","yc')', 12) left( 'd=('xd","yd')', 12) /* " */
return left(info, max(51, length(info) ) ) ' ───► ' $ /*return str.*/</lang>
return left(@, max(51, length(@) ) ) ' ───► ' $ /*return str.*/</lang>
{{out|output|text=&nbsp; when using the default inputs:}}
{{out|output|text=&nbsp; when using the default inputs:}}
<pre>
<pre>