已知曲线上三点,如何求中间一点的法向量。

如下图,已知 A、B、C 三个点,求 B 点的 法向量,即(fCosSita, fSinSita),Sita 为 法线按逆时针方向和水平方向的夹角。

先计算线段AB的单位垂线段2,再计算线段BC 的单位垂线段1,最后对 1 和 2 求和,得到3,即为 B 点的法线。

代码如下:

void CalcNormVec(POINT& ptA, POINT& ptB, POINT& ptC, float* pfCosSita, float* pfSinSita)
{
	//先用B点坐标减A点坐标。
	float fVec1_x = ptB.x - ptA.x;
	float fVec1_y = ptB.y - ptA.y;

	//单位化。
	float fMod = sqrt(fVec1_x * fVec1_x + fVec1_y * fVec1_y);
	fVec1_x /= fMod;
	fVec1_y /= fMod;

	//计算垂线。
	float fPerpendicularVec1_x = -fVec1_y;
	float fPerpendicularVec1_y = fVec1_x;

	//再用C点坐标减B点坐标。
	float fVec2_x = ptC.x - ptB.x;
	float fVec2_y = ptC.y - ptB.y;

	//单位化。
	fMod = sqrt(fVec2_x * fVec2_x + fVec2_y * fVec2_y);
	fVec2_x /= fMod;
	fVec2_y /= fMod;

	//计算垂线。
	float fPerpendicularVec2_x = -fVec2_y;
	float fPerpendicularVec2_y = fVec2_x;

	//求和。
	float fSumX = fPerpendicularVec1_x + fPerpendicularVec2_x;
	float fSumY = fPerpendicularVec1_y + fPerpendicularVec2_y;

	//单位化。
	fMod = sqrt(fSumX * fSumX + fSumY * fSumY);

	float fCosSita = fSumX / fMod;
	float fSinSita = fSumY / fMod;

	if (pfCosSita)
		*pfCosSita = fCosSita;

	if (pfSinSita)
		*pfSinSita = fSinSita;
	
	return;
}


 

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值