有向线段的左右侧界定

判断一条有向线段在另一条有向线段的左侧还是右侧

    向量积的定义为:详见维基百科:http://zh.wikipedia.org/wiki/%E5%8F%89%E4%B9%98

“叉积可以定义为:

\vec{a} \times \vec{b} = \left |a  \right | \left |b  \right | \sin \theta \ \vec{n}

在这里θ表示\vec{a}\vec{b}之间的角度(0°≤θ≤180°),它位于这两个矢量所定义的平面上。而\vec{n}是一个与\vec{a}\vec{b}所构成的平面垂直的单位矢量。”

    假如两个向量是在坐标轴平面内,比如XY轴平面内,那么这两个向量积的方向即为Z轴,或者正向,或者负向。沿着向量的方向界定左侧和右侧,一个向量与其左侧向量的叉积和与其右侧向量的叉积是反向的。我们可以利用这一特点来判断一条有向线段在另一条有向线段的左侧还是右侧。在这之前我们需要明确观察平面,因为左右方向还跟观察的方向有关。以XY轴平面为例,

(1)XY轴平面的观察平面可以为:如下图所示,其向外是Z轴正向。记为dir=0;此时,向量积跟Z轴正向同向为左侧,反向为右侧。

 // O .--------------------->Y
 //     |
 //     |
 //     |
 //    \ /
 //    X

(2)XY轴平面的观察平面也可以为:如下图所示,其向里是Z轴正向。记为dir=1;此时,向量积跟Z轴正向同向为右侧,反向为左侧。

 // O .--------------------->X
 //     |
 //     |
 //     |
 //    \ /
 //    Y

其算法实现如下:

#define  LEFTSIDE_   0 //左侧
#define  RIGHTSIDE_  1 //右侧
#define  INLINE_     3 //共线或者平行
int WhichSide(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4,bool dir)//判断点3指向点4的向量在点1指向点2的向量的哪侧
{
	float ax=x2-x1;
	float ay=y2-y1;
	float bx=x4-x3;
	float by=y4-y3;
	//向量(ax,ay,0)叉乘向量(bx,by,0)得到的向量为(0,0,ab),由ab的正负和观察方向界定左右
	float ab=(ax*by-ay*bx);
	//
	int side=-1;
	if (ab==0)
	{
		side=INLINE_;//共线或者平行
	}
	else if(ab>0)
	{
		if (dir==0)
		{
			side=LEFTSIDE_;
		}
		else //dir=1
		{
			side=RIGHTSIDE_;
		}

	}
	else if(ab<0)
	{
		if (dir==0)
		{
			side=RIGHTSIDE_;
		}
		else //dir=1
		{
			side=LEFTSIDE_;
		}
	}
	return side;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值