Lurking 发表于 2022-7-7 16:02:53

精确渐开线。

我正在绘制一个齿轮,现在我需要连接点来绘制一个齿轮齿的渐开线:
http://i46.tinypic.com/1o6fls.png
 
点已编号。我试着用样条曲线画图,但我不知道把样条曲线的最后一点放在哪里来画一个精确的渐开线-例如-如果我像这样画,然后按enter键-我会得到这个样条曲线:
 
http://i46.tinypic.com/546ttv.png
 
但如果我将光标移到不同的方向,然后按enter键,我仍然会得到几乎相同的样条曲线,但仍然不相同:
http://i48.tinypic.com/2le1c3m.png
 
那么,如何绘制精确的渐开线呢?也许我应该再画一个点,然后停止绘制样条曲线?

fuccaro 发表于 2022-7-7 16:19:06

如果你从公式中得到了点,那么是的,你可以在顶部计算更多的点来提高精度。
关于样条曲线:如果移动一个点,曲线将获得不同的形状。离变化点越远,变化越小。理论上,整个曲线都会发生变化,但使用足够多的点,变化量可以足够小。
我的建议是:在顶部使用一个附加点来结束曲线,再使用一个点(当然,使用相同的公式计算)作为切线方向。

Lurking 发表于 2022-7-7 16:37:19

谢谢
嗯,我在按书做渐开线-它是公式和图形方法的混合,所以我只计算了更多的点,得到了样条曲线。可悲的是,我的齿轮出了问题。。不适合。
另一个小问题-如何绘制样条曲线上某个点的切线?就像这样:
http://i47.tinypic.com/33lo5xc.png
 
我在这里读到,你可以用偏移来实现这一点,但这还不够准确,因为从一个图中,我需要计算一些未知量。睡懒觉实际上也不管用。

supercell 发表于 2022-7-7 16:42:38

可以使用切线捕捉。使用“开始直线”命令创建一个圆(任意大小)。选择屏幕上的任意位置,按住键盘上的shift键,然后用鼠标右键单击。你应该得到一个浮动菜单,上面有捕捉选项。选择切线捕捉并拾取圆上的某个位置。这条线现在应该与圆相切。如果在按住shift键并单击鼠标右键时未显示浮动菜单,请在命令行中键入osnap,并勾选“切线捕捉”框,使其始终处于启用状态。也可以绘制一条与两个圆相切的线。在图形中存在两个圆的情况下,启动line命令,并(假设具有永久的切线捕捉)单击第一个圆。什么也不会发生,因为这是一个延迟的快照,正在等待第二个点。单击第二个圆和与两个圆均相切的线。

Lurking 发表于 2022-7-7 16:59:23

我知道如何在圆中做,但问题是-我需要在样条曲线上做。我有这样的图:
http://i45.tinypic.com/1zgu5q0.png
 
其点与样条线连接。现在我需要让每个点都相切:
 
http://i50.tinypic.com/104i5nt.png
 
捕捉结果如下(我选择了右移切线,然后按下一个点):
http://i49.tinypic.com/dd0nm.png
 
所以,也许我没有正确使用快照,或者有人知道怎么做?

Stefan BMR 发表于 2022-7-7 17:06:26

潜伏,
这将绘制样条曲线(我希望是齿轮的正确轮廓)
(defun c:gear (/ e o r a i l)
(if
   (and
   (setq e (car (entsel)))
   (eq (cdr (assoc 0 (setq e (entget e)))) "CIRCLE")
   )
    (progn
      (setq o (cdr (assoc 10 e))
            r (cdr (assoc 40 e))
            a (/ pi 180)
            i -1)
      (repeat 360
      (setq l (cons (polar (polar o (* a (setq i (1+ i))) r) (- (* a i) (/ pi 2)) (* a i r)) l))
      )
      (entmake
          (append
            (list
            '(0 . "SPLINE")
            '(100 . "AcDbEntity")
            '(100 . "AcDbSpline")
            '(70 . 40)
            '(71 . 3)
            (cons 74 (length l))
            '(44 . 1.0e-010)
            )
            (mapcar '(lambda (x) (cons 11 x)) l)
          )
      )
      )
    )
(princ)
)这将绘制曲线的切线

(defun c:tgl (/ vs unit e p l d)
(vl-load-com)
(defun unit (l / d)
   (if (> (setq d (distance '(0 0 0) l)) 0.0)
   (mapcar '(lambda (x) (/ x d)) l)
   )
)

(defun vs (v s)
   (mapcar '(lambda (x) (* x s)) v)
)

(if
   (and
   (setq e (ssget "_:E:S" '((0 . "*POLYLINE,SPLINE,ARC,CIRCLE,ELLIPSE"))))
   (setq e (ssname e 0))
   (not (redraw e 3))
   (setq p (getpoint "\nSelect point on object: "))
   (equal p (setq p (vlax-curve-GetClosestPointTo e p)) 1e-10)
   (not (redraw e 4))
   )
   (progn
   (setq l (* 0.1 (vlax-curve-GetDistAtParam e (vlax-curve-GetEndParam e)))
         d (vs (unit (vlax-curve-GetFirstderiv e (vlax-curve-GetParamAtPoint e p))) l)
   )
   (entmake
       (list
         '(0 . "line")
         (cons 10 (mapcar '- p d))
         (cons 11 (mapcar '+ p d))
       )
   )
   )
)
(princ)
)
您可能需要调整这些功能以满足您的需要。
第一个是绘制一条完整的曲线,因为它穿过整个圆。显然,你不需要这样。
第二条将绘制一条长度等于所选曲线20%的线,但可以进行调整。
页: [1]
查看完整版本: 精确渐开线。