Determine if two triangles overlap: Difference between revisions
Determine if two triangles overlap (view source)
Revision as of 20:31, 11 February 2021
, 3 years ago→{{header|Raku}}: reformatting for clarity
m (→{{header|Phix}}: IupCloseOnEscape no longer needed) |
SqrtNegInf (talk | contribs) m (→{{header|Raku}}: reformatting for clarity) |
||
Line 4,407:
# https://stackoverflow.com/questions/2049582/how-to-determine-if-a-point-is-in-a-2d-triangle
# https://www.geeksforgeeks.org/check-if-two-given-line-segments-intersect/
sub if-overlap ($triangle-pair) {
Line 4,415 ⟶ 4,413:
sub sign (\T) {
return (T
(T[1
}
sub point-in-triangle (\pt, \Y --> Bool) {
my
my
my $
my $
▲ $d3 = sign (pt, Y.[2], Y.[0]);
}
sub orientation(\P, \Q, \R --> Int) {
my \val = (Q
(Q
return 0 if val == 0; # colinear
▲ return (val > 0) ?? 1 !! 2; # clock or counterclock wise
}
sub onSegment(\P, \Q, \R --> Bool) {
Q
?? True !! False
}
sub intersect(\A,\B,\C,\D --> Bool) {
my \o1 = orientation A, C, D;
my \o2 = orientation B, C, D;
my \o3 = orientation A, B, C;
my \o4 = orientation A, B, D;
return True if o1 != o2 && o3 != o4;▼
return True if (o1 == 0 && onSegment(A, C, D)) ;▼
return True if (o2 == 0 && onSegment(B, C, D)) ;▼
return True if (o3 == 0 && onSegment(A, B, C)) ;▼
return True if (o4 == 0 && onSegment(A, B, D)) ;▼
return False;▼
}
for ^3 {
{ $result = True; last } if
point-in-triangle
point-in-triangle B.[$^i], A ;
}
unless $result {
$result = True if
intersect A.[0], A.[1], B.[0], B.[1] or
intersect A.[0], A.[1], B.[0], B.[2]
}
say "{A
}
Line 4,488 ⟶ 4,482:
if-overlap $_ for DATA ;</lang>
{{out}}
[(0 0) (0 5) (5 0)] and [(0 0) (0 5) (5 0)] do overlap.
[(0 0) (5 0) (0 5)] and [(-10 0) (-5 0) (-1 6)] do NOT overlap.
Line 4,494 ⟶ 4,489:
[(0 0) (1 1) (0 2)] and [(2 1) (3 0) (3 2)] do NOT overlap.
[(0 0) (1 1) (0 2)] and [(2 1) (3 -2) (3 4)] do NOT overlap.
[(0 0) (1 0) (0 1)] and [(1 0) (2 0) (1 1)] do overlap.</pre>
=={{header|REXX}}==
|