MSasu 发表于 2022-7-5 17:30:58

从f建立一条平均线

我有一系列类似于直线的点-这些点来自第三方应用程序,由于其精度低,它们不在一条线上,即使它们应该在一条线上-请参阅下图。我现在正试图设计一个算法,从这些点重建一条直线。
 
 
我将感谢对此事的任何建议/解决方案。
非常感谢您的关注

Organic 发表于 2022-7-5 17:37:16

线性回归可能可以做到这一点,尽管它可能不容易编程。

Lee Mac 发表于 2022-7-5 17:38:56

 
同意,研究最小二乘法。

MSasu 发表于 2022-7-5 17:41:38

谢谢你们的建议,先生们。我将研究这些定理背后的数学,看看是否能够在AutoLISP中实现它们。

Lee Mac 发表于 2022-7-5 17:46:48

因为你只有一个因变量和一个自变量,你可以使用简单的线性回归。。。
 
测试代码:
 
(defun c:test ( / i l s )
   (if (setq s (ssget '((0 . "POINT") (-4 . "*,*,=") (10 0.0 0.0 0.0))))
       (progn
         (repeat (setq i (sslength s))
               (setq l (cons (cdr (assoc 10 (entget (ssname s (setq i (1- i)))))) l))
         )
         (_lineartrendline l)
       )
   )
   (princ)
)

MSasu 发表于 2022-7-5 17:49:30

李,我不得不说,那真的很了不起!非常感谢您的支持!
 
 
 
 
这是一种定义lambda函数的有趣方法;这是我第一次看到它。

Lee Mac 发表于 2022-7-5 17:51:55

 
非常感谢米尔恰!
 
 
我很高兴你喜欢它,我有时会使用这个结构来实现额外的简洁;但是,请注意,严格来说,它不是lambda函数,而是defun-q表达式的文字等价物,例如:
 
_$ (defun-q f ( x ) (* x x))
F
_$ f
((X) (* X X))
_$ (setq g '(( x ) (* x x)))
((X) (* X X))
_$ (equal f g)
T

motee-z 发表于 2022-7-5 17:54:20

李可以在弧上或圆上

Stefan BMR 发表于 2022-7-5 17:58:10

礼炮Mircea
 
线性回归确保一系列值(例如y)和近似线之间的差值之和最小。
如果数据符合某些标准,则效果良好。
例如,围绕垂直线设置点,然后使用简单的线性回归(如李的lisp。顺便说一句,李,你的代码太棒了)。

 
这是我的lisp,使用了另一个(令人惊讶的)域中的公式。
 
(defun C:TEST ( / vxv ss i n l o d dx dy a)

(defun vxv (a b) (apply '+ (mapcar '* a b)))

(if
   (setq ss (ssget '((0 . "POINT"))))
   (progn
   (repeat (setq i (sslength ss) n i)
       (setq l (cons (cdr (assoc 10 (entget (ssname ss (setq i (1- i)))))) l))
       )
   (setq o(mapcar '/ (apply 'mapcar (cons '+ l)) (list n n))
         d(mapcar '(lambda (a) (mapcar '- o a)) l)
         dx (mapcar 'car d)
         dy (mapcar 'cadr d)
         a(* 0.5 (atan (* 2 (vxv dx dy)) (- (vxv dx dx) (vxv dy dy))))
         )
   (entmake
       (list
         '(0 . "XLINE")
         '(100 . "AcDbEntity")
         '(100 . "AcDbXline")
         '(62 . 1)
         (cons 10 o)
         (list 11 (cos a) (sin a) 0.0)
         )
       )
   )
   )
(princ)
)

MSasu 发表于 2022-7-5 18:01:36

Multumesc mult Stefan pentru solutie!非常感谢Stefan提出的解决方案。
 
虽然这两个例程的结果在一组分散的点上略有不同,但对于我必须处理的数据,它们都给出了极好的结果。
再次感谢各位的宝贵支持。
页: [1] 2
查看完整版本: 从f建立一条平均线