叉积判断 POJ1696

Posted blues

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了叉积判断 POJ1696相关的知识,希望对你有一定的参考价值。

 1 // 叉积判断 POJ1696
 2 
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <vector>
 8 #include <cmath>
 9 #include <map>
10 using namespace std;
11 #define LL long long
12 typedef pair<int,int> pii;
13 const double inf = 123456789012345.0;
14 const int MOD = 998244353;
15 const int N = 2e5+10;
16 const int maxx = 200010; 
17 #define clc(a,b) memset(a,b,sizeof(a))
18 const double eps = 1e-8;
19 void fre() {freopen("in.txt","r",stdin);}
20 void freout() {freopen("out.txt","w",stdout);}
21 inline int read() {int x=0,f=1;char ch=getchar();while(ch>9||ch<0) {if(ch==-) f=-1; ch=getchar();}while(ch>=0&&ch<=9) {x=x*10+ch-0;ch=getchar();}return x*f;}
22 
23 int sgn(double x){
24     if(fabs(x) < eps)return 0;
25     if(x < 0)return -1;
26     else return 1;
27 }
28 
29 struct Point{
30     double x,y;
31     int index;
32     Point(){}
33     Point(double _x,double _y){
34         x = _x;y = _y;
35     }
36     Point operator -(const Point &b)const{
37         return Point(x - b.x,y - b.y);
38     }
39     double operator ^(const Point &b)const{
40         return x*b.y - y*b.x;
41     }
42     double operator *(const Point &b)const{
43         return x*b.x + y*b.y;
44     }
45 };
46 
47 double dist(Point a,Point b){
48     return sqrt((a-b)*(a-b));
49 }
50 
51 int pos;
52 Point p[110];
53 bool cmp(Point a,Point b){
54     double tmp=(a-p[pos])^(b-p[pos]);
55     if(sgn(tmp)==0){
56         return dist(a,p[pos])<dist(b,p[pos]);
57     }
58     else if(sgn(tmp)<0) return false;
59     else return true;
60 }
61 
62 int main(){
63     int T,n;
64     scanf("%d",&T);
65     while(T--){
66         scanf("%d",&n);
67         for(int i=0;i<n;i++){
68             scanf("%d%lf%lf",&p[i].index,&p[i].x,&p[i].y);
69             if(p[i].y<p[0].y||(p[i].y==p[0].y&&p[i].x<p[0].x)){
70                 swap(p[i],p[0]);
71             }
72         }
73         pos=0;
74         for(int i=0;i<n;i++){
75             sort(p+i,p+n,cmp);
76             pos++;
77         }
78         printf("%d",n);
79         for(int i=0;i<n;i++)
80             printf(" %d",p[i].index);
81         printf("\n");
82     }
83     return 0;
84 }

 

以上是关于叉积判断 POJ1696的主要内容,如果未能解决你的问题,请参考以下文章

poj 1696 Space Ant(模拟+叉积)

poj1696

POJ 2318--TOYS(二分找点,叉积判断方向)

二分+叉积判断方向 poj 2318

POJ 2398--Toy Storage(叉积判断,二分找点,点排序)

计算几何专题