AcDbPolyline延伸与直线求交,取延伸方向最近点

基础知识:AcDbPolyline中每个点的Bulge,负数为顺时钟,正数为逆时钟

//extendStart		是否延伸前端
//sPt,ePt;			与直线的两个交点
AcGePoint3d getExtendClosePt(bool extendStart,const AcDbPolyline* pl,const AcGePoint3d& sPt,const AcGePoint3d& ePt)
{
	double dBulge;					//延伸段的Bulge
	AcGePoint3d pt;					//多义线上的点
	if (extendStart)
	{
		pl->getBulgeAt(0,dBulge);
		pl->getStartPoint(pt);
		dBulge = -dBulge;			//起点延伸时,方向与原方向的Bulge相反
	}
	else
	{
		pl->getBulgeAt(pl->numVerts()-2,dBulge);//多义线的Bulge保存在前一点
		pl->getEndPoint(pt);
	}
	AcGeVector3d sVec = sPt - pt;
	AcGeVector3d eVec = ePt - pt;
	AcGeVector3d vec = sVec.crossProduct(eVec);

	AcGePoint3d closePt;
	if(sign(dBulge) == sign(vec.z))
	{
		closePt = sPt;
	}
	else
	{
		closePt = ePt;
	}

	return closePt;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值