// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include #include "ROICircle.h" #include "JFJochException.h" ROICircle::ROICircle(const std::string &name, float in_x, float in_y, float in_r_pxl) : ROIElement(name), center_x(in_x), center_y(in_y), r_pxl(in_r_pxl), r_pxl_2(in_r_pxl * in_r_pxl) { // isfinite, not just > 0: NaN passes every <= test, inf passes > 0, and both then reach the // preview drawing, where a non-finite bound becomes an endless loop. if (!std::isfinite(r_pxl) || r_pxl <= 0.0) throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "ROICircle: radius must be a positive finite number"); if (!std::isfinite(center_x) || !std::isfinite(center_y)) throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "ROICircle: center must be finite"); } float ROICircle::GetX() const { return center_x; } float ROICircle::GetY() const { return center_y; } float ROICircle::GetRadius_pxl() const { return r_pxl; } ROIConfig ROICircle::ExportMetadata() const { return ROIConfig{ .type = ROIConfig::ROIType::Circle, .name = name, .circle = ROIConfigCircle{.r = r_pxl, .x = center_x, .y = center_y} }; } bool ROICircle::CheckROI(int64_t x, int64_t y, float resolution, float phi_deg) const { float x_fl = static_cast(x) - center_x; float y_fl = static_cast(y) - center_y; float dist_from_center_sq = x_fl * x_fl + y_fl * y_fl; return (dist_from_center_sq <= r_pxl_2); }