This documentation is automatically generated by online-judge-tools/verification-helper
#include "src/geometry/Z2/intersect/is-intersect-point-circle.hpp"
bool is_intersect_pc(Z2::Point<Z> p, Z2::Circle<Z> c)
p
と c
が交差しているかどうか (p
が c
上の点かどうか) を返す。
円の半径の2乗、円の中心と点との距離の2乗がともにオーバーフローしない。
#pragma once
#include "src/geometry/Z2/class/circle.hpp"
#include "src/geometry/Z2/class/point.hpp"
#include "src/geometry/Z2/operation/square-norm.hpp"
namespace luz::Z2 {
template < typename Z >
bool is_intersect_pc(Point< Z > p, Circle< Z > c) {
Z sq_norm = square_norm(c.center() - p);
return sq_norm == square(c.r());
}
} // namespace luz::Z2
#line 2 "src/geometry/Z2/intersect/is-intersect-point-circle.hpp"
#line 2 "src/geometry/Z2/class/circle.hpp"
#line 2 "src/geometry/Z2/class/point.hpp"
#line 2 "src/geometry/Z2/class/vector.hpp"
#include <vector>
namespace luz::Z2 {
template < typename Z >
class Vector {
Z x_, y_;
public:
Vector(): x_(0), y_(0) {}
Vector(Z x, Z y): x_(x), y_(y) {}
Z x() const {
return x_;
}
Z y() const {
return y_;
}
bool operator==(const Vector &v) const {
return x_ == v.x_ and y_ == v.y_;
}
bool operator!=(const Vector &v) const {
return x_ != v.x_ or y_ != v.y_;
}
Vector &operator+=(const Vector &v) {
x_ += v.x_;
y_ += v.y_;
return *this;
}
Vector &operator-=(const Vector &v) {
x_ -= v.x_;
y_ -= v.y_;
return *this;
}
Vector operator+(const Vector &v) const {
return Vector(*this) += v;
}
Vector operator-(const Vector &v) const {
return Vector(*this) -= v;
}
Vector operator+() const {
return *this;
}
Vector operator-() const {
return Vector() - *this;
}
};
template < typename Z >
using Vectors = std::vector< Vector< Z > >;
} // namespace luz::Z2
#line 4 "src/geometry/Z2/class/point.hpp"
#line 6 "src/geometry/Z2/class/point.hpp"
namespace luz::Z2 {
template < typename Z >
using Point = Vector< Z >;
template < typename Z >
using Points = std::vector< Point< Z > >;
} // namespace luz::Z2
#line 4 "src/geometry/Z2/class/circle.hpp"
#include <cassert>
namespace luz::Z2 {
template < typename Z >
class Circle {
Point< Z > o_;
Z r_;
public:
Circle(): o_(0, 0), r_(0) {}
Circle(Point< Z > o, Z r): o_(o), r_(r) {
assert(r >= 0);
}
Point< Z > center() const {
return o_;
}
Z r() const {
return r_;
}
};
template < typename Z >
using Circles = std::vector< Circle< Z > >;
} // namespace luz::Z2
#line 2 "src/geometry/Z2/operation/square-norm.hpp"
#line 2 "src/geometry/Z2/operation/square.hpp"
namespace luz::Z2 {
template < typename Z >
Z square(const Z x) {
return x * x;
}
} // namespace luz::Z2
#line 5 "src/geometry/Z2/operation/square-norm.hpp"
namespace luz::Z2 {
template < typename Z >
Z square_norm(Vector< Z > v) {
return square(v.x()) + square(v.y());
}
} // namespace luz::Z2
#line 6 "src/geometry/Z2/intersect/is-intersect-point-circle.hpp"
namespace luz::Z2 {
template < typename Z >
bool is_intersect_pc(Point< Z > p, Circle< Z > c) {
Z sq_norm = square_norm(c.center() - p);
return sq_norm == square(c.r());
}
} // namespace luz::Z2