Nice solution. I had forgotten the projecting properties of %. Performance improvement is possible by substituting %. by +/@:* -...@% ] +/@:* ]
'C S E'=:10000 ,@#"(0 1) 0 0 0, 1 2 3 ,: _2 8 1 R=:10000 rank'C (R>:+/&.:*:)@:([- ]* 0>.1<.%.)&(-&S) E';'C (R>:+/&.:*:)@:([- ]* 0>.1<.(+/@:* -...@% ] +/@:* ]))&(-&S) E' +----+-----+----+----+ |rank|tm*sz|time|size| +----+-----+----+----+ | 1 |2.63 |1.18|2.23| +----+-----+----+----+ | 0 |1.00 |1.00|1.00| +----+-----+----+----+ -:/".&>'C (R>:+/&.:*:)@:([- ]* 0>.1<.%.)&(-&S) E';'C (R>:+/&.:*:)@:([- ]* 0>.1<.(+/@:* -...@% ] +/@:* ]))&(-&S) E' 1 R.E. Boss > -----Oorspronkelijk bericht----- > Van: [email protected] [mailto:programming- > [email protected]] Namens Marshall Lochbaum > Verzonden: donderdag 7 oktober 2010 22:44 > Aan: 'Programming forum' > Onderwerp: Re: [Jprogramming] Puzzle: line-circle/sphere intersection > > Alright. Take the projection of the center onto the line segment using > %. . > This is not allowed to be more than 0 or less than 1, so use (0>.1<.]) > to > take the endpoints if it is. Then find this point on the line again and > see > if it is inside the circle. > C (R>:+/&.:*:)@:([- ]* 0>.1<.%.)&(-&S) E > > Not tested yet, but I will update on that... > Marshall > > -----Original Message----- > From: [email protected] > [mailto:[email protected]] On Behalf Of Henry Rich > Sent: Thursday, October 07, 2010 7:58 AM > To: Programming forum > Subject: Re: [Jprogramming] Puzzle: line-circle/sphere intersection > > I intend that a segment wholly inside the circle/sphere to be counted > as > intersecting. In other words, the circle/sphere is solid and we want > to > know if the segment touches any of it. > > Henry Rich > > On 10/7/2010 7:52 AM, R.E. Boss wrote: > > That was bad reading from my side. > > The formulas should be: > > > > ((S-C)<R)*.((E-C)<R) -...@+. ((S-C)>R)*.((E-C)>R) > > > > D=: +&.*:/"1 (S,:E)-"1 C > > > > (D<R) -...@+.&(*./) D>R > > > > Apart from that, the mathematics is not correct either. I will give > it > > another thought. > > > > > > R.E. Boss > > > > > >> -----Oorspronkelijk bericht----- > >> Van: [email protected] [mailto:programming- > >> [email protected]] Namens Bo Jacoby > >> Verzonden: donderdag 7 oktober 2010 13:02 > >> Aan: Programming forum > >> Onderwerp: Re: [Jprogramming] Puzzle: line-circle/sphere > intersection > >> > >> Hello Boss. > >> > >> I do not understand your notation. Henry wrote "startpoint S and > >> endpoint E". You wrote "endpoints A and B", but you use E in your > pseudo > code. > >> Please explain. > >> > >> It seems to me that you must compute the distances (s) from C to S, > >> (e) from C to E and (p) from C to the closest point P, (the > >> perihelion), and you must determine (b) if P is between S and E. > >> Intersection occurs if (s<R and e>R) or (s>R and e<R) or (b and p<R > and > (s>R or e>R)). > >> > >> --- Den tors 7/10/10 skrev R.E. Boss<[email protected]>: > >> > >> Fra: R.E. Boss<[email protected]> > >> Emne: Re: [Jprogramming] Puzzle: line-circle/sphere intersection > >> Til: "'Programming forum'"<[email protected]> > >> Dato: torsdag 7. oktober 2010 09.49 > >> > >> Since the word 'intersect' is used, I assume you mean the boundary > of > >> the circle/sphere (and not the area), so that a line segment which > is > >> completely inside is not intersecting. One point at the boundary > >> means intersecting, I assume. > >> So the segment is not intersecting if and only if it is completely > >> inside or completely outside the circle/sphere. > >> > >> > >> If the line segment is given by the endpoints A and B, the pseudo > >> code is rather straightforward: > >> > >> ((A-E)<R)*.((B-E)<R) -...@+. ((A-E)>R)*.((B-E)>R) > >> > >> so ones gets > >> > >> D=: +&.*:/"1 (A,:B)-"1 E > >> > >> (D<R) -...@+.&(*./) D>R > >> > >> (untested) > >> > >> > >> R.E. Boss > >> > >> > >>> -----Oorspronkelijk bericht----- > >>> Van: [email protected] [mailto:programming- > >>> [email protected]] Namens Henry Rich > >>> Verzonden: woensdag 6 oktober 2010 22:54 > >>> Aan: Programming forum > >>> Onderwerp: [Jprogramming] Puzzle: line-circle/sphere intersection > >>> > >>> Given circle/sphere with center C and radius R, and a line-segment > >>> with startpoint S and endpoint E, write the J code to tell whether > >>> the line-segment intersects the circle/sphere. > >>> > >>> R is an atom, the rest are lists with 2 or 3 atoms. > >>> > >>> This problem arises in collision detection for games and > simulators, > >>> or if you are trying to see whether a path intersects a round > obstacle. > >>> > >>> I found a solution whose brevity surprised me. > >>> > >>> Henry Rich > >>> ------------------------------------------------------------------- > - > >>> -- For information about J forums see > >>> http://www.jsoftware.com/forums.htm > >> > >> -------------------------------------------------------------------- > - > >> - For information about J forums see > >> http://www.jsoftware.com/forums.htm > >> > >> > >> -------------------------------------------------------------------- > - > >> - For information about J forums see > >> http://www.jsoftware.com/forums.htm > > > > --------------------------------------------------------------------- > - > > For information about J forums see > http://www.jsoftware.com/forums.htm > > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
