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

三点顺序

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

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

如:

图1:顺时针给出

图2:逆时针给出 

 

        <图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;
}

阅读更多
版权声明:觉得写的可以,就留个言呗 https://blog.csdn.net/iamldy/article/details/79959200
个人分类: 计算几何 NYoj
上一篇51Nod 1212无向图最小生成树
下一篇51Nod 1005大数加法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭