只需一步,快速开始
HuaiYu发表于2006-4-30 12:35:00 要求一点必在闭合的一多边形之内或之外: 首先判断此多边形是否为逆时针,若为顺时针则转化为逆时针运算(也可都转化为顺时针来运算),然后根...
注意不是多边形,而是任意曲线,如SPLINE线.
面积/射线等都不如这个简单,不容易出错.我相信这是速度最快的一种方法.
无痕老大发句话呀!!!
使用道具 举报
好,不错。不过你不也说你的可能会出问题吗?我那个方法就不会错的,无论是 spline 或者是别的都中可以的。这个算法我在程序中用过,至今还没有出过问题。这个可用来指定向外或向内偏移。你的那个法线再加上 ang 我的也是这样的,但是你不能判断那个点一定在外面还是在里面啊。所以还得加上时针的方向才行的。
对于PLINE线你的方法可能没问题,请教对于SPLINE,怎么判断顺时针和逆时针?
if you download this file,please change the Extent .txt to .vlx.
please test this file,if there is problem,please let me know
您需要 登录 才可以下载或查看,没有账号?注册
用射线法:如果交点为切点(可能还有“拐点”---不好表达〕要算两个交点,否则结果有错!
试试这个怎么样?
;;;;;判断一点是否在一个封闭的区域内,支持曲线(pline拟合、spline、圆、椭圆)
有用到的函数请到http://bbs.mjtd.com/forum.php?mod=viewthread&tid=49422下载
(defun inorout (ename pt / obj ptnear parm yspt1 yspt2 ang1 ang2) (setq obj (vlax-ename->vla-object ename) ptnear (vlax-curve-getClosestPointTo obj pt) ) (setq ang1 (angle ptnear pt) parm (vlax-curve-getParamAtPoint obj ptnear) yspt1 (vlax-curve-getFirstDeriv obj parm) yspt1 (list (+ (nth 0 ptnear) (nth 0 yspt1)) (+ (nth 1 ptnear) (nth 1 yspt1)) (nth 2 ptnear) ) ang2 (angle ptnear yspt1) ang1 (- ang1 ang2) ) (if (< ang1 0) (setq ang1 (+ (* 2 pi) ang1)) ) (if (PlineCCW_obj ename) (if (< ang1 pi) t nil ) (if (< ang1 pi) nil t ) ))
这个 函数有一个致命的出错之外,留给有心人去发现
ptnear 在凸角的时候捕捉到的是端点
当A,B,C三点成一线时,有可能出错
多谢各位,待俺好好研究研究再来聆听高见……
本版积分规则 发表回复 回帖后跳转到最后一页
小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 ) ©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途
GMT+8, 2025-6-9 14:18 , Processed in 0.187057 second(s), 19 queries , Gzip On.
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.