Find if a point is within a triangle: Difference between revisions

Content added Content deleted
No edit summary
(Fortran implementation using convex hull algorithm)
Line 757: Line 757:
....................
....................
....................
....................
</pre>

=={{header|Fortran}}==
<lang Fortran>
PROGRAM POINT_WITHIN_TRIANGLE

IMPLICIT NONE

REAL (KIND = SELECTED_REAL_KIND (8)) px, py, ax, ay, bx, by, cx, cy

px = 0.0
py = 0.0
ax = 1.5
ay = 2.4
bx = 5.1
by = -3.1
cx = -3.8
cy = 1.2

IF (IS_P_IN_ABC (px, py, ax, ay, bx, by, cx, cy)) THEN

WRITE (*, *) 'Point (', px, ', ', py, ') is within triangle &
[(', ax, ', ', ay,'), (', bx, ', ', by, '), (', cx, ', ', cy, ')].'

ELSE

WRITE (*, *) 'Point (', px, ', ', py, ') is not within triangle &
[(', ax, ', ', ay,'), (', bx, ', ', by, '), (', cx, ', ', cy, ')].'

END IF

CONTAINS

!Provide xy values of points P, A, B, C, respectively.
LOGICAL FUNCTION IS_P_IN_ABC (px, py, ax, ay, bx, by, cx, cy)

REAL (KIND = SELECTED_REAL_KIND (8)), INTENT (IN) :: px, py, ax, ay, bx, by, cx, cy
REAL (KIND = SELECTED_REAL_KIND (8)) :: vabx, vaby, vacx, vacy, a, b

vabx = bx - ax
vaby = by - ay
vacx = cx - ax
vacy = cy - ay

a = ((px * vacy - py * vacx) - (ax * vacy - ay * vacx)) / &
(vabx * vacy - vaby * vacx)
b = -((px * vaby - py * vabx) - (ax * vaby - ay * vabx)) / &
(vabx * vacy - vaby * vacx)

IF ((a .GT. 0) .AND. (b .GT. 0) .AND. (a + b < 1)) THEN

IS_P_IN_ABC = .TRUE.

ELSE

IS_P_IN_ABC = .FALSE.

END IF

END FUNCTION IS_P_IN_ABC

END PROGRAM POINT_WITHIN_TRIANGLE
</lang>
{{out}}<pre>
Point ( 0.0000000000000000 , 0.0000000000000000 ) is within triangle [( 1.5000000000000000 , 2.4000000953674316 ), ( 5.0999999046325684 , -3.0999999046325684 ), ( -3.7999999523162842 , 1.2000000476837158 )].
</pre>
</pre>