Frankiezafe (Talk | contribs) (Created page with "This page contains codes of useful math methods already turned into code. == Geometry == == Segments' intersection <ref>Adapted from a stackoverflow post, by ''ubuntu'' - [...") |
Frankiezafe (Talk | contribs) m (Frankiezafe moved page Notes:Math to Notes:Geometry without leaving a redirect) |
||
(10 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | This page contains | + | This page contains snippets of useful math methods already turned into pseudo-code. |
== Geometry == | == Geometry == | ||
− | == Segments' intersection <ref>Adapted from a stackoverflow post | + | === Segments' intersection <ref name="two-line-segments-are-crossing">Adapted from a stackoverflow post by ''ubuntu'' - [http://stackoverflow.com/questions/15297590/improve-in-coding-saving-how-to-check-if-two-line-segments-are-crossing-in-pytho stackoverflow.com]</ref> === |
− | + | vec2f intersection( vec2f a1, vec2f a2, vec2f b1, vec2f b2 ) { | |
float a = a2.x - a1.x; | float a = a2.x - a1.x; | ||
float b = b1.x - b2.x; | float b = b1.x - b2.x; | ||
Line 16: | Line 16: | ||
if ( abs( denom ) < 1e-5 ) { | if ( abs( denom ) < 1e-5 ) { | ||
// parrallel | // parrallel | ||
− | return | + | return 0; |
} else { | } else { | ||
float t = (e*d - b*f)/denom; | float t = (e*d - b*f)/denom; | ||
− | return new | + | float s = (a*f - e*c)/denom; |
+ | if ( t >= 0 && t <= 1 && s >= 0 && s<=1 ) { | ||
+ | return new vec2f( a1.x + t * ( a2.x - a1.x ), a1.y + t * ( a2.y - a1.y ) ); | ||
+ | } | ||
+ | return 0; | ||
} | } | ||
} | } | ||
+ | |||
+ | To transform this method into a line intersection detection, just comment the test on ''t'' and ''s''. The smarter thing to do is to make this test optional: | ||
+ | |||
+ | vec2f intersection( vec2f a1, vec2f a2, vec2f b1, vec2f b2, bool keep_in_segment = true ) { | ||
+ | ... | ||
+ | if ( ( keep_in_segment && t >= 0 && t <= 1 && s >= 0 && s<=1 ) || ( !keep_in_segment ) ) { | ||
+ | |||
+ | === Segments' crossing <ref name="two-line-segments-are-crossing"/> === | ||
+ | |||
+ | boolean crosses( vec2f a1, vec2f a2, vec2f b1, vec2f b2 ) { | ||
+ | float a = a2.x - a1.x; | ||
+ | float b = b1.x - b2.x; | ||
+ | float c = a2.y - a1.y; | ||
+ | float d = b1.y - b2.y; | ||
+ | float e = b1.x - a1.x; | ||
+ | float f = b1.y - a1.y; | ||
+ | float denom = a * d - b * c; | ||
+ | if ( abs( denom ) < 1e-5 ) { | ||
+ | // parrallel | ||
+ | return false; | ||
+ | } else { | ||
+ | float t = (e*d - b*f)/denom; | ||
+ | float s = (a*f - e*c)/denom; | ||
+ | return ( t >= 0 && t <= 1 && s >= 0 && s<=1 ); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | <references/> | ||
+ | |||
+ | [[Category:math]] | ||
+ | [[Category:code snippet]] | ||
+ | [[Category:pseudocode]] |
This page contains snippets of useful math methods already turned into pseudo-code.
vec2f intersection( vec2f a1, vec2f a2, vec2f b1, vec2f b2 ) { float a = a2.x - a1.x; float b = b1.x - b2.x; float c = a2.y - a1.y; float d = b1.y - b2.y; float e = b1.x - a1.x; float f = b1.y - a1.y; float denom = a * d - b * c; if ( abs( denom ) < 1e-5 ) { // parrallel return 0; } else { float t = (e*d - b*f)/denom; float s = (a*f - e*c)/denom; if ( t >= 0 && t <= 1 && s >= 0 && s<=1 ) { return new vec2f( a1.x + t * ( a2.x - a1.x ), a1.y + t * ( a2.y - a1.y ) ); } return 0; } }
To transform this method into a line intersection detection, just comment the test on t and s. The smarter thing to do is to make this test optional:
vec2f intersection( vec2f a1, vec2f a2, vec2f b1, vec2f b2, bool keep_in_segment = true ) { ... if ( ( keep_in_segment && t >= 0 && t <= 1 && s >= 0 && s<=1 ) || ( !keep_in_segment ) ) {
boolean crosses( vec2f a1, vec2f a2, vec2f b1, vec2f b2 ) { float a = a2.x - a1.x; float b = b1.x - b2.x; float c = a2.y - a1.y; float d = b1.y - b2.y; float e = b1.x - a1.x; float f = b1.y - a1.y; float denom = a * d - b * c; if ( abs( denom ) < 1e-5 ) { // parrallel return false; } else { float t = (e*d - b*f)/denom; float s = (a*f - e*c)/denom; return ( t >= 0 && t <= 1 && s >= 0 && s<=1 ); } }
online identity ∋ [ social ∋ [mastodon♥, twitter®, facebook®, diaspora, linkedin®]
∥ repos ∋ [github®, gitlab♥, bitbucket®, sourceforge] ∥ media ∋ [itch.io®, vimeo®, peertube♥, twitch.tv®, tumblr®] ∥ communities ∋ [godotengine♥, openprocessing, stackoverflow, threejs]]