(poj step8.1.1.1)POJ 1106 Transmitters(判断一条边在另一条边的哪一个方向――计算叉积)

2014-11-24 02:27:45 · 作者: · 浏览: 1
/* 
 * POJ_1106.cpp 
 * 
 *  Created on: 2013年11月16日 
 *      Author: Administrator 
 */  
  
#include   
#include   
#include   
  
using namespace std;  
  
const double epsi = 1e-10;  
const double pi = acos(-1.0);  
const int maxn = 50005;  
  
struct Point{  
    double x,y;  
    Point(double _x = 0,double _y = 0):x(_x),y(_y){  
  
    }  
  
    Point operator-(const Point& op2)const{//**要注意这种写法  
        return Point(x - op2.x,y - op2.y);  
    }  
  
    double operator^(const Point& op2)const{  
        return x*op2.y - y*op2.x;  
    }  
};  
  
int sign(const double& x){//判断x是正数还是负数  
    if(x > epsi){  
        return 1;//传入的数是一个整数...  
    }else if(x < -epsi){  
        return -1;//传入的数是一个负数...  
    }  
  
    return 0;  
}  
  
double sqr(double x){//计算一个数的平方数  
    return x*x;  
}  
  
double mul(const Point& p0,const Point& p1,const Point& p2){//计算p0p1与p1p2的叉积叉积  
    return (p1-p0)^(p2-p0);  
}  
  
double dis2(const Point& p0,const Point& p1){//返回两个点的距离的平方  
    return sqr(p0.x - p1.x) + sqr(p0.y - p1.y);  
}  
  
double dis(const Point& p0,const Point& p1){//返回两个点的距离  
    return sqrt(dis2(p0,p1));  
}  
  
int n;  
Point p[maxn],cp;  
double r;  
  
int main(){  
    while(scanf("%lf%lf%lf",&cp.x,&cp.y,&r),r >
= 0){ scanf("%d",&n); int i; for(i = 0 ; i < n ; ++i){ scanf("%lf%lf",&p[i].x,&p[i].y); } int j; int ans = 0; for(i = 0 ; i < n ; ++i){ int temp = 0 ; for(j = 0 ; j < n ; ++j){ if(sign(dis(p[j],cp) - r) != 1){//如果在辐射范围内 if(sign(mul(cp,p[i],p[j])) != 1){//如果在辐射的一边,这里等于-1也是行的 temp++; } } } ans = max(ans,temp); } printf("%d\n",ans); } return 0; }