hubeiwdlue 发表于 2024-6-23 12:36:03

旋转点表函数

本帖最后由 hubeiwdlue 于 2024-6-23 12:46 编辑

xiaocainiao网友提出的按方向点排序的问题,黄大师提出可以旋转点表,然后按照x排序。
http://bbs.mjtd.com/forum.php?mo ... hlight=%C5%C5%D0%F2
我试着写一个简单的点表旋转函数,水平很差,大家不要笑话。
期待大神写出效率更高,更精简的函数。
;;旋转点表函数,(ptlst-rot ptlst pt ang),ptlst为点表,pt为旋转基点,ang为角度,单位是弧度
(defun ptlst-rot(ptlst pt ang / ang1 ang2 dis p2 plst v)
(foreach p ptlst
    (setq dis (distance pt p)
      ang1 (angle pt p)
      ang2 (+ ang1 ang)
      v (polar '(0 0 0) ang2 dis)
    )
    (setq p2 (mapcar '+ pt v)
      plst (cons p2 plst)
    )
)
(reverse plst)
)
;;测试
(defun c:tt()
(setq en (car(entsel)))
(setq plst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10))(entget en))))
(setq pt (car plst))
(setq plst2 (ptlst-rot plst pt (* (/ -50 180.0) pi)))
(command ".PLINE")
(foreach p plst2
    (command "non" p)
)
(command)
(princ)
)


tryhi 发表于 2024-6-23 19:15:01

本帖最后由 tryhi 于 2024-6-23 19:17 编辑


建议化整为零,不要上来直接整表,拆解为两步更简单

;;pt点围绕p0点旋转ang弧度
(defun try-pt-rotate (pt p0 ang)(polar p0 (+ (angle p0 pt) ang) (distance pt p0)))
;;点表围绕p0点旋转ang弧度
(defun try-pts-rotate(lst p0 ang)(mapcar '(lambda(x)(try-pt-rotate x p0 ang))lst))

hubeiwdlue 发表于 2024-6-23 19:28:02

tryhi 发表于 2024-6-23 19:15
建议化整为零,不要上来直接整表,拆解为两步更简单

谢谢大海老师的指导。这样逻辑确实更清晰一些。谢谢。

自贡黄明儒 发表于 2024-6-24 08:20:56

我喜欢找Matrix-Lib.LSP:loveliness:
;;-----------------------------------------------------------;;
;; 二维旋转变换矩阵                                              ;;
;; 参数:                                                      ;;
;; Cen - 基点                                                ;;
;; ang - 旋转角度                                          ;;
;;-----------------------------------------------------------;;
;;-----------------=={ Rotate by Matrix }==------------------;;
;;                                                         ;;
;; Rotation Matrix                                           ;;
;;-----------------------------------------------------------;;
;; Author: highflybird, Copyright ? 2012                     ;;
;;-----------------------------------------------------------;;
;; Arguments:                                                ;;
;; Cen    - Base Point for Rotation Transformation         ;;
;; ang    - Angle through which to rotate object             ;;
;;-----------------------------------------------------------;;
(defun MAT:Rotation ( Cen ang / c s x y)
(setq c (cos ang) s (sin ang))
(setq x (car Cen) y (cadr Cen))
(list
    (list c (- s) 0. (- x (- (* c x) (* s y))))
    (list s    c0. (- y (+ (* s x) (* c y))))
    '(0. 0. 1. 0.)
    '(0. 0. 0. 1.)
)
)

hubeiwdlue 发表于 2024-6-24 17:08:01

自贡黄明儒 发表于 2024-6-24 08:20
我喜欢找Matrix-Lib.LSP

谢谢黄大师。这个矩阵变换,已经忘得干干净净了,完全看不懂了。

hubeiwdlue 发表于 2024-9-5 10:47:06

自贡黄明儒 发表于 2024-6-24 08:20
我喜欢找Matrix-Lib.LSP

黄大师,这是旋转矩阵和平移矩阵并一起了吗?要怎么用呢?

自贡黄明儒 发表于 2024-9-5 10:51:03

hubeiwdlue 发表于 2024-9-5 10:47
黄大师,这是旋转矩阵和平移矩阵并一起了吗?要怎么用呢?

Matrix-Lib.LSP里面有示例的呀

hubeiwdlue 发表于 2024-9-5 10:59:33

自贡黄明儒 发表于 2024-9-5 10:51
Matrix-Lib.LSP里面有示例的呀

Matrix-Lib.LSP分享一个
页: [1]
查看完整版本: 旋转点表函数