找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

[求助] 多段线偏移,弧曲率不变,弧长为offset下的长度

[复制链接]

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2013-10-26 16:24:34 | 显示全部楼层
Lispboy 发表于 2013-10-26 16:22
1楼的帖子,你说的条件约束不了红色的线,曲率不变,长度不变,线有N个,另外一个约束条件什么?

我传个示例

test.rar

22.84 KB, 下载次数: 1, 下载积分: D豆 -1 , 活跃度 1

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2013-10-26 16:27:35 | 显示全部楼层
Lispboy 发表于 2013-10-26 16:14
你的图画的不准,应该是上面图吧,长度没变

条件: 起点没变,长度没变,相当于白色的弧绕着起点 ...

还有一个条件就是弧长不变

点评

上面已经说了啊,条件现在有2个了, 曲率不变,长度不变, 还缺一个,你这个红线怎么最终定位? 只上面两个条件不够。  详情 回复 发表于 2013-10-26 16:37
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-26 16:30:05 | 显示全部楼层
圆心角变化了, 凸度也要变化

点评

正是,我混淆了一个概念,凸度是变化的,弧线曲率是不变的  发表于 2013-10-26 16:37
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-26 16:37:33 | 显示全部楼层
这样就对了
  1. (defun c:tt (/ e1 e2 pam1 bulge l1 l2 d arcL scl)
  2.   (if
  3.     (and (setq
  4.     e1 (xdrx_entsel "\n选择源Pline弧段: " '((0 . "lwpolyline")))
  5.   )
  6.   (setq
  7.     e2 (xdrx_entsel "\n点选目标Pline弧段: " '((0 . "lwpolyline")))
  8.   )
  9.     )
  10.      (progn
  11.        (setq pam1  (fix (apply 'xdrx_curve_getparamatpoint e1))
  12.       bugle (xdrx_polyline_getbulgeat e1 pam)
  13.       l1    (cadr (xdrx_getarea (car e1)))
  14.       l2    (cadr (xdrx_getarea (car e2)))
  15.       d    (- l2 l1)
  16.       arcL  (xdrx_curve_getdistatpoint
  17.        (car e2)
  18.        (xdrx_curve_getpointatparam (car e2) pam1)
  19.        (xdrx_curve_getendpoint (car e2))
  20.      )
  21.       scl   (1- (/ d arcL))
  22.        )
  23.        (xdrx_polyline_setpointat
  24.   (car e2)
  25.   (fix (xdrx_curve_getendparam (car e2)))
  26.   (xdrx_curve_getpointatdist (car e2) l1)
  27.        )
  28.        (xdrx_polyline_setbulgeat (car e2) pam (* scl bulge))
  29.      )
  30.   )
  31.   (princ)
  32. )

点评

这个结果也不是他要的,黄色线是你程序生成的。他要的是红线。 [attachimg]6116[/attachimg]  详情 回复 发表于 2013-10-26 16:41
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-10-26 16:37:37 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-10-26 16:27
还有一个条件就是弧长不变

上面已经说了啊,条件现在有2个了, 曲率不变,长度不变, 还缺一个,你这个红线怎么最终定位? 只上面两个条件不够。

点评

这个红线放在什么地方都可以  详情 回复 发表于 2013-10-26 16:39
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2013-10-26 16:39:45 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2013-10-26 16:41 编辑
Lispboy 发表于 2013-10-26 16:37
上面已经说了啊,条件现在有2个了, 曲率不变,长度不变, 还缺一个,你这个红线怎么最终定位? 只上面 ...


这个红线放在什么地方都可以,但最好起点与offset后的相同

点评

曲率是曲线的二阶导数,曲率、长度不变,凸度就不变 从弧段能得到 起点、凸度、终点,进而得到 圆心、半径、起始角、终止角,根据你的需要, 通过修改这几个参数后,返回去得到 起点、凸度、终点,进而修改多段  详情 回复 发表于 2013-10-26 17:52
放什么地方都可以?那随便算一个就行了。  详情 回复 发表于 2013-10-26 16:44
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-26 16:40:56 | 显示全部楼层
更简单方法
更简单方法,不过 Getsplitcurve 还是不稳定
  1. (defun c:tt (/ e1 e2 l pam)
  2.   (if
  3.     (and (setq
  4.            e1 (xdrx_entsel "\n选择源Pline弧段: " '((0 . "lwpolyline")))
  5.          )
  6.          (setq
  7.            e2 (xdrx_entsel "\n点选目标Pline弧段: " '((0 . "lwpolyline")))
  8.          )
  9.     )
  10.      (progn
  11.        (setq L         (cadr (xdrx_getarea (car e1)))
  12.              pam (xdrx_curve_getparamatdist (car e2) l)
  13.        )
  14.        (xdrx_curve_getsplitcurves (car e2) pam)
  15.      )
  16.   )
  17.   (princ)
  18. )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-10-26 16:41:57 | 显示全部楼层

这个结果也不是他要的,黄色线是你程序生成的。他要的是红线。

QQ截图20131026164111.png

点评

Offset 后按 原长度 取 Splitcurve  详情 回复 发表于 2013-10-26 16:43
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-26 16:43:17 | 显示全部楼层
Lispboy 发表于 2013-10-26 16:41
这个结果也不是他要的,黄色线是你程序生成的。他要的是红线。

Offset  后按 原长度 取  Splitcurve
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-10-26 16:44:38 | 显示全部楼层
本帖最后由 Lispboy 于 2013-10-26 16:47 编辑
/db_自贡黄明儒_ 发表于 2013-10-26 16:39
这个红线放在什么地方都可以,但最好起点与offset后的相同

放什么地方都可以?圆心随便往上抬一点,已知:圆心,弧长,凸度,随弧线的终点

点评

就是把 红线段剪掉  详情 回复 发表于 2013-10-26 16:48
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-26 16:48:09 | 显示全部楼层
本帖最后由 st788796 于 2013-10-26 16:50 编辑
Lispboy 发表于 2013-10-26 16:44
放什么地方都可以?圆心随便往上抬一点,已知:圆心,弧长,凸度,随弧线的终点

就是把 红线段剪掉, 还可以用 Break 于点, 然后判断删除哪根即可
ddd7.jpg
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-26 17:00:40 | 显示全部楼层
用 Break 命令
  1. (defun c:tt (/ e1 e2 p lastent)
  2.   (if (and (setq e1 (car (entsel "\nFirse Pline: ")))
  3.     (setq e2 (car (entsel "\nSecond Pline: ")))
  4.     (equal (distance (vlax-curve-getstartpoint e1)
  5.        (vlax-curve-getstartpoint e2)
  6.     )
  7.     (distance (vlax-curve-getendpoint e1)
  8.        (vlax-curve-getendpoint e2)
  9.     )
  10.     0.001
  11.     )
  12.       )
  13.     (progn
  14.       (setq
  15. p (vlax-curve-getpointatdist
  16.      e2
  17.      (vlax-curve-getdistatparam e1 (vlax-curve-getendparam e1))
  18.    )
  19.       )
  20.       (setq lastent (entlast))
  21.       (vl-cmdf ".break" (list e2 p) p "@")
  22.       (if (equal (entlast) e2)
  23. (entdel (entnext lastent))
  24. (entdel (entlast))
  25.       )
  26.     )
  27.   )
  28.   (princ)
  29. )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-26 17:05:51 | 显示全部楼层
上面的几个程序要保证是整根偏移的情况下,如果 Offset 的线长变了,程序应该只计算原 ARC 部分的长度,然后在要修剪的对应弧段用长度计算点,至于用 Break 还是 SplitCurves 都可以

点评

直接使用 xdrx_geom_arc2poly xdrx_geom_poly2arc 数学方法计算弧线信息,然后设置顶点即可。  详情 回复 发表于 2013-10-26 17:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-10-26 17:30:36 | 显示全部楼层
本帖最后由 Lispboy 于 2013-10-26 17:32 编辑

下面这段代码,帮你在每个弧段处,生成个圆弧,弧长,起点不变,绕起点旋转18度。
xdrx_poly1.gif

  1. (defun c:tt()
  2.    (if (and (setq e (car (xdrx_entsel "\n拾取多段线<退出>:" '((0 . "LWPOLYLINE")))))
  3.             (not (xdrx_polyline_isOnlyLines e)) ;;多段线是否有弧段
  4.        )
  5.      (progn
  6.         (setq num (xdrx_polyline_numverts e));;多段线顶点数
  7.         (setq i 0)
  8.          (repeat num
  9.            (setq tf (xdrx_polyline_segtype e i)) ;;顶点类型是否是kArc
  10.            (if (= "kArc" tf)
  11.               (progn
  12.                  (setq bulge (xdrx_polyline_getBulgeAt e i)  ;;  顶点I的凸度
  13.                        spt (xdrx_polyline_getPointAt e i)  ;;   起始点
  14.                        ept (xdrx_polyline_getPointAt e (+ i 1)) ;;   端点
  15.                        arcinfo (xdrx_geom_poly2arc spt bulge ept) ;;弧段信息 (逆顺时针 弧心 半径 弧起始角 弧终止角)
  16.                  )
  17.                  (apply 'xdrx_arc_make (cdr arcinfo)) ;;  创建圆弧
  18.                  (xdrx_setpropertyvalue (entlast) "color" 1)
  19.                  (setq mat (xdrx_matrix_setrotation (xdrx_matrix_identity 3) (/ pi 10) '(0 0 1) spt))  ;;   绕起点旋转18度变换矩阵
  20.                  (xdrx_entity_transform (entlast) mat)
  21.               )
  22.            )
  23.            (setq i (1+ i))
  24.         )
  25.      )
  26.    )
  27.    (princ)
  28. )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-10-26 17:35:33 | 显示全部楼层
st788796 发表于 2013-10-26 17:05
上面的几个程序要保证是整根偏移的情况下,如果 Offset 的线长变了,程序应该只计算原 ARC 部分的长度,然 ...

直接使用 xdrx_geom_arc2poly   xdrx_geom_poly2arc 数学方法计算弧线信息,然后设置顶点即可。

点评

完善了下,那样计算多麻烦,不过这个 Break 怎么自动删除了后段 ARC,API 函数还有误删情况  详情 回复 发表于 2013-10-26 17:43
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 09:13 , Processed in 0.205760 second(s), 58 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表