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.
127 lines
3.6 KiB
127 lines
3.6 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=======================================================================
|
|
LOGICAL FUNCTION CKCROS (IMID, IH, NLNKF, LINKF1, XN, YN, ZN)
|
|
C=======================================================================
|
|
|
|
C --*** CKCROS *** (MESH) Hide partial lines by face
|
|
C -- Written by Amy Gilkey - revised 10/02/86
|
|
C --
|
|
C --CKCROS deletes partial lines that have a visible node along the edge
|
|
C --of a quarilateral and the hidden node is within the area defined
|
|
C --by the vectors from the corner to the two adjacent nodes. Such
|
|
C --a face totally hides the partial line.
|
|
C --
|
|
C --Parameters:
|
|
C -- IMID - IN - the node in the face that is closest to the
|
|
C -- visible node
|
|
C -- IH - IN - the hidden nodes
|
|
C -- NLNKF - IN - the number of nodes per face
|
|
C -- LINKF1 - IN - the connectivity for the face containing the edge
|
|
C -- XN,YN,ZN - IN - the nodal coordinates
|
|
|
|
include 'debug.blk'
|
|
C common /debugc/ cdebug
|
|
C common /debugn/ idebug
|
|
C character*8 cdebug
|
|
|
|
INTEGER LINKF1(NLNKF)
|
|
REAL XN(*), YN(*), ZN(*)
|
|
|
|
CKCROS = .FALSE.
|
|
|
|
C --Find left and right node for face
|
|
|
|
DO 100 ILINK = 1, 4
|
|
IF (LINKF1(ILINK) .EQ. IMID) IXMID = ILINK
|
|
100 CONTINUE
|
|
IF (IXMID .LT. 4) THEN
|
|
ILFT = LINKF1(IXMID+1)
|
|
ELSE
|
|
ILFT = LINKF1(1)
|
|
END IF
|
|
IF (IXMID .GT. 1) THEN
|
|
IRGT = LINKF1(IXMID-1)
|
|
ELSE
|
|
IRGT = LINKF1(4)
|
|
END IF
|
|
IF ((ILFT .EQ. IH) .OR. (IRGT .EQ. IH)) GOTO 110
|
|
XMID = XN(IMID)
|
|
YMID = YN(IMID)
|
|
XLFT = XN(ILFT)
|
|
YLFT = YN(ILFT)
|
|
XRGT = XN(IRGT)
|
|
YRGT = YN(IRGT)
|
|
IF ((XLFT-XMID)*YRGT + (XRGT-XLFT)*YMID
|
|
& + (XMID-XRGT)*YLFT .LT. 0.0) THEN
|
|
I = IRGT
|
|
IRGT = ILFT
|
|
ILFT = I
|
|
XLFT = XN(ILFT)
|
|
YLFT = YN(ILFT)
|
|
XRGT = XN(IRGT)
|
|
YRGT = YN(IRGT)
|
|
END IF
|
|
|
|
C --Check 2 triangles formed by 2 adjacent nodes of the face
|
|
C --and the node have a positive area
|
|
|
|
X0 = XN(IH)
|
|
Y0 = YN(IH)
|
|
ALFT = (XLFT-XMID)*Y0 + (X0-XLFT)*YMID + (XMID-X0)*YLFT
|
|
IF (ALFT .LT. 0.0) GOTO 110
|
|
ARGT = (XMID-XRGT)*Y0 + (X0-XMID)*YRGT + (XRGT-X0)*YMID
|
|
IF (ARGT .LT. 0.0) GOTO 110
|
|
|
|
C --Check if the node's Z is behind the face's Z at that point
|
|
|
|
ZMIN = MIN
|
|
& (ZN(LINKF1(1)), ZN(LINKF1(2)), ZN(LINKF1(3)), ZN(LINKF1(4)))
|
|
|
|
IF (ZMIN .LE. ZN(IH)) THEN
|
|
|
|
C --Calculate normal at visible node with diagonal node and
|
|
C --left or right node
|
|
|
|
IF (IXMID .GT. 2) THEN
|
|
IDIA = LINKF1(IXMID-2)
|
|
ELSE
|
|
IDIA = LINKF1(IXMID+2)
|
|
END IF
|
|
|
|
ZMID = ZN(IMID)
|
|
|
|
AMIN = MIN (ALFT, ARGT)
|
|
|
|
IF (AMIN .EQ. ALFT) THEN
|
|
ISIDA = ILFT
|
|
ISIDB = IDIA
|
|
ELSE IF (AMIN .EQ. ARGT) THEN
|
|
ISIDA = IDIA
|
|
ISIDB = IRGT
|
|
END IF
|
|
AX = XN(ISIDA) - XMID
|
|
AY = YN(ISIDA) - YMID
|
|
AZ = ZN(ISIDA) - ZMID
|
|
BX = XN(ISIDB) - XMID
|
|
BY = YN(ISIDB) - YMID
|
|
BZ = ZN(ISIDB) - ZMID
|
|
XNORM = 0.5 * (AY*BZ - BY*AZ)
|
|
YNORM = 0.5 * (AZ*BX - BZ*AX)
|
|
ZNORM = 0.5 * (AX*BY - BX*AY)
|
|
|
|
IF ((XNORM*(X0-XMID) + YNORM*(Y0-YMID)
|
|
& + ZNORM*(ZN(IH)-ZMID)) .GE. 0.0) GOTO 110
|
|
END IF
|
|
|
|
C --Mark totally hidden lines
|
|
|
|
CKCROS = .TRUE.
|
|
|
|
110 CONTINUE
|
|
RETURN
|
|
END
|
|
|