三点顺序(计算几何入门)

Description

 

现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断A,B,C是顺时针给出的还是逆时针给出的?

如:

图1:顺时针给出

三点顺序(计算几何入门)_第1张图片

图2:逆时针给出

三点顺序(计算几何入门)_第2张图片

Input

每行是一组测试数据,有6个整数x1,y1,x2,y2,x3,y3分别表示A,B,C三个点的横纵坐标。(坐标值都在0到10000之间)
输入0 0 0 0 0 0表示输入结束
测试数据不超过10000组

Output

如果这三个点是顺时针给出的,请输出1,逆时针给出则输出0

Sample Input

0 0 1 1 1 3
0 1 1 0 0 0
0 0 0 0 0 0

Sample Output

0
1

题目给出三点坐标(x1,y1)(x2,y2),(x3,y3)

给出的是二维坐标系上的坐标,我们可以将其看成三维空间坐标系中xOy平面上的三角形

这样,坐标就是(x1,y1,0)(x2,y2,0),(x3,y3,0)

根据右手定则

三点顺序(计算几何入门)_第3张图片

如图  OPXOF得到的M向量是向上的   而OFXOP得到的叉乘结果    Z轴方向是向下的

我们可以得到向量AB 和向量AC   AB=(x2-x1,y2-y1,0)  AC=(x3-x1,y3-y1,0)

AB叉乘AC  若叉乘得到的向量Z轴坐标为负数  则坐标是顺时针   反之坐标是顺时针

叉乘:

|     i           j      k  |

|x2-x1   y2-y1   0  |

|x3-x1   y3-y1   0  |

得到的向量是

  ( (y2-y1)*0*i + (x3-x1)*0*j + (x2-x1)(y3-y1)*k - (x3-x1)(y2-y1)*k - (y3-y1)*0*i - (x2-x1)*0*j  )

Z轴坐标是  (x2-x1)(y3-y1) - (x3-x1)(y2-y1)

则(x2-x1)(y3-y1) - (x3-x1)(y2-y1) 大于0  是顺时针  反之逆时针

代码:

#include
int main()
{
	double x1,x2,x3,y1,y2,y3;
	while(scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3))
	{
		if(x1==0&&x2==0&&x3==0&&y1==0&&y2==0&&y3==0)
		{
			break;
		}
		double flag;
		flag=(x2-x1)*(y3-y1) - (y2-y1)*(x3-x1);
		if(flag>0)
		{
			printf("0\n");
		}
		else
		{
			printf("1\n");
		}
	}
}

 

你可能感兴趣的:(计算几何)