Author Topic: RND POINT CLOUD - WRAP IT WITH OUTER 3DFACES  (Read 3977 times)

0 Members and 1 Guest are viewing this topic.

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
RND POINT CLOUD - WRAP IT WITH OUTER 3DFACES
« on: March 25, 2013, 04:43:39 AM »
Hi, again, I don't believe I can solve this alone, and the task is complicated and also challenging, so I am posting my code for this... As I wrote it, now it checks for face-face crossings or touchings, but every method I can think isn't good enough... Simple question would be : how to make ACAD distinguish between inner and outer 3dfaces that should wrap RND point cloud... The best would be if possible to generate only outer faces in start, but as this seems to undefined I decided to make all 3dfaces, and then to remove inner ones... Still I don't know how to achieve this even if I cycle through each face to face check, for it seems that they all touches themselves with each other... I just simply can't find appropriate method to try to apply to 3dface cloud...

I don't expect this is easy task, and I work and use only ALISP, so maybe if someone can think what should I look for, please help...

Code - Auto/Visual Lisp: [Select]
  1. (defun touch23df-p ( f1p1 f1p2 f1p3 f1p4 f2p1 f2p2 f2p3 f2p4 / a1 a2 ap0 ap1 ap2 b1 b2 bp0 bp1 bp2 c1 c2 cp0 cp1 cp2 d dp0 dp1 dp2 dx dy dz p1 p1x p1y p1z p2 p2x p2y p2z pp1 pp2 pp3 pp4 pp5 pp6 ptp1 ptp2 ptp3 ptp4 ptp5 ptp6 vlx vly vlz )
  2.  
  3.   (if (equal f1p1 f1p2 1e-8) (setq ptp1 f1p1 ptp2 f1p3 ptp3 f1p4))
  4.   (if (equal f1p1 f1p3 1e-8) (setq ptp1 f1p1 ptp2 f1p2 ptp3 f1p4))
  5.   (if (equal f1p1 f1p4 1e-8) (setq ptp1 f1p1 ptp2 f1p2 ptp3 f1p3))
  6.   (if (equal f1p2 f1p3 1e-8) (setq ptp1 f1p1 ptp2 f1p2 ptp3 f1p4))
  7.   (if (equal f1p2 f1p4 1e-8) (setq ptp1 f1p1 ptp2 f1p2 ptp3 f1p3))
  8.   (if (equal f1p3 f1p4 1e-8) (setq ptp1 f1p1 ptp2 f1p2 ptp3 f1p3))
  9.  
  10.   (if (equal f2p1 f2p2 1e-8) (setq ptp4 f2p1 ptp5 f2p3 ptp6 f2p4))
  11.   (if (equal f2p1 f2p3 1e-8) (setq ptp4 f2p1 ptp5 f2p2 ptp6 f2p4))
  12.   (if (equal f2p1 f2p4 1e-8) (setq ptp4 f2p1 ptp5 f2p2 ptp6 f2p3))
  13.   (if (equal f2p2 f2p3 1e-8) (setq ptp4 f2p1 ptp5 f2p2 ptp6 f2p4))
  14.   (if (equal f2p2 f2p4 1e-8) (setq ptp4 f2p1 ptp5 f2p2 ptp6 f2p3))
  15.   (if (equal f2p3 f2p4 1e-8) (setq ptp4 f2p1 ptp5 f2p2 ptp6 f2p3))
  16.  
  17.   (setq a1 (- (* (- (cadr ptp3) (cadr ptp1)) (- (caddr ptp2) (caddr ptp1))) (* (- (cadr ptp2) (cadr ptp1)) (- (caddr ptp3) (caddr ptp1))) ))
  18.   (setq b1 (- (* (- (car ptp2) (car ptp1)) (- (caddr ptp3) (caddr ptp1))) (* (- (car ptp3) (car ptp1)) (- (caddr ptp2) (caddr ptp1))) ))
  19.   (setq c1 (- (* (- (car ptp3) (car ptp1)) (- (cadr ptp2) (cadr ptp1))) (* (- (car ptp2) (car ptp1)) (- (cadr ptp3) (cadr ptp1))) ))
  20.   (setq ap1 a1)
  21.   (setq bp1 b1)
  22.   (setq cp1 c1)
  23.   (setq dp1 (+ (* (car ptp1) a1) (* (cadr ptp1) b1) (* (caddr ptp1) c1) ))
  24.  
  25.   (setq a2 (- (* (- (cadr ptp6) (cadr ptp4)) (- (caddr ptp5) (caddr ptp4))) (* (- (cadr ptp5) (cadr ptp4)) (- (caddr ptp6) (caddr ptp4))) ))
  26.   (setq b2 (- (* (- (car ptp5) (car ptp4)) (- (caddr ptp6) (caddr ptp4))) (* (- (car ptp6) (car ptp4)) (- (caddr ptp5) (caddr ptp4))) ))
  27.   (setq c2 (- (* (- (car ptp6) (car ptp4)) (- (cadr ptp5) (cadr ptp4))) (* (- (car ptp5) (car ptp4)) (- (cadr ptp6) (cadr ptp4))) ))
  28.   (setq ap2 a2)
  29.   (setq bp2 b2)
  30.   (setq cp2 c2)
  31.   (setq dp2 (+ (* (car ptp4) a2) (* (cadr ptp4) b2) (* (caddr ptp4) c2) ))
  32.  
  33.   (setq ap0 0)
  34.   (setq bp0 0)
  35.   (setq cp0 1)
  36.   (setq dp0 0)
  37.  
  38.   (setq vlx (- (* bp1 cp2) (* bp2 cp1)))
  39.   (setq vly (- (* ap2 cp1) (* ap1 cp2)))
  40.   (setq vlz (- (* ap1 bp2) (* ap2 bp1)))
  41.  
  42.   (setq D (+ (* ap1 bp2 cp0) (* bp1 cp2 ap0) (* cp1 ap2 bp0) (* -1 ap0 bp2 cp1) (* -1 bp0 cp2 ap1) (* -1 cp0 ap2 bp1) ))
  43.  
  44.   (if (eq D 0) (progn
  45.   (setq ap0 1)
  46.   (setq bp0 0)
  47.   (setq cp0 0)
  48.   (setq dp0 0)
  49.  
  50.   (setq vlx (- (* bp1 cp2) (* bp2 cp1)))
  51.   (setq vly (- (* ap2 cp1) (* ap1 cp2)))
  52.   (setq vlz (- (* ap1 bp2) (* ap2 bp1)))
  53.  
  54.   (setq D (+ (* ap1 bp2 cp0) (* bp1 cp2 ap0) (* cp1 ap2 bp0) (* -1 ap0 bp2 cp1) (* -1 bp0 cp2 ap1) (* -1 cp0 ap2 bp1) ))
  55.   ))
  56.  
  57.   (if (eq D 0) (progn
  58.   (setq ap0 0)
  59.   (setq bp0 1)
  60.   (setq cp0 0)
  61.   (setq dp0 0)
  62.  
  63.   (setq vlx (- (* bp1 cp2) (* bp2 cp1)))
  64.   (setq vly (- (* ap2 cp1) (* ap1 cp2)))
  65.   (setq vlz (- (* ap1 bp2) (* ap2 bp1)))
  66.  
  67.   (setq D (+ (* ap1 bp2 cp0) (* bp1 cp2 ap0) (* cp1 ap2 bp0) (* -1 ap0 bp2 cp1) (* -1 bp0 cp2 ap1) (* -1 cp0 ap2 bp1) ))
  68.   ))
  69.  
  70.   (setq Dx (+ (* dp1 bp2 cp0) (* bp1 cp2 dp0) (* cp1 dp2 bp0) (* -1 dp0 bp2 cp1) (* -1 bp0 cp2 dp1) (* -1 cp0 dp2 bp1) ))
  71.   (setq Dy (+ (* ap1 dp2 cp0) (* dp1 cp2 ap0) (* cp1 ap2 dp0) (* -1 ap0 dp2 cp1) (* -1 dp0 cp2 ap1) (* -1 cp0 ap2 dp1) ))
  72.   (setq Dz (+ (* ap1 bp2 dp0) (* bp1 dp2 ap0) (* dp1 ap2 bp0) (* -1 ap0 bp2 dp1) (* -1 bp0 dp2 ap1) (* -1 dp0 ap2 bp1) ))
  73.  
  74.   (if (/= D 0.0)
  75.     (progn
  76.       (setq P1x (/ Dx D))
  77.       (setq P1y (/ Dy D))
  78.       (setq P1z (/ Dz D))
  79.       (setq P1 (list P1x P1y P1z))
  80.  
  81.       (setq P2x (+ P1x vlx))
  82.       (setq P2y (+ P1y vly))
  83.       (setq P2z (+ P1z vlz))
  84.       (setq P2 (list P2x P2y P2z))
  85.  
  86.       (setq pp1 (inters p1 p2 ptp1 ptp2 nil))
  87.       (setq pp2 (inters p1 p2 ptp2 ptp3 nil))
  88.       (setq pp3 (inters p1 p2 ptp1 ptp3 nil))
  89.       (setq pp4 (inters p1 p2 ptp4 ptp5 nil))
  90.       (setq pp5 (inters p1 p2 ptp5 ptp6 nil))
  91.       (setq pp6 (inters p1 p2 ptp4 ptp6 nil))
  92.     )
  93.   )
  94.  
  95.   (if (and pp1 pp2 pp3 pp4 pp5 pp6)
  96.     nil
  97.     T
  98.   )
  99. )
  100.  
  101. (defun c:ptscloud-3dfaces ( / ss n pt 3df ss3df sss m 3df1 3df1dxf 3df1p1 3df1p2 3df1p3 3df1p4 k 3df2 3df2dxf 3df2p1 3df2p2 3df2p3 3df2p4 ptlst )
  102.   (setq ss (ssget "_:L" '((0 . "POINT"))))
  103.   (setq ss3df (ssadd))
  104.   (setq sss (ssadd))
  105.   (repeat (setq n (sslength ss))
  106.     (setq pt (cdr (assoc 10 (entget (ssname ss (setq n (1- n)))))))
  107.     (setq ptlst (cons pt ptlst))
  108.   )
  109.   (foreach pt1 ptlst
  110.     (foreach pt2 (vl-remove pt1 ptlst)
  111.       (foreach pt3 (vl-remove pt2 (vl-remove pt1 ptlst))
  112.         (setq 3df (entmakex (list '(0 . "3DFACE") (cons 10 pt1) (cons 11 pt1) (cons 12 pt2) (cons 13 pt3))))
  113.         (ssadd 3df ss3df)
  114.       )
  115.     )
  116.   )
  117.   (repeat (setq m (sslength ss3df))
  118.     (setq 3df1 (ssname ss3df (setq m (1- m))))
  119.     (setq 3df1p1 (cdr (assoc 10 (setq 3df1dxf (entget 3df1)))))
  120.     (setq 3df1p2 (cdr (assoc 11 3df1dxf)))
  121.     (setq 3df1p3 (cdr (assoc 12 3df1dxf)))
  122.     (setq 3df1p4 (cdr (assoc 13 3df1dxf)))
  123.     (repeat (setq k (- (sslength ss3df) 1))
  124.       (setq 3df2 (ssname ss3df (setq k (1- k))))
  125.       (setq 3df2p1 (cdr (assoc 10 (setq 3df2dxf (entget 3df2)))))
  126.       (setq 3df2p2 (cdr (assoc 11 3df2dxf)))
  127.       (setq 3df2p3 (cdr (assoc 12 3df2dxf)))
  128.       (setq 3df2p4 (cdr (assoc 13 3df2dxf)))
  129.       (if (touch23df-p 3df1p1 3df1p2 3df1p3 3df1p4 3df2p1 3df2p2 3df2p3 3df2p4) (ssadd 3df1 sss))
  130.     )
  131.   )
  132.   (repeat (setq n (sslength ss3df))
  133.     (entdel (ssname ss3df (setq n (1- n))))
  134.   )
  135.   (repeat (setq n (sslength sss))
  136.     (entdel (ssname sss (setq n (1- n))))
  137.   )
  138.   (princ)
  139. )
  140.  
  141. (defun c:pts-3df nil (c:ptscloud-3dfaces))
  142.  
  143. (prompt "\nShortcut for c:ptscloud-3dfaces is c:pts-3df \n[Start with : Command: pts-3df]")
  144.  

P.S. I'll attach 10 rnd point cloud, so you can do tests on it as with each point added time for processing is longer and therefore not practical...

If you solve this, I suggest that you try this with more points - download it from this link :
http://www.theswamp.org/index.php?topic=44160.msg494171#msg494171

Sincerely, M.R.
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: RND POINT CLOUD - WRAP IT WITH OUTER 3DFACES
« Reply #1 on: March 25, 2013, 08:59:28 AM »
I did it, and in completely new way... The trick was to make ACAD look above and below points from the imaginary elevation of 3dface, and if it finds points in both sides, then it should erase that face - that's inner face...

So here is my achievement :
Code - Auto/Visual Lisp: [Select]
  1. ; transptucs & transptwcs by M.R. (Marko Ribar, d.i.a.)
  2. ; arguments :
  3. ; pt - point to be transformed from WCS to imaginary UCS with "transptucs" and from imaginary UCS to WCS with "transptwcs"
  4. ; pt1 - origin of imaginary UCS
  5. ; pt2 - point to define X axis of imaginary UCS (vector pt1-pt2 represents X axis)
  6. ; pt3 - point to define Y axis of imaginary UCS (vector pt1-pt3 represents Y axis)
  7. ; important note : angle between X and Y axises of imaginary UCS must always be 90 degree for correct transformation calculation
  8.  
  9. (defun unit ( v )
  10.   (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
  11. )
  12.  
  13. (defun mxv ( m v )
  14.   (mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
  15. )
  16.  
  17. (defun v^v ( u v )
  18.   (list
  19.     (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  20.     (- (* (car  v) (caddr u)) (* (car  u) (caddr v)))
  21.     (- (* (car  u) (cadr  v)) (* (car  v) (cadr  u)))
  22.   )
  23. )
  24.  
  25. (defun transptucs ( pt p1 p2 p3 / ux uy uz )
  26.   (setq uz (unit (v^v (mapcar '- p2 p1) (mapcar '- p3 p1))))
  27.   (setq ux (unit (mapcar '- p2 p1)))
  28.   (setq uy (unit (mapcar '- p3 p1)))
  29.  
  30.   (mxv (list ux uy uz) (mapcar '- pt p1))
  31. )
  32.  
  33. (defun transptwcs ( pt pt1 pt2 pt3 / pt1n pt2n pt3n )
  34.   (setq pt1n (transptucs '(0.0 0.0 0.0) pt1 pt2 pt3))
  35.   (setq pt2n (transptucs '(1.0 0.0 0.0) pt1 pt2 pt3))
  36.   (setq pt3n (transptucs '(0.0 1.0 0.0) pt1 pt2 pt3))
  37.   (transptucs pt pt1n pt2n pt3n)
  38. )
  39.  
  40. (defun c:ptscloud-3dfaces ( / ss n pt 3df ss3df m 3df1 3df1dxf 3df1p1 3df1p2 3df1p3 3df1p4 ptlst nor x lst )
  41.   (setq ss (ssget "_:L" '((0 . "POINT"))))
  42.   (setq ss3df (ssadd))
  43.   (repeat (setq n (sslength ss))
  44.     (setq pt (cdr (assoc 10 (entget (ssname ss (setq n (1- n)))))))
  45.     (setq ptlst (cons pt ptlst))
  46.   )
  47.   (foreach pt1 ptlst
  48.     (foreach pt2 (vl-remove pt1 ptlst)
  49.       (foreach pt3 (vl-remove pt2 (vl-remove pt1 ptlst))
  50.         (setq 3df (entmakex (list '(0 . "3DFACE") (cons 10 pt1) (cons 11 pt1) (cons 12 pt2) (cons 13 pt3))))
  51.         (ssadd 3df ss3df)
  52.       )
  53.     )
  54.   )
  55.   (repeat (setq m (sslength ss3df))
  56.     (setq 3df1 (ssname ss3df (setq m (1- m))))
  57.     (setq 3df1p1 (cdr (assoc 10 (setq 3df1dxf (entget 3df1)))))
  58.     (setq 3df1p2 (cdr (assoc 11 3df1dxf)))
  59.     (setq 3df1p3 (cdr (assoc 12 3df1dxf)))
  60.     (setq 3df1p4 (cdr (assoc 13 3df1dxf)))
  61.     (setq nor (v^v (setq x (mapcar '- 3df1p3 3df1p1)) (mapcar '- 3df1p4 3df1p1)))
  62.     (setq lst (mapcar '(lambda ( x ) (transptucs x 3df1p1 (mapcar '+ 3df1p1 x) (mapcar '+ 3df1p1 nor))) ptlst))
  63.     (setq lst (vl-sort lst '(lambda ( a b ) (> (cadr a) (cadr b)))))
  64.     (if (and (> (cadr (car lst)) 1e-8) (< (cadr (last lst)) -1e-8)) (entdel 3df1))
  65.   )
  66.   (princ)
  67. )
  68.  
  69. (defun c:pts-3df nil (c:ptscloud-3dfaces))
  70.  
  71. (prompt "\nShortcut for c:ptscloud-3dfaces is c:pts-3df \n[Start with : Command: pts-3df]")
  72.  

M.R. 8-) 8-) 8-)
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: RND POINT CLOUD - WRAP IT WITH OUTER 3DFACES
« Reply #2 on: March 27, 2013, 12:06:27 PM »
Just slight improvement - analyzing and generating at the same time in first pass after gathering point list data... Wondering why no one haven't suggested this earlier... But I am stuck now as I don't know how to improve it further more, specially when there are more points in point cloud - my performance is little less than 10 min. for 50 RND points...

Code - Auto/Visual Lisp: [Select]
  1. ; transptucs & transptwcs by M.R. (Marko Ribar, d.i.a.)
  2. ; arguments :
  3. ; pt - point to be transformed from WCS to imaginary UCS with "transptucs" and from imaginary UCS to WCS with "transptwcs"
  4. ; pt1 - origin of imaginary UCS
  5. ; pt2 - point to define X axis of imaginary UCS (vector pt1-pt2 represents X axis)
  6. ; pt3 - point to define Y axis of imaginary UCS (vector pt1-pt3 represents Y axis)
  7. ; important note : angle between X and Y axises of imaginary UCS must always be 90 degree for correct transformation calculation
  8.  
  9. (defun unit ( v )
  10.   (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
  11. )
  12.  
  13. (defun mxv ( m v )
  14.   (mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
  15. )
  16.  
  17. (defun v^v ( u v )
  18.   (list
  19.     (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  20.     (- (* (car  v) (caddr u)) (* (car  u) (caddr v)))
  21.     (- (* (car  u) (cadr  v)) (* (car  v) (cadr  u)))
  22.   )
  23. )
  24.  
  25. (defun transptucs ( pt p1 p2 p3 / ux uy uz )
  26.   (setq uz (unit (v^v (mapcar '- p2 p1) (mapcar '- p3 p1))))
  27.   (setq ux (unit (mapcar '- p2 p1)))
  28.   (setq uy (unit (mapcar '- p3 p1)))
  29.  
  30.   (mxv (list ux uy uz) (mapcar '- pt p1))
  31. )
  32.  
  33. (defun transptwcs ( pt pt1 pt2 pt3 / pt1n pt2n pt3n )
  34.   (setq pt1n (transptucs '(0.0 0.0 0.0) pt1 pt2 pt3))
  35.   (setq pt2n (transptucs '(1.0 0.0 0.0) pt1 pt2 pt3))
  36.   (setq pt3n (transptucs '(0.0 1.0 0.0) pt1 pt2 pt3))
  37.   (transptucs pt pt1n pt2n pt3n)
  38. )
  39.  
  40. (defun c:ptscloud-3dfaces ( / ss n pt ptlst nor x lst )
  41.   (setq ss (ssget "_:L" '((0 . "POINT"))))
  42.   (repeat (setq n (sslength ss))
  43.     (setq pt (cdr (assoc 10 (entget (ssname ss (setq n (1- n)))))))
  44.     (setq ptlst (cons pt ptlst))
  45.   )
  46.   (foreach pt1 ptlst
  47.     (foreach pt2 (vl-remove pt1 ptlst)
  48.       (foreach pt3 (vl-remove pt2 (vl-remove pt1 ptlst))
  49.         (setq nor (v^v (setq x (mapcar '- pt3 pt1)) (mapcar '- pt2 pt1)))
  50.         (setq lst (mapcar '(lambda ( a ) (transptucs a pt1 (mapcar '+ pt1 x) (mapcar '+ pt1 nor))) ptlst))
  51.         (setq lst (vl-sort lst '(lambda ( a b ) (> (cadr a) (cadr b)))))
  52.         (if (not (and (> (cadr (car lst)) 1e-8) (< (cadr (last lst)) -1e-8)))
  53.           (entmake (list '(0 . "3DFACE") (cons 10 pt1) (cons 11 pt1) (cons 12 pt2) (cons 13 pt3)))
  54.         )
  55.       )
  56.     )
  57.   )
  58.   (princ)
  59. )
  60.  
  61. (defun c:pts-3df nil (c:ptscloud-3dfaces))
  62.  
  63. (prompt "\nShortcut for c:ptscloud-3dfaces is c:pts-3df \n[Start with : Command: pts-3df]")
  64.  

Kind regards, M.R.
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: RND POINT CLOUD - WRAP IT WITH OUTER 3DFACES
« Reply #3 on: March 27, 2013, 05:14:07 PM »
Here, this is my best I can do with my knowledge... I think this can't be improved much more... Haven't test it with 50 points, but it is surely faster...

Code - Auto/Visual Lisp: [Select]
  1. ; transptucs & transptwcs by M.R. (Marko Ribar, d.i.a.)
  2. ; arguments :
  3. ; pt - point to be transformed from WCS to imaginary UCS with "transptucs" and from imaginary UCS to WCS with "transptwcs"
  4. ; pt1 - origin of imaginary UCS
  5. ; pt2 - point to define X axis of imaginary UCS (vector pt1-pt2 represents X axis)
  6. ; pt3 - point to define Y axis of imaginary UCS (vector pt1-pt3 represents Y axis)
  7. ; important note : angle between X and Y axises of imaginary UCS must always be 90 degree for correct transformation calculation
  8.  
  9. (defun unit ( v )
  10.   (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
  11. )
  12.  
  13. (defun mxv ( m v )
  14.   (mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
  15. )
  16.  
  17. (defun v^v ( u v )
  18.   (list
  19.     (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  20.     (- (* (car  v) (caddr u)) (* (car  u) (caddr v)))
  21.     (- (* (car  u) (cadr  v)) (* (car  v) (cadr  u)))
  22.   )
  23. )
  24.  
  25. (defun transptucs ( pt p1 p2 p3 / ux uy uz )
  26.   (setq uz (unit (v^v (mapcar '- p2 p1) (mapcar '- p3 p1))))
  27.   (setq ux (unit (mapcar '- p2 p1)))
  28.   (setq uy (unit (mapcar '- p3 p1)))
  29.  
  30.   (mxv (list ux uy uz) (mapcar '- pt p1))
  31. )
  32.  
  33. (defun transptwcs ( pt pt1 pt2 pt3 / pt1n pt2n pt3n )
  34.   (setq pt1n (transptucs '(0.0 0.0 0.0) pt1 pt2 pt3))
  35.   (setq pt2n (transptucs '(1.0 0.0 0.0) pt1 pt2 pt3))
  36.   (setq pt3n (transptucs '(0.0 1.0 0.0) pt1 pt2 pt3))
  37.   (transptucs pt pt1n pt2n pt3n)
  38. )
  39.  
  40. (defun c:ptscloud-3dfaces ( / ss n pt ptlst nor x checkpts )
  41.  
  42.   (defun checkpts ( ptlst pt1 x nor / y )
  43.     (if (and (setq oneside (if (< (length signs) 2) T (if (eq (car signs) (cadr signs)) T nil))) ptlst)
  44.       (cond ((> (setq y (cadr (transptucs (car ptlst) pt1 (mapcar '+ pt1 x) (mapcar '+ pt1 nor)))) 1e-8)
  45.              (setq signs (cons T signs))
  46.              (checkpts (cdr ptlst) pt1 x nor)
  47.             )
  48.             ((< y -1e-8)
  49.              (setq signs (cons nil signs))
  50.              (checkpts (cdr ptlst) pt1 x nor)
  51.             )
  52.       )
  53.       oneside
  54.     )
  55.   )
  56.  
  57.   (setq ss (ssget "_:L" '((0 . "POINT"))))
  58.   (repeat (setq n (sslength ss))
  59.     (setq pt (cdr (assoc 10 (entget (ssname ss (setq n (1- n)))))))
  60.     (setq ptlst (cons pt ptlst))
  61.   )
  62.   (foreach pt1 ptlst
  63.     (foreach pt2 (vl-remove pt1 ptlst)
  64.       (foreach pt3 (vl-remove pt2 (vl-remove pt1 ptlst))
  65.         (setq nor (v^v (setq x (mapcar '- pt3 pt1)) (mapcar '- pt2 pt1)))
  66.         (if (checkpts (vl-remove pt1 (vl-remove pt2 (vl-remove pt3 ptlst))) pt1 x nor)
  67.           (entmake (list '(0 . "3DFACE") (cons 10 pt1) (cons 11 pt1) (cons 12 pt2) (cons 13 pt3)))
  68.         )
  69.         (setq signs nil oneside nil)
  70.       )
  71.     )
  72.   )
  73.   (princ)
  74. )
  75.  
  76. (defun c:pts-3df nil (c:ptscloud-3dfaces))
  77.  
  78. (prompt "\nShortcut for c:ptscloud-3dfaces is c:pts-3df \n[Start with : Command: pts-3df]")
  79.  

M.R. 8-)

[EDIT: Just checked with 50 pts - it did at about 2 min. - so 5x faster...]
 8-) 8-) 8-)
« Last Edit: March 27, 2013, 05:20:09 PM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

trogg

  • Bull Frog
  • Posts: 255
Re: RND POINT CLOUD - WRAP IT WITH OUTER 3DFACES
« Reply #4 on: March 28, 2013, 09:24:53 AM »
good stuff marko.

i tested it on a leaning rectangular cube (56 points) more like a stick of butter
The last version (4th post) returned the error below.
And the second to last version (3rd post) created the shape correctly (last picture)

Thanks for sharing
~Greg

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: RND POINT CLOUD - WRAP IT WITH OUTER 3DFACES
« Reply #5 on: March 28, 2013, 10:35:58 AM »
Just to mention... Result of performing routine is 3dfaces cloud that is made of duplicate 3dfaces... As overkill can't remove these duplicates, you have to apply this code :

Code - Auto/Visual Lisp: [Select]
  1. (defun unique ( lst )
  2.   (if lst (cons (car lst) (unique (_vl-remove (car lst) (_vl-remove (list (caar lst) (caddar lst) (cadar lst)) (_vl-remove (list (cadar lst) (caar lst) (caddar lst)) (_vl-remove (list (cadar lst) (caddar lst) (caar lst)) (_vl-remove (list (caddar lst) (caar lst) (cadar lst)) (_vl-remove (list (caddar lst) (cadar lst) (caar lst)) (cdr lst) 1e-6) 1e-6) 1e-6) 1e-6) 1e-6) 1e-6))))
  3. )
  4.  
  5. (defun _vl-remove ( el lst fuzz )
  6.   (vl-remove-if '(lambda ( x ) (and (equal (car x) (car el) fuzz) (equal (cadr x) (cadr el) fuzz) (equal (caddr x) (caddr el) fuzz))) lst)
  7. )
  8.  
  9. (defun c:erasedup3df ( / ss n 3df p1 p2 p3 p4 lay 3dfpts 3dflst )
  10.   (prompt "\nSelect all duplicate 3dfaces")
  11.   (setq ss (ssget '((0 . "3DFACE"))))
  12.   (repeat (setq n (sslength ss))
  13.     (setq 3df (ssname ss (setq n (1- n))))
  14.     (setq p1 (cdr (assoc 10 (entget 3df)))
  15.           p2 (cdr (assoc 11 (entget 3df)))
  16.           p3 (cdr (assoc 12 (entget 3df)))
  17.           p4 (cdr (assoc 13 (entget 3df)))
  18.           lay (cdr (assoc 8 (entget 3df)))
  19.     )
  20.     (cond ((equal p1 p2 1e-8) (setq 3dfpts (list p1 p3 p4)))
  21.           ((equal p2 p3 1e-8) (setq 3dfpts (list p1 p2 p4)))
  22.           ((equal p3 p4 1e-8) (setq 3dfpts (list p1 p2 p3)))
  23.           ((equal p1 p4 1e-8) (setq 3dfpts (list p2 p3 p4)))
  24.     )
  25.     (setq 3dflst (cons 3dfpts 3dflst))
  26.     (entdel 3df)
  27.   )
  28.   (foreach 3dfpts (unique 3dflst)
  29.     (entmake (list '(0 . "3DFACE") (cons 8 lay) (cons 10 (car 3dfpts)) (cons 11 (car 3dfpts)) (cons 12 (cadr 3dfpts)) (cons 13 (caddr 3dfpts))))
  30.   )
  31.   (princ)
  32. )
  33.  

P.S. You should get :
- 4 pts - 4-hedron (witch is correct as tetrahedron)
- 10 pts - 16-hedron
- 12 pts - 20-hedron (witch is correct as icosahedron)
- 20 pts - 36-hedron
- 30 pts - 56-hedron
- 40 pts - 76-hedron
- 50 pts - 96-hedron
- 100 pts - 196-hedron

Can you utilize this by writing formula ?

[Answer :]
- n pts - (n/2-1)*4-herdron
[/Answer]

M.R.
« Last Edit: August 20, 2013, 11:04:43 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: RND POINT CLOUD - WRAP IT WITH OUTER 3DFACES
« Reply #6 on: March 28, 2013, 11:43:27 AM »
good stuff marko.

i tested it on a leaning rectangular cube (56 points) more like a stick of butter
The last version (4th post) returned the error below.
And the second to last version (3rd post) created the shape correctly (last picture)

Thanks for sharing
~Greg

Greg, test it with this version - it's based on improved fastest version (4th post)... The difference is that it now counts on points with imaginary elevation 0.0... It should work and with your case, if not, then I don't quite know why...

Code - Auto/Visual Lisp: [Select]
  1. ; transptucs & transptwcs by M.R. (Marko Ribar, d.i.a.)
  2. ; arguments :
  3. ; pt - point to be transformed from WCS to imaginary UCS with "transptucs" and from imaginary UCS to WCS with "transptwcs"
  4. ; pt1 - origin of imaginary UCS
  5. ; pt2 - point to define X axis of imaginary UCS (vector pt1-pt2 represents X axis)
  6. ; pt3 - point to define Y axis of imaginary UCS (vector pt1-pt3 represents Y axis)
  7. ; important note : angle between X and Y axises of imaginary UCS must always be 90 degree for correct transformation calculation
  8.  
  9. (defun unit ( v )
  10.   (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
  11. )
  12.  
  13. (defun mxv ( m v )
  14.   (mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
  15. )
  16.  
  17. (defun v^v ( u v )
  18.   (list
  19.     (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  20.     (- (* (car  v) (caddr u)) (* (car  u) (caddr v)))
  21.     (- (* (car  u) (cadr  v)) (* (car  v) (cadr  u)))
  22.   )
  23. )
  24.  
  25. (defun transptucs ( pt p1 p2 p3 / ux uy uz )
  26.   (setq uz (unit (v^v (mapcar '- p2 p1) (mapcar '- p3 p1))))
  27.   (setq ux (unit (mapcar '- p2 p1)))
  28.   (setq uy (unit (mapcar '- p3 p1)))
  29.  
  30.   (mxv (list ux uy uz) (mapcar '- pt p1))
  31. )
  32.  
  33. (defun transptwcs ( pt pt1 pt2 pt3 / pt1n pt2n pt3n )
  34.   (setq pt1n (transptucs '(0.0 0.0 0.0) pt1 pt2 pt3))
  35.   (setq pt2n (transptucs '(1.0 0.0 0.0) pt1 pt2 pt3))
  36.   (setq pt3n (transptucs '(0.0 1.0 0.0) pt1 pt2 pt3))
  37.   (transptucs pt pt1n pt2n pt3n)
  38. )
  39.  
  40. (defun c:ptscloud-3dfaces ( / ss n pt ptlst nor x checkpts )
  41.  
  42.   (defun checkpts ( ptlst pt1 x nor / y )
  43.     (if (and (setq oneside (if (< (length signs) 2) T (if (eq (car signs) (cadr signs)) T nil))) ptlst)
  44.       (cond ((> (setq y (cadr (transptucs (car ptlst) pt1 (mapcar '+ pt1 x) (mapcar '+ pt1 nor)))) 1e-8)
  45.              (setq signs (cons T signs))
  46.              (checkpts (cdr ptlst) pt1 x nor)
  47.             )
  48.             ((< y -1e-8)
  49.              (setq signs (cons nil signs))
  50.              (checkpts (cdr ptlst) pt1 x nor)
  51.             )
  52.             ((equal y 0.0 1e-10)
  53.              (if signs (setq signs (cons (car signs) signs)))
  54.              (checkpts (cdr ptlst) pt1 x nor)
  55.             )
  56.       )
  57.       oneside
  58.     )
  59.   )
  60.  
  61.   (setq ss (ssget "_:L" '((0 . "POINT"))))
  62.   (repeat (setq n (sslength ss))
  63.     (setq pt (cdr (assoc 10 (entget (ssname ss (setq n (1- n)))))))
  64.     (setq ptlst (cons pt ptlst))
  65.   )
  66.   (foreach pt1 ptlst
  67.     (foreach pt2 (vl-remove pt1 ptlst)
  68.       (foreach pt3 (vl-remove pt2 (vl-remove pt1 ptlst))
  69.         (setq nor (v^v (setq x (mapcar '- pt3 pt1)) (mapcar '- pt2 pt1)))
  70.         (if (not (equal nor '(0.0 0.0 0.0) 1e-8))
  71.           (if (checkpts (vl-remove pt1 (vl-remove pt2 (vl-remove pt3 ptlst))) pt1 x nor)
  72.             (entmake (list '(0 . "3DFACE") (cons 10 pt1) (cons 11 pt1) (cons 12 pt2) (cons 13 pt3)))
  73.           )
  74.         )
  75.         (setq signs nil oneside nil)
  76.       )
  77.     )
  78.   )
  79.   (princ)
  80. )
  81.  
  82. (defun c:pts-3df nil (c:ptscloud-3dfaces))
  83.  
  84. (prompt "\nShortcut for c:ptscloud-3dfaces is c:pts-3df \n[Start with : Command: pts-3df]")
  85.  

M.R.
« Last Edit: March 28, 2013, 04:55:49 PM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: RND POINT CLOUD - WRAP IT WITH OUTER 3DFACES
« Reply #7 on: August 09, 2013, 03:34:46 PM »
Based on discovery in other topic - see here :
http://www.theswamp.org/index.php?topic=45085.msg503001#new

I've improved my code (foreach) loops, but I gained no speed improvement in performance, maybe just small step forward (or even backward)...

Code - Auto/Visual Lisp: [Select]
  1. ; transptucs & transptwcs by M.R. (Marko Ribar, d.i.a.)
  2. ; arguments :
  3. ; pt - point to be transformed from WCS to imaginary UCS with "transptucs" and from imaginary UCS to WCS with "transptwcs"
  4. ; pt1 - origin of imaginary UCS
  5. ; pt2 - point to define X axis of imaginary UCS (vector pt1-pt2 represents X axis)
  6. ; pt3 - point to define Y axis of imaginary UCS (vector pt1-pt3 represents Y axis)
  7. ; important note : angle between X and Y axises of imaginary UCS must always be 90 degree for correct transformation calculation
  8.  
  9. (defun unit ( v )
  10.   (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
  11. )
  12.  
  13. (defun mxv ( m v )
  14.   (mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
  15. )
  16.  
  17. (defun v^v ( u v )
  18.   (list
  19.     (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  20.     (- (* (car  v) (caddr u)) (* (car  u) (caddr v)))
  21.     (- (* (car  u) (cadr  v)) (* (car  v) (cadr  u)))
  22.   )
  23. )
  24.  
  25. (defun transptucs ( pt p1 p2 p3 / ux uy uz )
  26.   (setq uz (unit (v^v (mapcar '- p2 p1) (mapcar '- p3 p1))))
  27.   (setq ux (unit (mapcar '- p2 p1)))
  28.   (setq uy (unit (mapcar '- p3 p1)))
  29.  
  30.   (mxv (list ux uy uz) (mapcar '- pt p1))
  31. )
  32.  
  33. (defun transptwcs ( pt pt1 pt2 pt3 / pt1n pt2n pt3n )
  34.   (setq pt1n (transptucs '(0.0 0.0 0.0) pt1 pt2 pt3))
  35.   (setq pt2n (transptucs '(1.0 0.0 0.0) pt1 pt2 pt3))
  36.   (setq pt3n (transptucs '(0.0 1.0 0.0) pt1 pt2 pt3))
  37.   (transptucs pt pt1n pt2n pt3n)
  38. )
  39.  
  40. (defun _reml (l1 l2 / a n ls)
  41.   (while
  42.     (setq n nil
  43.           a (car l2)
  44.     )
  45.     (while (and l1 (null n))
  46.       (if (equal a (car l1) 1e-8)
  47.         (setq l1 (cdr l1)
  48.               n t
  49.         )
  50.         (setq ls (append ls (list (car l1)))
  51.               l1 (cdr l1)
  52.         )
  53.       )
  54.     )
  55.     (setq l2 (cdr l2))
  56.   )
  57.   (append ls l1)
  58. )
  59.  
  60. (defun c:ptscloud-3dfaces ( / pt1l pt2l ss n pt ptlst nor x checkpts )
  61.  
  62.   (defun checkpts ( ptlst pt1 x nor / y )
  63.     (if (and (setq oneside (if (< (length signs) 2) T (if (eq (car signs) (cadr signs)) T nil))) ptlst)
  64.       (cond ((> (setq y (cadr (transptucs (car ptlst) pt1 (mapcar '+ pt1 x) (mapcar '+ pt1 nor)))) 1e-8)
  65.              (setq signs (cons T signs))
  66.              (checkpts (cdr ptlst) pt1 x nor)
  67.             )
  68.             ((< y -1e-8)
  69.              (setq signs (cons nil signs))
  70.              (checkpts (cdr ptlst) pt1 x nor)
  71.             )
  72.             ((equal y 0.0 1e-10)
  73.              (if signs (setq signs (cons (car signs) signs)))
  74.              (checkpts (cdr ptlst) pt1 x nor)
  75.             )
  76.       )
  77.       oneside
  78.     )
  79.   )
  80.  
  81.   (setq ss (ssget "_:L" '((0 . "POINT"))))
  82.   (repeat (setq n (sslength ss))
  83.     (setq pt (cdr (assoc 10 (entget (ssname ss (setq n (1- n)))))))
  84.     (setq ptlst (cons pt ptlst))
  85.   )
  86.   (foreach pt1 ptlst
  87.     (setq pt1l (cons pt1 pt1l))
  88.     (foreach pt2 (_reml ptlst pt1l)
  89.       (setq pt2l (cons pt2 pt2l))
  90.       (foreach pt3 (_reml (_reml ptlst pt1l) pt2l)
  91.         (setq nor (v^v (setq x (mapcar '- pt3 pt1)) (mapcar '- pt2 pt1)))
  92.         (if (not (equal nor '(0.0 0.0 0.0) 1e-8))
  93.           (if (checkpts (vl-remove pt1 (vl-remove pt2 (vl-remove pt3 ptlst))) pt1 x nor)
  94.             (entmake (list '(0 . "3DFACE") (cons 10 pt1) (cons 11 pt1) (cons 12 pt2) (cons 13 pt3)))
  95.           )
  96.         )
  97.         (setq signs nil oneside nil)
  98.       )
  99.     )
  100.   )
  101.   (princ)
  102. )
  103.  
  104. (defun c:pts-3df nil (c:ptscloud-3dfaces))
  105.  
  106. (prompt "\nShortcut for c:ptscloud-3dfaces is c:pts-3df \n[Start with : Command: pts-3df]")
  107.  

M.R.
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ymg

  • Guest
Re: RND POINT CLOUD - WRAP IT WITH OUTER 3DFACES
« Reply #8 on: August 10, 2013, 08:23:16 PM »
Marko,

Look into Qhull algorythm.

Seems to me this is what you want to achieve.


ymg

ymg

  • Guest
Re: RND POINT CLOUD - WRAP IT WITH OUTER 3DFACES
« Reply #9 on: August 10, 2013, 08:39:16 PM »
Marko,

Here is a link The Quickhull Algorithm for Convex Hulls , Barber's paper.

ymg
« Last Edit: August 10, 2013, 10:17:32 PM by ymg »