欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

向量叉乘意义&&NYOJ68三点顺序

程序员文章站 2022-03-30 08:55:16
...

三点顺序

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述

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

如:

图1:顺时针给出

图2:逆时针给出 

向量叉乘意义&&NYOJ68三点顺序

向量叉乘意义&&NYOJ68三点顺序

 

        <图1>                   <图2>

输入
每行是一组测试数据,有6个整数x1,y1,x2,y2,x3,y3分别表示A,B,C三个点的横纵坐标。(坐标值都在0到10000之间)
输入0 0 0 0 0 0表示输入结束
测试数据不超过10000组
输出
如果这三个点是顺时针给出的,请输出1,逆时针给出则输出0
样例输入
0 0 1 1 1 3
0 1 1 0 0 0
0 0 0 0 0 0
样例输出
0

1

就是用向量叉乘,向量叉乘本来呢就是算同时垂直两个向量的向量,计算公式是

c =  a×b = (a.y*b.z-b.y*a.z , b.x*a.z-a.x*b.z  , a.x*b.y-b.x*a.y)

几何意义呢就是计算面积,由这两个向量构成的平行四边形的面积。目前做了俩题用这个二维形式的叉乘,一个是关于三个点共线,另一个就是旋转角度的问题,第一个共线在我计算几何栏目第一篇里用了,然后,这个题,就是三角形旋转方向的。就利用了向量叉乘的第二点,二维向量叉乘结果大于0,就是由一个向量a正旋转到另一个向量b的角度小于180,小于零就是大于180.等于零就是共线嘛,就这样。发现正旋转忘解释了,正旋转不是说顺时针,或者是逆时针,正旋转是X轴旋转90度到Y轴的方向。

附代码:

#include <bits/stdc++.h>
using namespace std;
struct point {
	double x;
	double y;
};
int main()
{
#ifdef LOCAL
	freopen("D:/input.txt" , "r", stdin);
#endif
	int t;
	point a[4];
	while(1)
    {
    	for(int i=0;i<3;i++) 
    	cin>>a[i].x>>a[i].y;
    	int flag=0;
    	for(int i=0;i<3;i++)
    	if(a[i].x!=0||a[i].y!=0)
    	flag=1;
    	if(flag==0)
    	return 0;
    	point ab, ac;
    	ab.x=a[1].x-a[0].x;
    	ab.y=a[1].y-a[0].y;
    	ac.x=a[2].x-a[0].x;
    	ac.y=a[2].y-a[0].y;
    	if(ab.x*ac.y-ac.x*ab.y>0)
    	cout<<'0'<<endl;
    	else cout<<'1'<<endl;
    	
	}
    return 0;
}