明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1878|回复: 7

meflying快进来

[复制链接]
发表于 2004-3-24 17:36:00 | 显示全部楼层 |阅读模式
还记得你写过的一个Getinterpoint求交点的函数吗,这个函数给我带来了很大的方便,真的可以任意求两个图元的交点,但我最近发现我的程序有个问题可能是由于该函数引起的,我在一个循环里使用这个函数,发现循环到一点程度后,由该函数得到的交点出现了问题,本应该是(27280.7 13500.0 0.0)附近的值 却突然变成了(-6.91219e-012,-3.45684e-012)之类很小的数,导致程序出错终止。


我不明白为什么会出现这种情况,而且只在某些情况下会这样。要说清楚还真不容易。


我的程序大概是这样的,一个变化的弧线,圆心在一条直线上移动,但该圆弧始终经过一个固定点,我以圆心的x坐标来控制这个变化的精度,圆心是向左移动的,该圆弧是和一条多义线相交的,有两个交点,其中一个就是那个固定点,每一个循环,圆心x坐标向左移动一个我设定的精度值,在每个循环里都要用getinterpoint函数来求另一个交点,当我把精度设在大概400以内,比如300,200(毫米)等时,就会出现上述错误,但精度在400以上时,却没有任何问题。


唉,今天终于发现,原来问题可能出现在这里,却又百思不得其解。
发表于 2004-3-24 20:12:00 | 显示全部楼层
其实不用说这么多,你把程序和测试图放上来就可以了。。。否则很难确定是怎么回事,因为这个函数我已经用了很久了,都没有出过问题。


另,把这个getinterpoin函数也要放上来,这个函数是我通过mccad的函数经过改装的,根据使用不同,有好几个版本的,所以不清楚你用的是哪个版本
 楼主| 发表于 2004-3-24 21:34:00 | 显示全部楼层
好,我把这部分有问题的整理出来 (defun c:test (/ ang_pd ang_a ang_b dist_pg bp_pjp bp_pdp bp_zp bp_yp ent_bp ent_hm
point_o point_ oa point_ob point_e point_ex point_ey ent_ol point_f point_fx point_fy
point_ff ent_ll r ent_yhm j n zjd yjd)
(vl-load-com)
(setvar "ucsicon" 0)
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(setq ang_pd 26.57)
(setq ang_a 25
ang_b 35
)
(setq ang_pd (/ (* ang_pd pi) 180)
ang_a (/ (* ang_a pi) 180)
ang_b (/ (* ang_b pi) 180)
)
(setq dist_pg 13500.0)
(setq bp_pjp (list 0 0))
(setq zjd bp_pjp)
(setq bp_pdp (polar bp_pjp ang_pd (/ dist_pg (sin ang_pd))))
(setq bp_zp (list (- (car bp_pjp) (* 2 dist_pg)) (cadr bp_pjp)))
(setq bp_yp (list (+ (car bp_pdp) (* 2 dist_pg)) (cadr bp_pdp)))
(command ".pline" bp_zp bp_pjp bp_pdp bp_yp "")
(setq ent_bp (entlast))
(command ".zoom" "a" "")
(setq point_oa (polar bp_pjp (+ ang_a ang_pd) (* 3 dist_pg))
point_ob (polar bp_pdp (- pi ang_b) (* 3 dist_pg))
)
(setq point_o (inters point_oa bp_pjp point_ob bp_pdp))
(setq point_ex (+ (car bp_pjp) (* 4.5 dist_pg)))
(setq point_ey (- (cadr bp_pjp) dist_pg))
(setq point_e (list point_ex point_ey))
(command ".line" point_o point_e "")
(setq ent_ol (entlast))
(setq point_fx (car bp_zp)
point_fy (+ (cadr bp_zp) (* 5 dist_pg))
)
(setq point_f (list point_fx point_fy))
(command ".line" bp_zp point_f "")
(setq ent_ll (entlast))
(command ".extend" point_f "" point_o point_e "")
(setq point_ff (setq point_ff (car (getinterpoint ent_ol ent_ll))))
(entdel ent_ll)
(setq r (distance point_o bp_pjp))
(command ".circle" point_o r)
(setq ent_yhm (entlast))
(setq zjd bp_pjp)
(setq yjd (cadr (getinterpoint ent_yhm ent_bp)))
(command ".arc" zjd "c" point_o yjd)
(setq ent_hm (entlast))
(entdel ent_yhm)
;;;以上是得到边坡线(pline线)和起始圆弧置
(setq point_m (list (car point_o) (+ (cadr point_o) (* 10 dist_pg))))
(setq point_n (list (car point_o) (- (cadr point_o) (* 10 dist_pg))))
(setq n 1)
(setq j (getint "\n请输入精度(毫米)"))
(while (and (> (- (car yjd) j) (car bp_pdp))
(> (- (car point_o) j) (car zjd))
)
(setq point_m (list (- (car point_m) j) (cadr point_m)))
(setq point_n (list (- (car point_n) j) (cadr point_n)))
(setq point_o (inters point_m point_n point_e point_ff))
(setq r (distance point_o bp_pjp))
(command ".circle" point_o r)
(setq ent_yhm (entlast))
(setq yjd (cadr (getinterpoint ent_yhm ent_bp)))
(command ".arc" bp_pjp "c" point_o yjd)
(setq ent_hm (entlast))
(entdel ent_yhm)
(setvar "osmode" 0)
(entdel ent_hm)
(setq n (+ n 1))
)
(princ yjd)
(setvar "ucsicon" 1)
(setvar "osmode" 4133)
(setvar "cmdecho" 1)
(princ)
) 其中,提示输入精度时,我输入350都没事,输300就出问题了。
 楼主| 发表于 2004-3-24 21:36:00 | 显示全部楼层
(defun GetInterPoint (ent1 ent2 / ax_ent_1 ax_ent_2 intpoints points i)
(setq ax_ent_1 (vlax-ename->vla-object ent1)
ax_ent_2 (vlax-ename->vla-object ent2)
)
(setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendnone))
(setq intpoints (vlax-variant-value intpoints))
(setq i 0)
(if (> (vlax-safearray-get-u-bound intpoints 1) 0)
(repeat (/ (+ 1
(- (vlax-safearray-get-u-bound intpoints 1)
(vlax-safearray-get-l-bound intpoints 1)
)
)
3
)
(setq points
(append
points
(list (list
(vlax-safearray-get-element intpoints i)
(vlax-safearray-get-element intpoints (+ i 1))
(vlax-safearray-get-element intpoints (+ i 2))
)
)
)
)
(setq i (+ 3 i))
)
)
points
)
发表于 2004-3-24 22:24:00 | 显示全部楼层
你为什么用(car (getinterpoin ...)),你确定第一个点就是你需要的点,而不会是第二个?这个函数返回的是所有交点的列表,但不一定按你需要的顺序排列的。


另,你的图发现一个问题,图中明明是两个交点,却返回3个,仔细看了你的图,返回的前两个点在PLINE某一顶点附近,而且距离很小,差不多到了CAD的数据处理精度,不知道是不是因为精度问题,导致计算错误,多算出了一个顶点,或者我们还是无法真真放大看到图形确切的图形,因为圆弧经过一折线时可能产生两个交点
发表于 2004-3-24 22:45:00 | 显示全部楼层
你们太有耐心了,我眼睛都看花了,先复制下来,漫漫看.
 楼主| 发表于 2004-3-25 10:00:00 | 显示全部楼层
因为我一直确信有且应该只有两个交点,而且我经过试验用(cadr (getinterpoint))就是我想要的yjd,如果你说会出现三个交点的情况,那我就不知道了。是不是在这个yjd离我设定的边界点bp_pdp距离到一点程度就会出错呢?那有没有办法避免呢?
 楼主| 发表于 2004-3-25 10:15:00 | 显示全部楼层
果然,出错是因为得到了三个点,居然会这样,这样解决我的问题应该很简单了,只要我取(getinterpoint)所返回列表中的最后一个值就应该可以了。


可为什么会出现这种情况呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-10-1 17:16 , Processed in 0.189828 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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