Talk:Find the intersection of two lines: Difference between revisions
Talk:Find the intersection of two lines (view source)
Revision as of 21:04, 29 December 2021
, 2 years ago→javascript
(→a REXX version of a REXX version: added a peer comment.) |
|||
(9 intermediate revisions by 4 users not shown) | |||
Line 1:
==a REXX version of a REXX version==
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
::* aligned indentation for all '''do-end''' blocks (and encapsulated statements)
::* elided distracting superfluous
::*
::* elides the superfluous and distracting use of concatenation ('''││''')
::* a unique symbol instead of a null literal for a special case
::* aligns the data points and results in the output
::* adds whitespace to make arithmetic computations more perusable
::* eschews title-case
::* maintains the same line for the '''then''' clause and the '''if''' clause (no split statements)
::* uses indentations for all REXX statements in the function
::* has the result on the same line as the input (data points)
::* a different quoted literal style (for easier reading of multiple literals on the same clause)
::* REXX variables to hold long literals that would otherwise cause excessive wide REXX statements
::* a comma (instead of a slash) to separate the <big> '''x y''' </big> coördinates of the data points.
::* elides superfluous '''do-end''' block structures; less clutter, easier to read
::*
::* tests all data possibilities (for showing all the tested non-intersecting conditions)
::* for viewing the calculation in its entirity, all program logic was kept within single viewable screen
{{trans|REXX (version 2)}}
<lang rexx>/*REXX program finds (possibly) the intersection of two lines (with diagnostic errors).*/
say iSect( 4 0 6 10 0 3 10 7 )
say iSect( 0 0 0 10 0 3 10 7 )
say iSect( 0 0 0 10 0 3 10 7 )
say iSect( 0 0 0 1 1 0 1 7 )
say iSect( 0 0 0 0 0 3 10 7 )
say iSect( 0 0 3 3 0 0 6 6 )
say iSect( 0 0 3 3 0 1 6 7 )
say iSect( 0 0 3 3 8 8 8 8 )
exit /* ═══a═══ ═══b═══ ═══c═══ ═══c═══
/*──────────────────────────────────────────────────────────────────────────────────────*/
iSect: procedure;
else do; k2=(yd-yc) / (xd-xc) /*compute the slope of CD */
@ident= 'lines AB and CD are identical' /*literal to help shorten a line*/
@paral= 'lines AB and CD are parallel'
end
else if k2=. then do; x=x2 /*X from CD */
else $= @paral
else do; x=(d2-d1) / (k1-k2)
if $=. then $= 'intersection is at (' || x","y')'
@ = left( 'a=('xa","ya')', 12) left( 'b=('xb","yb')', 12),
left( 'c=('xc","yc')', 12) left( 'd=('xd","yd')', 12) /* " */
else do▼
return left(@, max(51, length(@) ) )
if $=. then do▼
▲ if k1=. then if k2=. then if x1=x2 then $=@ident
▲ else $=@paral
▲ else do
▲ x=x1
▲ y=k2 * x + d2
▲ end
▲ x=x2
▲ y=k1 * x + d1
▲ end
▲ else if k1=k2 then if d1=d2 then $= @ident
▲ else $= @paral
▲ else do
▲ x=(d2-d1) / (k1-k2)
▲ y=k1 * x + d1
▲ end
▲{{out|output|text= when using the default input:}}
<pre>
a=(4,0) b=(6,10) c=(0,3) d=(10,7)
a=(0,0) b=(0,10) c=(0,3) d=(10,7)
a=(0,0) b=(0,10) c=(0,3) d=(10,7)
a=(0,0) b=(0,1) c=(1,0) d=(1,7)
a=(0,0) b=(0,0) c=(0,3) d=(10,7)
a=(0,0) b=(3,3) c=(0,0) d=(6,6)
a=(0,0) b=(3,3) c=(0,1) d=(6,7)
a=(0,0) b=(3,3) c=(8,8) d=(8,8)
</pre>
==============================================================================================
: If I were to translate many of the Rexx programs of GS to my liking I'd be busy for months.
Line 94 ⟶ 89:
-----
::: There is no reason to take it personally. It wasn't meant as a criticism, it is just another version in a different style, albeit a fair number of (style) differences. <u>Everybody's</u> code can be improved (as least, the style can be changed). In this case, I elided a few superfluous statements, which, in my opinion, didn't add anything to the REXX program or make it easier to understand/peruse. I didn't appreciate your style of capitalization, misaligned DO-END statements (and the intervening/encapsulating REXX statements), split IF-THEN clauses, and much more. But, that's only my opinion and preferences, I merely added a version that I found easier to read and understand (and I hoped others will appreciate this version), and I also removed superfluous DO-END blocks and such. Note that this re-written REXX version was added in the ''
-----
:::: The only thing I liked about this variation is the presentation of the result.
:::: The a= etc. should be A= etc. to be consistent.
:::: I dislike that the variation can no longer be used with ooRexx :-(
:::: and i cannot appreciate the landscape formatting!
:::: But let's agree that our taste as far as formatting is concerned is vastly different.
:::: And I added commentary to my version. --[[User:Walterpachl|Walterpachl]] ([[User talk:Walterpachl|talk]]) 09:29, 19 May 2017 (UTC)
== Clojure version does not handle edge case case of undefined slope (vertical line) ==
The part that calculates m (slope) fails if `(- x2 x1)` is zero.
(defn compute-line [pt1 pt2]
(let [[x1 y1] pt1
{:slope m
:offset (- y1 (* m x1))}))
Should the clojure version do something other than throw an exception if the compute-line fn receives a vertical line like [0 0] [0 6], but also all cases like [X Y] [X Z], I would suspect.
Currently it just throws on divide by zero, which means you can not find the intersection if the both x-coords points of one line are the same.
== javascript ==
can we have a webpage version of the code?
:I just added an online link for a transpiled version of Phix (am currently doing that sort of thing to lots of pages), not exactly what you asked for I know, but you could use that as a starting point: rip out my p2js.js, make X=0 and Y=1, replace $subse() with plain e[X] etc, kill off all those ugly "sequence", a few "[," ==> "[", and lastly you'll need a replacement for my print(). HTH. --[[User:Petelomax|Pete Lomax]] ([[User talk:Petelomax|talk]]) 21:04, 29 December 2021 (UTC) PS Please in future sign your posts using <nowiki>--~~~~</nowiki> (without the nowiki bits).
|