向量叉乘意义&&NYOJ68三点顺序
程序员文章站
2022-03-30 08:55:16
...
三点顺序
时间限制: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; }
上一篇: Android ApiDemos示例解析(168):Views->Lists->1. Array
下一篇: java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.con
推荐阅读