You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
3.0 KiB
90 lines
3.0 KiB
C Copyright(C) 1999-2020 National Technology & Engineering Solutions
|
|
C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
|
|
C NTESS, the U.S. Government retains certain rights in this software.
|
|
C
|
|
C See packages/seacas/LICENSE for details
|
|
|
|
C=======================================================================
|
|
SUBROUTINE PTSNRM( PLAPTS, INPT, CUTPT, CUTNRM , IERR)
|
|
C=======================================================================
|
|
|
|
C --*** PTRNRM *** (MESH) Turns three point plane to point-normal form
|
|
C -- Written by Ray J. Meyers 29 May, 1990
|
|
C --
|
|
C -- Given three non-colinear points, returns a description of the plane
|
|
C -- consisting of a point on the plane and a normal vector to the plane.
|
|
C --
|
|
C --Parameters:
|
|
C -- PLAPTS - IN - the 3 points defining the cutting plane;
|
|
C -- INPT - IN - a point in the mesh, ie, on the opposite side
|
|
C from the cutting plane normal
|
|
C -- CUTPT - OUT - a point on the cutting plane;
|
|
C -- CUTNRM - OUT - the normal to the cutting plane;
|
|
C -- IERR - OUT - non-zero if the input points are colinear (no plane
|
|
C defined)
|
|
|
|
REAL PLAPTS(3,3)
|
|
REAL INPT(3)
|
|
REAL CUTPT(3)
|
|
REAL CUTNRM(3)
|
|
INTEGER IERR
|
|
REAL VEC1(3), VEC2(3)
|
|
REAL TOL, DOT
|
|
|
|
C DEFINE TWO VECTORS IN THE PLANE : VEC1 = P1-P2, VEC2 = P3-P2
|
|
|
|
VEC1(1) = PLAPTS(1,1) - PLAPTS(1,2)
|
|
VEC1(2) = PLAPTS(2,1) - PLAPTS(2,2)
|
|
VEC1(3) = PLAPTS(3,1) - PLAPTS(3,2)
|
|
VEC2(1) = PLAPTS(1,3) - PLAPTS(1,2)
|
|
VEC2(2) = PLAPTS(2,3) - PLAPTS(2,2)
|
|
VEC2(3) = PLAPTS(3,3) - PLAPTS(3,2)
|
|
|
|
C DEFINE A TOLERANCE BASED ON THE LENGTH OF VEC1
|
|
|
|
TOL = 1E-06 * AMAX1 ( VEC1(1), VEC1(2), VEC1(3) )
|
|
|
|
C TAKE THE CROSS PRODUCT OF VEC1 AND VEC2 AS THE NORMAL OF THE PLANE AND
|
|
C NORMALIZE
|
|
|
|
CUTNRM(1) = VEC1(2)*VEC2(3) - VEC1(3)*VEC2(2)
|
|
CUTNRM(2) = VEC1(3)*VEC2(1) - VEC1(1)*VEC2(3)
|
|
CUTNRM(3) = VEC1(1)*VEC2(2) - VEC1(2)*VEC2(1)
|
|
|
|
DIST = SQRT( CUTNRM(1)*CUTNRM(1) + CUTNRM(2)*CUTNRM(2) +
|
|
$ CUTNRM(3)*CUTNRM(3) )
|
|
CUTNRM(1) = CUTNRM(1)/DIST
|
|
CUTNRM(2) = CUTNRM(2)/DIST
|
|
CUTNRM(3) = CUTNRM(3)/DIST
|
|
|
|
C IF THE NORMAL IS (0,0,0), THE ORIGINAL POINTS WERE COLINEAR
|
|
|
|
IF( ABS(CUTNRM(1)) .LT. TOL .AND. ABS(CUTNRM(2)) .LT. TOL
|
|
$ .AND. ABS(CUTNRM(3)) .LT. TOL) THEN
|
|
CALL PRTERR ('CMDERR', 'Points do not define a plane')
|
|
IERR = 1
|
|
ELSE
|
|
IERR = 0
|
|
|
|
C USE THE SECOND INPUT POINT AS THE CHOSEN CUTPT
|
|
|
|
CUTPT(1) = PLAPTS(1,2)
|
|
CUTPT(2) = PLAPTS(2,2)
|
|
CUTPT(3) = PLAPTS(3,2)
|
|
|
|
C CHECK THE INPT TO SEE IF THE NORMAL IS THE CORRECT SENSE
|
|
|
|
VEC1(1) = INPT(1) - CUTPT(1)
|
|
VEC1(2) = INPT(2) - CUTPT(2)
|
|
VEC1(3) = INPT(3) - CUTPT(3)
|
|
DOT = VEC1(1)*CUTNRM(1) + VEC1(2)*CUTNRM(2) +
|
|
$ VEC1(3)*CUTNRM(3)
|
|
IF(DOT .GT. 0) THEN
|
|
CUTNRM(1) = -CUTNRM(1)
|
|
CUTNRM(2) = -CUTNRM(2)
|
|
CUTNRM(3) = -CUTNRM(3)
|
|
END IF
|
|
END IF
|
|
|
|
RETURN
|
|
END
|
|
|