;     index
;
;     Normieren eines Vektors           normalize a vector
;     Skalarprodukt                     scalar product
;     Vektorprodukt                     vector product
;     kollinear                         collinear
;     koplanar                          coplanar
;     Flaecheninhalt eines Dreiecks     area of a triangle



;;;   Allgemein verwendbare Unterprogramme
;;;   General-purpose subroutines


;_____________________________________________________________________;

                                                                            ; ^
;;  Normieren eines 3d-Vektors
;;  Unter Beibehaltung der Richtung wird die Laenge auf 1.0 gesetzt,
;;  indem alle drei Komponenten des Vektors
;;  durch dessen urspruengliche Laenge dividiert werden.
;;  Wird der Nullvektor eingegeben, so wird nil zurueckgegeben.

;;  Normalize a 3D vector
;;  Direction of vector is maintained; its length is set to 1.0
;;  by dividing all three components by original length of vector.
;;  The attempt of normalizing a zero vector returns nil.

(defun normalize
   (
      v     ; Vektor            vector
      /
      d     ; dessen Laenge     its length
      tol   ; Toleranz          tolerance
   )

   (setq
      tol 1.0e-012
      d (distance '(0.0 0.0 0.0) v)
   )
   (if (not (equal 0.0 d tol))
      (mapcar '(lambda (c) (/ c d)) v)
   )
)


;_____________________________________________________________________;

                                                                            ; ^
;;  Skalarprodukt zweier 3d-Vektoren
;;  [ergibt Null genau dann,
;;   wenn die Vektoren orthogonal zueinander sind]

;;  Scalar product of two 3D vectors
;;  [returning zero implies and is implied by
;;   both vectors being perpendicular to one another]

(defun scalarProduct
   (v1 v2)

   (+
      (* (car   v1) (car   v2))
      (* (cadr  v1) (cadr  v2))
      (* (caddr v1) (caddr v2))
   )
)


;_____________________________________________________________________;

                                                                            ; ^
;;  Vektorprodukt zweier 3d-Vektoren
;;  [ist stets orthogonal zu beiden Vektoren;
;;   ist Nullvektor genau dann, wenn beide Vektoren parallel sind]

;;  Vector product of two 3D vectors
;;  [is always perpendicular to both vectors;
;;   returning a zero vector implies and is implied by
;;   both vectors being parallel]

(defun vectorProduct
   (v1 v2)

   (list
      (- (* (cadr  v1) (caddr v2)) (* (caddr v1) (cadr  v2)))
      (- (* (caddr v1) (car   v2)) (* (car   v1) (caddr v2)))
      (- (* (car   v1) (cadr  v2)) (* (cadr  v1) (car   v2)))
   )
)


;_____________________________________________________________________;

                                                                            ; ^
;;  Pruefen, ob drei 3d-Punkte auf derselben Geraden liegen
;;  [wenn ja, wird t zurueckgegeben; andernfalls nil]

;;  Check whether three 3D points
;;  are situated on the same straight line
;;  [if yes, t will be returned; otherwise nil]

(defun collinear
   (
      p1 p2 p3   ; Punkte       points
      /
      tol        ; Toleranz     tolerance
   )

   (setq tol 1.0e-012)
   (equal
      '(0.0 0.0 0.0)
      (vectorProduct (mapcar '- p2 p1) (mapcar '- p3 p1))
      tol
   )
)


;_____________________________________________________________________;

                                                                            ; ^
;;  Pruefen, ob vier 3d-Punkte in derselben Ebene liegen
;;  [wenn ja, wird t zurueckgegeben; andernfalls nil]

;;  Check whether four 3D points are situated on the same plane
;;  [if yes, t will be returned; otherwise nil]

(defun coplanar
   (
      p1    ; Punkte                       points
      p2
      p3
      p4
      /
      e1    ; Einheitsvektoren vom 4.      unit vectors from 4th
      e2    ; zum 1., 2. und 3. Punkt;     to 1st, 2nd, and 3rd point;
      e3    ; nil, falls die Punkte        nil if points
            ; identisch sind               are identical

      tol   ; Toleranz                     tolerance
   )

   (setq tol 1.0e-012)
   (if
      (and
         (setq e1 (normalize (mapcar '- p1 p4)))
         (setq e2 (normalize (mapcar '- p2 p4)))
         (setq e3 (normalize (mapcar '- p3 p4)))
      )
      (equal 0.0 (scalarProduct (vectorProduct e1 e2) e3) tol)
      t
   )
)


;_____________________________________________________________________;

                                                                            ; ^
;;  Flaecheninhalt eines Dreiecks
;;  Area of a triangle

(defun areaTriangle
   (p1 p2 p3)   ; Eckpunkte [3d-Punkte]     corners [3D points]

   (*
      0.5
      (distance
         '(0.0 0.0 0.0)
         (vectorProduct (mapcar '- p1 p3) (mapcar '- p2 p3))
      )
   )
)


;_____________________________________________________________________;


;     index                                                                   ; ^