# Pastebin AWYX0oJg (defun part-positions-from-extended-strand-positions (origami extended-strand-position) "Generate the positions of the parts from extended-helix positions" (let ((part-position (make-array (* 7 (length (parts origami))) :element-type 'double-float :adjustable nil))) (loop for part in (parts origami) for extended-helix = (gethash part (map-part-to-extended-strand origami)) for extended-helix-number-of-nodes = (number-of-nodes extended-helix) for extended-helix-z-start = (nonbond-node-z-offset-and-length extended-helix-number-of-nodes) for (p5-node-index p3-node-index) = (multiple-value-list (node-indices-for-part part extended-helix)) for p5-z-offset = (node-z-offset extended-helix-z-start p5-node-index) for p3-z-offset = (node-z-offset extended-helix-z-start p3-node-index) for part-centroid-z-offset = (* (+ p5-z-offset p3-z-offset) 0.5) for eha = (elt extended-strand-position 0) for ehb = (elt extended-strand-position 1) for ehc = (elt extended-strand-position 2) for ehd = (elt extended-strand-position 3) for ehx = (elt extended-strand-position 4) for ehy = (elt extended-strand-position 5) for ehz = (elt extended-strand-position 6) for transform = (let ((m (geom:make-matrix nil))) (geom:set-from-quaternion m eha ehb ehc ehd ehx ehy ehz) m) for zvec = (geom:vec 0.0 0.0 part-centroid-z-offset) for part-centroid = (geom:m*v transform zvec) for part-order-id = (order-id part) for part-pos-start = (* 7 order-id) do (setf (elt part-position (+ part-pos-start 0)) eha (elt part-position (+ part-pos-start 1)) ehb (elt part-position (+ part-pos-start 2)) ehc (elt part-position (+ part-pos-start 3)) ehd (elt part-position (+ part-pos-start 4)) (geom:vx part-centroid) (elt part-position (+ part-pos-start 5)) (geom:vy part-centroid) (elt part-position (+ part-pos-start 6)) (geom:vz part-centroid))) part-position))