diff --git a/tests/libslic3r/CMakeLists.txt b/tests/libslic3r/CMakeLists.txt index bb53fb9b1e..69539e82d3 100644 --- a/tests/libslic3r/CMakeLists.txt +++ b/tests/libslic3r/CMakeLists.txt @@ -3,6 +3,7 @@ get_filename_component(_TEST_NAME ${CMAKE_CURRENT_LIST_DIR} NAME) add_executable(${_TEST_NAME}_tests ${_TEST_NAME}_tests.cpp test_line.cpp + test_point.cpp test_3mf.cpp test_aabbindirect.cpp test_kdtreeindirect.cpp diff --git a/tests/libslic3r/test_point.cpp b/tests/libslic3r/test_point.cpp new file mode 100644 index 0000000000..06d4433b09 --- /dev/null +++ b/tests/libslic3r/test_point.cpp @@ -0,0 +1,46 @@ + +/** + * Ported from xs/t/03_point.t + * - it used to check ccw() but it does not exist anymore + * and cross product uses doubles + */ + +#include +#include +#include "test_utils.hpp" + +using namespace Slic3r; + +TEST_CASE("Nearest point", "[Point]") { + const Point point{10, 15}; + const Point point2{30, 15}; + + const Point nearest{nearest_point({point2, Point{100, 200}}, point).first}; + CHECK(nearest == point2); +} + +TEST_CASE("Distance to line", "[Point]") { + const Line line{{0, 0}, {100, 0}}; + CHECK(line.distance_to(Point{0, 0}) == Approx(0)); + CHECK(line.distance_to(Point{100, 0}) == Approx(0)); + CHECK(line.distance_to(Point{50, 0}) == Approx(0)); + CHECK(line.distance_to(Point{150, 0}) == Approx(50)); + CHECK(line.distance_to(Point{0, 50}) == Approx(50)); + CHECK(line.distance_to(Point{50, 50}) == Approx(50)); + CHECK(line.perp_distance_to(Point{50, 50}) == Approx(50)); + CHECK(line.perp_distance_to(Point{150, 50}) == Approx(50)); +} + +TEST_CASE("Distance to diagonal line", "[Point]") { + const Line line{{50, 50}, {125, -25}}; + CHECK(std::abs(line.distance_to(Point{100, 0})) == Approx(0)); +} + +TEST_CASE("Perp distance to line does not overflow", "[Point]") { + const Line line{ + {18335846, 18335845}, + {18335846, 1664160}, + }; + + CHECK(line.distance_to(Point{1664161, 18335848}) == Approx(16671685)); +} diff --git a/xs/t/03_point.t b/xs/t/03_point.t deleted file mode 100644 index 389e120c75..0000000000 --- a/xs/t/03_point.t +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; - -use Slic3r::XS; -use Test::More tests => 16; - -my $point = Slic3r::Point->new(10, 15); - -my $point2 = $point->clone; -$point2->scale(2); -is_deeply [ @$point2 ], [20, 30], 'scale'; - -$point2->translate(10, -15); -is_deeply [ @$point2 ], [30, 15], 'translate'; - -{ - my $point3 = Slic3r::Point->new(4300000, -9880845); - is $point->[0], $point->x, 'x accessor'; - is $point->[1], $point->y, 'y accessor'; #,, -} - -{ - my $nearest = $point->nearest_point([ $point2, Slic3r::Point->new(100, 200) ]); - ok $nearest->coincides_with($point2), 'nearest_point'; -} - -{ - my $line = Slic3r::Line->new([0,0], [100,0]); - is +Slic3r::Point->new(0,0) ->distance_to_line($line), 0, 'distance_to_line()'; - is +Slic3r::Point->new(100,0)->distance_to_line($line), 0, 'distance_to_line()'; - is +Slic3r::Point->new(50,0) ->distance_to_line($line), 0, 'distance_to_line()'; - is +Slic3r::Point->new(150,0)->distance_to_line($line), 50, 'distance_to_line()'; - is +Slic3r::Point->new(0,50) ->distance_to_line($line), 50, 'distance_to_line()'; - is +Slic3r::Point->new(50,50)->distance_to_line($line), 50, 'distance_to_line()'; - is +Slic3r::Point->new(50,50) ->perp_distance_to_line($line), 50, 'perp_distance_to_line()'; - is +Slic3r::Point->new(150,50)->perp_distance_to_line($line), 50, 'perp_distance_to_line()'; -} - -{ - my $line = Slic3r::Line->new([50,50], [125,-25]); - cmp_ok(abs(Slic3r::Point->new(100,0)->distance_to_line($line)), '<=', 4e-15, 'distance_to_line()'); -} - -{ - my $line = Slic3r::Line->new( - [18335846,18335845], - [18335846,1664160], - ); - $point = Slic3r::Point->new(1664161,18335848); - is $point->perp_distance_to_line($line), 16671685, 'perp_distance_to_line() does not overflow'; -} - -{ - my $p0 = Slic3r::Point->new(76975850,89989996); - my $p1 = Slic3r::Point->new(76989990,109989991); - my $p2 = Slic3r::Point->new(76989987,89989994); - ok $p0->ccw($p1, $p2) < 0, 'ccw() does not overflow'; -} - -__END__