精确渐开线。
我正在绘制一个齿轮,现在我需要连接点来绘制一个齿轮齿的渐开线:http://i46.tinypic.com/1o6fls.png
点已编号。我试着用样条曲线画图,但我不知道把样条曲线的最后一点放在哪里来画一个精确的渐开线-例如-如果我像这样画,然后按enter键-我会得到这个样条曲线:
http://i46.tinypic.com/546ttv.png
但如果我将光标移到不同的方向,然后按enter键,我仍然会得到几乎相同的样条曲线,但仍然不相同:
http://i48.tinypic.com/2le1c3m.png
那么,如何绘制精确的渐开线呢?也许我应该再画一个点,然后停止绘制样条曲线? 如果你从公式中得到了点,那么是的,你可以在顶部计算更多的点来提高精度。
关于样条曲线:如果移动一个点,曲线将获得不同的形状。离变化点越远,变化越小。理论上,整个曲线都会发生变化,但使用足够多的点,变化量可以足够小。
我的建议是:在顶部使用一个附加点来结束曲线,再使用一个点(当然,使用相同的公式计算)作为切线方向。 谢谢
嗯,我在按书做渐开线-它是公式和图形方法的混合,所以我只计算了更多的点,得到了样条曲线。可悲的是,我的齿轮出了问题。。不适合。
另一个小问题-如何绘制样条曲线上某个点的切线?就像这样:
http://i47.tinypic.com/33lo5xc.png
我在这里读到,你可以用偏移来实现这一点,但这还不够准确,因为从一个图中,我需要计算一些未知量。睡懒觉实际上也不管用。 可以使用切线捕捉。使用“开始直线”命令创建一个圆(任意大小)。选择屏幕上的任意位置,按住键盘上的shift键,然后用鼠标右键单击。你应该得到一个浮动菜单,上面有捕捉选项。选择切线捕捉并拾取圆上的某个位置。这条线现在应该与圆相切。如果在按住shift键并单击鼠标右键时未显示浮动菜单,请在命令行中键入osnap,并勾选“切线捕捉”框,使其始终处于启用状态。也可以绘制一条与两个圆相切的线。在图形中存在两个圆的情况下,启动line命令,并(假设具有永久的切线捕捉)单击第一个圆。什么也不会发生,因为这是一个延迟的快照,正在等待第二个点。单击第二个圆和与两个圆均相切的线。
我知道如何在圆中做,但问题是-我需要在样条曲线上做。我有这样的图:
http://i45.tinypic.com/1zgu5q0.png
其点与样条线连接。现在我需要让每个点都相切:
http://i50.tinypic.com/104i5nt.png
捕捉结果如下(我选择了右移切线,然后按下一个点):
http://i49.tinypic.com/dd0nm.png
所以,也许我没有正确使用快照,或者有人知道怎么做? 潜伏,
这将绘制样条曲线(我希望是齿轮的正确轮廓)
(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]