三维空间确定一个圆弧的一种方法

   

如何在三维空间表示或描述一个圆弧,我们已知的方法有以下几种:

  • 已知圆心(x0,y0,z0),圆弧上起点(x1,y1,z1),圆弧终点(x2,y2,z2),弧方向(xt,yt,zt)
  • 已知圆心(x0,y0,z0),圆弧上起点(x1,y1,z1),弧方向(xt,yt,zt),弧度 θ

无论哪种方法,都觉得需要好多参数,并且提供的这些信息有重复部分,并非完全独立。

这里提出一种求圆弧的方法,个人觉得是在比较少输入信息情况下可以表示一段圆弧了:

  • 已知圆弧上起点P1(x1,y1,z1),圆弧终点P2(x2,y2,z2),弧起始方向F(xt,yt,zt)

上图是示意图,在三维空间中的一段圆弧。

现在需要证明这些信息可以唯一确定一段圆弧,我们可以计算它圆心的位置。

1、如上图,首先根据P1P2,我们得到他们所在的向量F12。我们因为已经知道圆弧方向向量F,因此两个向量已经可以确定圆弧所在平面了。

2、叉乘F和F12,我们可以得到垂直于该平面的向量F2。

3、同样,再叉乘F2和F12,我们可以得到垂直于这两个向量所在平面的向量Fr1。

4、圆心在线段P1-P2的中垂线上,我们知道了P1和P2可以得到其中点P3,又知道了垂直于P1-P2的直线方向Fr1(且该直线在圆弧平面内),因此可以得到过圆心的一条直线l1。

5、如下图,叉乘F和F2,我们可以得到垂直于F的向量Fr2,因为F2垂直于圆弧所在平面,所以Fr2必定是在圆弧平面内的。

6、根据P1点和方向Fr2,我们可以唯一确定出另一条过圆心的直线l2。

7、两直线交点为圆心坐标,由此可唯一确定出圆心O,也可以证明该圆弧是唯一的。

这种方法我们需要的数值有9个,即圆弧起点和终点坐标,及圆弧起始方向。

而实际上,圆弧方向我们不需要长度,因此还可以归一化掉一个数值,所以本质上我们只需要输入8个值就可以确定空间中的一段圆弧。

下面是部分代码示意:

Coordinates Arc::GetCenter()//计算圆心
{
	//计算垂直于平面的向量
	Coordinates Lab= LineAB();//获得向量起点重点方向向量ab
	Coordinates vertLine=CalculateCross(Lab, m_dir1);//求垂直于弧面的垂线
	Coordinates LineAO = CalculateCross(vertLine, m_dir1);//计算过A和圆心O的直线方向。

	Coordinates AveAB;//计算AB中点
	AveAB.x = 0.5*(GetPoint2().x + GetPoint1().x);
	AveAB.y = 0.5*(GetPoint2().y + GetPoint1().y);
	AveAB.z = 0.5*(GetPoint2().z + GetPoint1().z);
	Coordinates LineCO;//计算AB中点C与圆心连线所在直线的方向
	LineCO.x = 0.5*(GetPoint2().x - GetPoint1().x);
	LineCO.y = 0.5*(GetPoint2().y - GetPoint1().y);
	LineCO.z = 0.5*(GetPoint2().z - GetPoint1().z);

	//已知两条线的方向及各自过的点,可以直接用相交的方法求交点
	double ta = (LineCO.x*(GetPoint1().y - AveAB.y) - LineCO.y*(GetPoint1().x - AveAB.x)) / (LineCO.y*LineAO.x - LineCO.x*LineAO.y);
	double tc = (LineAO.x*ta + (GetPoint1().x - AveAB.x)) / LineCO.x;

	//定义圆心坐标
	m_center.x = LineAO.x*ta + GetPoint1().x;
	m_center.y = LineAO.y*ta + GetPoint1().y;
	m_center.z = LineAO.z*ta + GetPoint1().z;
	return m_center;
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值