Magic Bullet ~3次元幾何ライブラリを借りて~

Quiz

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2641&lang=jp

AC code

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=4239654#1

code抜粋

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);

    // input
    ll N,Q;
    cin>>N>>Q;

    // obstacles
    vector<Point3D> P(N);
    VI R(N);
    VI Magic(N);
    rep(i,N){
      cin>>P[i].x>>P[i].y>>P[i].z;
      cin>>R[i]>>Magic[i];
    }

    // queries
    while(Q--){
      Point3D a,b;
      cin>>a.x>>a.y>>a.z;
      cin>>b.x>>b.y>>b.z;

      // 線分と点の距離
      Segment3D seg(a,b);
      ll sum=0;
      rep(i,N){
        Point3D p = P[i];
        double distance = getDistanceSP(seg, p);
        if(distance<R[i]){
          sum += Magic[i];
        }else if(equals(distance, (double)R[i])){
          sum += Magic[i];
        }
      }
      p(sum);
    }

    return 0;
}

サンプル2

  • desmos.comでグラフを書いてみると接していて、その場合も魔力を消費するようだ
  • その場合のイコール判定は誤差に弱い。差がepsより小さい時はイコールと判定しよう

f:id:peroon:20200306231614p:plain

desmos用

// circle
\left(x-a\right)^{2}+\left(y-b\right)^{2}<r^{2}

// line
y-y_{1}=m\left(x-x_{1}\right)

その他