motee-z 发表于 2022-7-6 07:20:44

查找周围3个点的列表

你好,朋友们
有人能帮我找到围绕三角形内一个点的3d人脸头部列表吗
我想根据三维面头部(位于该三维面内的点)的坐标(x,y,z)找到该点的高程
该图形由三维面组成,所有面都形成三角形
谢谢

BlackBox 发表于 2022-7-6 07:28:57

听起来像是试图从DTM中提取给定面的质心高程。
 
实际上,您是在寻找质心高程还是另一个点?

motee-z 发表于 2022-7-6 07:34:22

实际上需要在3dface cosist的3point内任何点内的高程

irneb 发表于 2022-7-6 07:38:43

找到一个相关的3dFace将是一件耗时的事情。基本上只使用拾取点的XY值&3个角来确定该点是否在三维面内,如果不在三维面内,则继续到下一个三维面。检查IMO的最简单方法是查看拾取点周围的连续角点按顺时针/逆时针顺序排列。
 
接下来会更快(虽然有点复杂):使用两个角在一个方向上绘制delta-z,然后将delta-z朝向第三个点(尖端-使用垂直线,将半pi添加到角度和inters,然后获得交点)。然后计算出拾取点沿第一个方向有多远(同样是perp inters的想法)。然后从那一点到第二个方向有多远。从最后一个得到一个比率,将其乘以相关的delta-Z,然后加上第一个角点的Z值。

David Bethel 发表于 2022-7-6 07:39:18

如果3DFace可以转换为平面(不是共线点),并且该点是实际的点实体,则可以使用ssget“WP”((0.“点”))。
 
找到由3dface形成的平面的法线,然后将点(trans)到该OCS中,并提取Z轴值。
 
-大卫

motee-z 发表于 2022-7-6 07:46:44

一个拾取点将是(x,y),然后我将计算z值,使拾取点通过此公式属于偶数
z=-(AX+X+D)/C
其中三点坐标为(X0 Y0 Z0)(X1 Y1 Z1)(X2 Y2 Z2)
 
A=(Y1-Y0)(Z2-Z0)-(Z1-Z0)(Y2-Y0)
B=(X2-X0)(Z1-Z0)-(Z2-Z0)(X1-X0)
C=(X1-X0)(Y2-Y0)-(X2-X0)(Y1-Y0)
D=X0(Y2Z1-Y1Z2)+X1(Y0Z2-Y2Z0)+X2(Y1Z0-Y0Z1)
如果我得到th 3点的坐标,我可以在这个公式中使用它来得到z值

GP_ 发表于 2022-7-6 07:49:35

试试这个(你的公式):
 

(defun c:test ( / p1 p2 p3 p4 a b c)

   (setq p1 (getpoint "first point 3Dface")
         p2 (getpoint "second point 3Dface")
         p3 (getpoint "third point 3Dface")
         p4 (getpoint "point inside")
   )
   (setq a (-
               (* (- (cadr p1) (cadr p2)) (- (caddr p1) (caddr p3)))
               (* (- (caddr p1) (caddr p2)) (- (cadr p1) (cadr p3)))
   )       )
   (setq b (-
               (* (- (caddr p1) (caddr p2)) (- (car p1) (car p3)))
               (* (- (car p1) (car p2)) (- (caddr p1) (caddr p3)))
   )       )
   (setq c (-
               (* (- (car p1) (car p2)) (- (cadr p1) (cadr p3)))
               (* (- (cadr p1) (cadr p2)) (- (car p1) (car p3)))
   )       )
   (setq z (+
               (/
                   (-
                     (+
                           (* (- (car p4) (car p1)) a)
                           (* (- (cadr p4) (cadr p1)) b)
                     )
                   )
                   c
               )
               (caddr p1)
         )
   )

)
 
或者这个(我用):
 

(defun c:test (/ p1 p2 p3 p4 p5)
   (if (not (member "geomcal.arx" (arx))) (arxload "geomcal"))
   (setq p1 (getpoint "first point 3Dface")
         p2 (getpoint "second point 3Dface")
         p3 (getpoint "third point 3Dface")
         p4 (getpoint "point inside")
         p5 (list (car p4) (cadr p4) (+ (caddr p4) 1.0))
   )
   (setq z (caddr (cal "z=ilp(p4,p5,p1,p2,p3)")))
)

motee-z 发表于 2022-7-6 07:53:33

谢谢大家
问题是搜索不是拾取点的点,并自动拥有3个点的坐标列表

GP_ 发表于 2022-7-6 07:59:43

用可用坐标替换(setq p4(getpoint“\n Point inside”))。
 
我看到一个代码(由李)找到一个点里面,但找不到它,这是我用的。
 
 

(defun c:test ( / 3DF p1 p2 p3 p4 n z)
   (if (and
         (setq 3DF (ssget "_X" '((0 . "3DFACE"))))
         (setq p4 (getpoint "\nPoint inside"))
       )
       (progn
         (setq n (sslength 3DF))
         (while (and (not z) (> n 0))
               (setq e1 (entget (ssname 3DF (setq n (1- n)))))
               (setq z (p_inside))
         )
         (if z (alert (strcat "z = " (rtos z 2 2)))
               (alert "Point outside")
         )            
       )
       (alert "3Dface not found in dwg")
   )
)


(defun p_inside (/ ang_p1p ang_p1_2 ang_p1_3 ang_p2p ang_p2_1 ang_p2_3
                  ang_p3p ang_p3_1 ang_p3_2 ang_p1- ang_p1+ ang_p2- ang_p2+
                  ang_p3- ang_p3+ COMPR)

   (setq p1 (cdr (assoc 10 e1)))
   (setq p2 (cdr (assoc 11 e1)))
   (setq p3 (cdr (assoc 12 e1)))
   (setq ang_p1p (angle p1 p4))
   (setq ang_p1_2 (angle p1 p2))
   (setq ang_p1_3 (angle p1 p3))
   (setq ang_p2p (angle p2 p4))
   (setq ang_p2_1 (angle p2 p1))
   (setq ang_p2_3 (angle p2 p3))
   (setq ang_p3p (angle p3 p4))
   (setq ang_p3_1 (angle p3 p1))
   (setq ang_p3_2 (angle p3 p2))

   (setq ang_p1- (min ang_p1_2 ang_p1_3))
   (setq ang_p1+ (max ang_p1_2 ang_p1_3))
   (setq ang_p2- (min ang_p2_1 ang_p2_3))
   (setq ang_p2+ (max ang_p2_1 ang_p2_3))
   (setq ang_p3- (min ang_p3_1 ang_p3_2))
   (setq ang_p3+ (max ang_p3_1 ang_p3_2))   
   (setq COMPR 0)
   (if (and
         (< ang_p1- (/ pi 2))
         (> (- ang_p1+ ang_p1-) pi)
       )
       (progn
         (if
               (or
                   (> ang_p1p ang_p1+)
                   (< ang_p1p ang_p1-)
               )
               (setq COMPR (1+ COMPR))
         )
       )
   )
   (if (and
         (< ang_p2- (/ pi 2))
         (> (- ang_p2+ ang_p2-) pi)
       )
       (progn
         (if
               (or
                   (> ang_p2p ang_p2+)
                   (< ang_p2p ang_p2-)
               )
               (setq COMPR (1+ COMPR))
         )
       )
   )      
   (if (and
         (< ang_p3- (/ pi 2))
         (> (- ang_p3+ ang_p3-) pi)
       )
       (progn
         (if
               (or
                   (> ang_p3p ang_p3+)
                   (< ang_p3p ang_p3-)
               )
               (setq COMPR (1+ COMPR))
         )      
       )
   )
   (if (and (> ang_p1p ang_p1-) (< ang_p1p ang_p1+)) (setq COMPR (1+ COMPR)))
   (if (and (> ang_p2p ang_p2-) (< ang_p2p ang_p2+)) (setq COMPR (1+ COMPR)))
   (if (and (> ang_p3p ang_p3-) (< ang_p3p ang_p3+)) (setq COMPR (1+ COMPR)))
   (if (= COMPR 3)
       (progn
         (setq p5 (list (car p4) (cadr p4) (+ (caddr p4) 1.0)))
         (setq z (caddr (cal "z=ilp(p4,p5,p1,p2,p3)")))
       )
   )
   z
)
(if (not (member "geomcal.arx" (arx))) (arxload "geomcal"))

Lee Mac 发表于 2022-7-6 08:05:03

 
http://www.cadtutor.net/forum/showthread.php?73731-点-内部或外部-多段线&p=502328&viewfull=1#post502328
页: [1] 2
查看完整版本: 查找周围3个点的列表