PKU 2954 Triangle

http://poj.org/problem?id=2954
正の面積をもつ三角形の3点の座標が渡されるので、三角形の内部(点や辺を含まない)にある格子点の数を求めろというような問題。

x座標、またはy座標ごとに格子点の数を数えて足していく。
場合分けが面倒くさい。漏れがありまくりで結構WAりました。

PI in[3];

main(){
  while(true){
    bool end=false;
    rep(i,3){
      cin>>in[i].F>>in[i].S;
      end|=in[i].F|in[i].S;
    }
    if(!end)break;
    sort(in,in+3);
    int ans=0;
    for(int i=in[0].F+1;i<in[2].F;++i){
      double y1,y2;
      if(i<in[1].F){
        y1=((double)i-in[0].F)*(in[1].S-in[0].S)/(in[1].F-in[0].F)+in[0].S;
        y2=((double)i-in[0].F)*(in[2].S-in[0].S)/(in[2].F-in[0].F)+in[0].S;
        if(y1<y2){
          y1=ceil(y1+EPS);
          y2=floor(y2-EPS);
          ans+=abs(y2-y1+1)+EPS;          
        }else{
          y1=floor(y1-EPS);
          y2=ceil(y2+EPS);
          ans+=abs(y1-y2+1)+EPS;          
        }
      }else if(i==in[1].F){
        y2=((double)i-in[0].F)*(in[2].S-in[0].S)/(in[2].F-in[0].F)+in[0].S;
        y1=in[1].S;
        if(y1<y2){
          y1=ceil(y1+EPS);
          y2=floor(y2-EPS);
          ans+=abs(y2-y1+1)+EPS;
        }else{
          y1=floor(y1-EPS);
          y2=ceil(y2+EPS);
          ans+=abs(y1-y2+1)+EPS;
        }        
      }else{
        y1=((double)i-in[2].F)*(in[1].S-in[2].S)/(in[1].F-in[2].F)+in[2].S;
        y2=((double)i-in[0].F)*(in[2].S-in[0].S)/(in[2].F-in[0].F)+in[0].S;
        if(y1<y2){
          y1=ceil(y1+EPS);
          y2=floor(y2-EPS);
          ans+=abs(y2-y1+1)+EPS;          
        }else{
          y1=floor(y1-EPS);
          y2=ceil(y2+EPS);
          ans+=abs(y1-y2+1)+EPS;          
        }                
      }

    }
    cout<<ans<<endl;
  }
}

追記:他の人の解答を見てみると、ピックの定理なるものを使って大分スマートに解けるみたいですね。