| |
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #include <cmath> |
| | #include <catch2/catch_test_macros.hpp> |
| | #include <catch2/matchers/catch_matchers_floating_point.hpp> |
| |
|
| | #include "rs_ellipse.h" |
| | #include "rs_vector.h" |
| | #include "rs_math.h" |
| |
|
| | const double EPS = 1e-6; |
| |
|
| | TEST_CASE("RS_Ellipse::Constructor and Getters") { |
| | RS_Vector center(0.0, 0.0); |
| | RS_Vector majorP(5.0, 0.0); |
| | double ratio = 0.5; |
| | double angle1 = 0.0; |
| | double angle2 = 2 * M_PI; |
| | bool reversed = false; |
| |
|
| | RS_Ellipse ellipse(nullptr, {center, majorP, ratio, angle1, angle2, reversed}); |
| |
|
| | REQUIRE(ellipse.getCenter() == center); |
| | REQUIRE(ellipse.getMajorP() == majorP); |
| | REQUIRE(std::abs(ellipse.getRatio() - ratio) < EPS); |
| | REQUIRE(std::abs(ellipse.getAngle1() - angle1) < EPS); |
| | REQUIRE(std::abs(ellipse.getAngle2() - angle2) < EPS); |
| | REQUIRE(ellipse.isReversed() == reversed); |
| | REQUIRE(std::abs(ellipse.getMajorRadius() - 5.0) < EPS); |
| | REQUIRE(std::abs(ellipse.getMinorRadius() - 2.5) < EPS); |
| | REQUIRE(std::abs(ellipse.getAngle() - 0.0) < EPS); |
| | REQUIRE(std::abs(ellipse.getAngleLength() - 2 * M_PI) < EPS); |
| | } |
| |
|
| | TEST_CASE("RS_Ellipse::isValid") { |
| | RS_Vector center(0.0, 0.0); |
| | RS_Vector majorP(0.0, 0.0); |
| | double ratio = 0.5; |
| | double angle1 = 0.0; |
| | double angle2 = 2 * M_PI; |
| |
|
| | RS_Ellipse invalidEllipse(nullptr, {center, majorP, ratio, angle1, angle2, false}); |
| |
|
| | majorP = RS_Vector(5.0, 0.0); |
| | RS_Ellipse validEllipse(nullptr, {center, majorP, ratio, angle1, angle2, false}); |
| | } |
| |
|
| | TEST_CASE("RS_Ellipse::setReversed and isReversed") { |
| | RS_Ellipse ellipse(nullptr, {RS_Vector(0,0), RS_Vector(5,0), 0.5, 0, 2*M_PI, false}); |
| | REQUIRE(ellipse.isReversed() == false); |
| |
|
| | ellipse.setReversed(true); |
| | REQUIRE(ellipse.isReversed() == true); |
| | } |
| |
|
| | TEST_CASE("RS_Ellipse::isPointOnEntity") { |
| | RS_Ellipse ellipse(nullptr, {RS_Vector(0,0), RS_Vector(5,0), 0.5, 0, 2*M_PI, false}); |
| |
|
| | |
| | RS_Vector onPoint(5.0, 0.0); |
| | REQUIRE(ellipse.isPointOnEntity(onPoint, EPS) == true); |
| |
|
| | |
| | RS_Vector insidePoint(1.0, 0.0); |
| | REQUIRE(ellipse.isPointOnEntity(insidePoint, EPS) == false); |
| |
|
| | |
| | RS_Vector outsidePoint(6.0, 0.0); |
| | REQUIRE(ellipse.isPointOnEntity(outsidePoint, EPS) == false); |
| |
|
| | |
| | RS_Vector minorPoint(0.0, 2.5); |
| | REQUIRE(ellipse.isPointOnEntity(minorPoint, EPS) == true); |
| | } |
| |
|
| | TEST_CASE("RS_Ellipse::getNearestEndpoint") { |
| | RS_Ellipse ellipse(nullptr, {RS_Vector(0,0), RS_Vector(5,0), 0.5, 0, M_PI, false}); |
| |
|
| | RS_Vector queryPoint(10.0, 0.0); |
| | double dist; |
| | RS_Vector nearest = ellipse.getNearestEndpoint(queryPoint, &dist); |
| | REQUIRE(nearest == RS_Vector(5.0, 0.0)); |
| | REQUIRE(std::abs(dist - 5.0) < EPS); |
| |
|
| | queryPoint = RS_Vector(-10.0, 0.0); |
| | nearest = ellipse.getNearestEndpoint(queryPoint, &dist); |
| | REQUIRE(nearest.distanceTo(RS_Vector(-5.0, 0.0)) < EPS); |
| | REQUIRE(std::abs(dist - 5.0) < EPS); |
| | } |
| |
|
| | TEST_CASE("RS_Ellipse::getNearestPointOnEntity") { |
| | RS_Ellipse ellipse(nullptr, {RS_Vector(0,0), RS_Vector(5,0), 0.5, 0, 2*M_PI, false}); |
| |
|
| | RS_Vector queryPoint(6.0, 0.0); |
| | RS_Vector nearest = ellipse.getNearestPointOnEntity(queryPoint); |
| | REQUIRE(nearest == RS_Vector(5.0, 0.0)); |
| | REQUIRE(nearest.valid == true); |
| |
|
| | queryPoint = RS_Vector(0.0, 3.0); |
| | nearest = ellipse.getNearestPointOnEntity(queryPoint); |
| | REQUIRE(nearest == RS_Vector(0.0, 2.5)); |
| | REQUIRE(nearest.valid == true); |
| | } |
| |
|
| | TEST_CASE("RS_Ellipse::areaLineIntegral") { |
| | RS_Ellipse ellipse(nullptr, {RS_Vector(0,0), RS_Vector(5,0), 0.5, 0, 2*M_PI, false}); |
| | REQUIRE(std::abs(ellipse.areaLineIntegral() - (M_PI * 5.0 * 2.5)) < EPS); |
| |
|
| | RS_Ellipse halfEllipse(nullptr, {RS_Vector(0,0), RS_Vector(5,0), 0.5, 0, M_PI, false}); |
| | REQUIRE(std::abs(halfEllipse.areaLineIntegral() - (M_PI * 5.0 * 2.5 / 2)) < EPS); |
| | } |
| |
|
| | TEST_CASE("RS_Ellipse::switchMajorMinor") { |
| | RS_Ellipse ellipse(nullptr, {RS_Vector(0,0), RS_Vector(5,0), 0.5, 0, 2*M_PI, false}); |
| | REQUIRE(ellipse.switchMajorMinor() == true); |
| | REQUIRE(ellipse.getMajorP() == RS_Vector(0.0, 2.5)); |
| | REQUIRE(std::abs(ellipse.getRatio() - 2.0) < EPS); |
| | REQUIRE(ellipse.switchMajorMinor()); |
| | REQUIRE(ellipse.getMajorP().distanceTo(RS_Vector(-5.0, 0.0)) < EPS); |
| | REQUIRE(std::abs(ellipse.getRatio() - 0.5) < EPS); |
| |
|
| | } |
| |
|