paulmcz 发表于 2022-7-6 09:12:02

测试多段线

我试图找出如何测试选定的多段线是否由交替的直线段和圆弧组成。它也必须以直线段开始和结束。到目前为止,我有一个所有“assoc 42”值的列表。该列表必须从0.0开始,每两个成员必须为非零,该列表中的最后两个成员也必须都为0.0。有什么想法或提示测试机制应该是什么吗?
 
谢谢

BlackBox 发表于 2022-7-6 09:16:48

这是另一个家庭作业问题吗?
 
 
提示:
您可以通过确定两个相邻顶点之间的中点是否落在普林线上来测试普林线段是否笔直。

Lee Mac 发表于 2022-7-6 09:19:20

您可以使用一个计数器变量(从零开始),并在每次计数器为偶数时测试凸出是否等于零。

paulmcz 发表于 2022-7-6 09:24:43

 
这似乎比那要复杂一点。如果所有凸出值均为零,则测试仍将通过,但不应通过。凸出值列表的模式应始终为-0,非零,0,非零,。。。。。。未知次数,必须以0,0结束。

Lee Mac 发表于 2022-7-6 09:25:29

 
然后在计数器均匀时测试零凸起,否则测试非零凸起。

paulmcz 发表于 2022-7-6 09:30:06

到目前为止,我已经写了这篇文章,其中“b”的值是测试值,但它并不适用于所有可能的多段线形状。更不用说它不是很漂亮了。
(defun c:test (/ x pl g xx d li a tot b)
(setq        x(car (entsel "\n Select polyline: "))
pl (entget x)
c(cdr (assoc 10 pl))
g(member (assoc 42 pl) pl)
)
;(command "circle" c 1.0)
(while g
   (setq xx (cdr (assoc 42 g))
d(cdr g)
g(member (assoc 42 d) d)
li (append li (list xx))
a (length li)
   )
)
(while li
   (if        (and (car li) (zerop (car li)) (cadr li))
   (setq tot        (+ (car li) (cadr li))
    a        (length li)
   )
   (setq tot 0)
   )
   (if        (= a 2)
   (setq b 0)
   (setq b (length li))
   )
   (if        (zerop tot)
   (setq li nil)
   (setq li (cddr li))
   )

)
(princ)
)

paulmcz 发表于 2022-7-6 09:33:37

 
是的,既然我在家里做这件事,那一定是家庭作业。不是一个学校项目,但仍然是一个家庭作业。
 
如何确定中点是否落在多段线上?

Lee Mac 发表于 2022-7-6 09:34:30

好的,像这样的东西怎么样,用LWPolyline实体名称填充它:
 
lisp中的一些命令式代码。。。请不要开枪!

BlackBox 发表于 2022-7-6 09:38:56

谢谢irneb。当谈到“vla对象”时,我只熟悉vlax曲线函数。我想是时候学习所有这些了。
 
您的代码适用于所有多段线,但附着图形底部的多段线除外。它有一个尖角,因此不符合资格。
 
我很欣赏对每一步的解释。
 
谢谢
测试多段线。图纸

paulmcz 发表于 2022-7-6 09:42:21

我相信Irne已经落入了你在第4篇文章Paul中提到的“陷阱”,偶数索引值和直线标志变量的异或测试在索引为奇数时仍然允许直线眨眼:
页: [1] 2
查看完整版本: 测试多段线