mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-10 22:28:58 +08:00
Rewrite xs/t/03_point.t to c++
This commit is contained in:
parent
f78ab3e788
commit
37a707b05f
@ -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
|
||||
|
46
tests/libslic3r/test_point.cpp
Normal file
46
tests/libslic3r/test_point.cpp
Normal file
@ -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 <catch2/catch.hpp>
|
||||
#include <libslic3r/Point.hpp>
|
||||
#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));
|
||||
}
|
@ -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__
|
Loading…
x
Reference in New Issue
Block a user