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/09_polyline.t to c++
This commit is contained in:
parent
37a707b05f
commit
9164dd55e6
@ -1,3 +1,6 @@
|
||||
/**
|
||||
* Ported from xs/t/09_polyline.t
|
||||
*/
|
||||
#include <catch2/catch.hpp>
|
||||
|
||||
#include "libslic3r/Point.hpp"
|
||||
@ -5,6 +8,74 @@
|
||||
|
||||
using namespace Slic3r;
|
||||
|
||||
struct PolylineTestCase {
|
||||
Polyline polyline{
|
||||
{100, 100},
|
||||
{200, 100},
|
||||
{200, 200}
|
||||
};
|
||||
};
|
||||
|
||||
TEST_CASE_METHOD(PolylineTestCase, "Lines can be retrieved", "[Polyline]") {
|
||||
|
||||
CHECK(polyline.lines() == Lines{
|
||||
{{100, 100}, {200, 100}},
|
||||
{{200, 100}, {200, 200}},
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE_METHOD(PolylineTestCase, "Clip", "[Polyline]") {
|
||||
const double len = polyline.length();
|
||||
polyline.clip_end(len/3);
|
||||
CHECK(std::abs(polyline.length() - 2.0/3.0*len) < 1);
|
||||
}
|
||||
|
||||
TEST_CASE_METHOD(PolylineTestCase, "Append", "[Polyline]") {
|
||||
Polyline tested_polyline{polyline};
|
||||
tested_polyline.append(tested_polyline);
|
||||
Points expected{polyline.points};
|
||||
expected.insert(expected.end(), polyline.points.begin(), polyline.points.end());
|
||||
|
||||
CHECK(tested_polyline.points == expected);
|
||||
}
|
||||
|
||||
TEST_CASE_METHOD(PolylineTestCase, "Extend end", "[Polyline]") {
|
||||
CHECK(polyline.length() == 100*2);
|
||||
polyline.extend_end(50);
|
||||
CHECK(polyline.length() == 100*2 + 50);
|
||||
}
|
||||
|
||||
TEST_CASE_METHOD(PolylineTestCase, "Extend start", "[Polyline]") {
|
||||
CHECK(polyline.length() == 100*2);
|
||||
polyline.extend_start(50);
|
||||
CHECK(polyline.length() == 100*2 + 50);
|
||||
}
|
||||
|
||||
TEST_CASE_METHOD(PolylineTestCase, "Split", "[Polyline]") {
|
||||
Polyline p1;
|
||||
Polyline p2;
|
||||
const Point point{150, 100};
|
||||
polyline.split_at(point, &p1, &p2);
|
||||
CHECK(p1.size() == 2);
|
||||
CHECK(p2.size() == 3);
|
||||
CHECK(p1.last_point() == point);
|
||||
CHECK(p2.first_point() == point);
|
||||
}
|
||||
|
||||
TEST_CASE_METHOD(PolylineTestCase, "Split at first point", "[Polyline]") {
|
||||
Polyline to_split{
|
||||
polyline.points[0],
|
||||
polyline.points[1],
|
||||
polyline.points[2],
|
||||
polyline.points[0]
|
||||
};
|
||||
Polyline p1;
|
||||
Polyline p2;
|
||||
to_split.split_at(to_split.first_point(), &p1, &p2);
|
||||
CHECK(p1.size() == 1);
|
||||
CHECK(p2.size() == 4);
|
||||
}
|
||||
|
||||
SCENARIO("Simplify polyne, template", "[Polyline]")
|
||||
{
|
||||
Points polyline{ {0,0}, {1000,0}, {2000,0}, {2000,1000}, {2000,2000}, {1000,2000}, {0,2000}, {0,1000}, {0,0} };
|
||||
@ -44,4 +115,24 @@ SCENARIO("Simplify polyline", "[Polyline]")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GIVEN("polyline 3") {
|
||||
auto polyline = Polyline{ {0,0}, {100,0}, {50,10} };
|
||||
WHEN("simplified with Douglas-Peucker") {
|
||||
polyline.simplify(25.);
|
||||
THEN("not simplified") {
|
||||
REQUIRE(polyline == Polyline{ {0,0}, {100, 0}, {50,10} });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GIVEN("polyline 4") {
|
||||
auto polyline = Polyline{ {0,0}, {20,0}, {50,0}, {80,0}, {100,0} };
|
||||
WHEN("simplified with Douglas-Peucker") {
|
||||
polyline.simplify(2.);
|
||||
THEN("not simplified") {
|
||||
REQUIRE(polyline == Polyline{ {0,0}, {100,0} });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,86 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Slic3r::XS;
|
||||
use Test::More tests => 15;
|
||||
|
||||
my $points = [
|
||||
[100, 100],
|
||||
[200, 100],
|
||||
[200, 200],
|
||||
];
|
||||
|
||||
my $polyline = Slic3r::Polyline->new(@$points);
|
||||
|
||||
my $lines = $polyline->lines;
|
||||
is_deeply [ map $_->pp, @$lines ], [
|
||||
[ [100, 100], [200, 100] ],
|
||||
[ [200, 100], [200, 200] ],
|
||||
], 'polyline lines';
|
||||
|
||||
$polyline->append_polyline($polyline->clone);
|
||||
is_deeply $polyline->pp, [ @$points, @$points ], 'append_polyline';
|
||||
|
||||
{
|
||||
my $len = $polyline->length;
|
||||
$polyline->clip_end($len/3);
|
||||
ok abs($polyline->length - ($len-($len/3))) < 1, 'clip_end';
|
||||
}
|
||||
|
||||
{
|
||||
my $polyline = Slic3r::Polyline->new(
|
||||
[0,0], [20,0], [50,0], [80,0], [100,0],
|
||||
);
|
||||
$polyline->simplify(2);
|
||||
is_deeply $polyline->pp, [ [0,0], [100,0] ], 'Douglas-Peucker';
|
||||
}
|
||||
|
||||
{
|
||||
my $polyline = Slic3r::Polyline->new(
|
||||
[0,0], [50,50], [100,0], [125,-25], [150,50],
|
||||
);
|
||||
$polyline->simplify(25);
|
||||
is_deeply $polyline->pp, [ [0, 0], [50, 50], [125, -25], [150, 50] ], 'Douglas-Peucker';
|
||||
}
|
||||
|
||||
{
|
||||
my $polyline = Slic3r::Polyline->new(
|
||||
[0,0], [100,0], [50,10],
|
||||
);
|
||||
$polyline->simplify(25);
|
||||
is_deeply $polyline->pp, [ [0,0], [100,0], [50,10] ], 'Douglas-Peucker uses shortest distance instead of perpendicular distance';
|
||||
}
|
||||
|
||||
{
|
||||
my $polyline = Slic3r::Polyline->new(@$points);
|
||||
is $polyline->length, 100*2, 'length';
|
||||
$polyline->extend_end(50);
|
||||
is $polyline->length, 100*2 + 50, 'extend_end';
|
||||
$polyline->extend_start(50);
|
||||
is $polyline->length, 100*2 + 50 + 50, 'extend_start';
|
||||
}
|
||||
|
||||
{
|
||||
my $polyline = Slic3r::Polyline->new(@$points);
|
||||
my $p1 = Slic3r::Polyline->new;
|
||||
my $p2 = Slic3r::Polyline->new;
|
||||
my $point = Slic3r::Point->new(150, 100);
|
||||
$polyline->split_at($point, $p1, $p2);
|
||||
is scalar(@$p1), 2, 'split_at';
|
||||
is scalar(@$p2), 3, 'split_at';
|
||||
ok $p1->last_point->coincides_with($point), 'split_at';
|
||||
ok $p2->first_point->coincides_with($point), 'split_at';
|
||||
}
|
||||
|
||||
{
|
||||
my $polyline = Slic3r::Polyline->new(@$points[0,1,2,0]);
|
||||
my $p1 = Slic3r::Polyline->new;
|
||||
my $p2 = Slic3r::Polyline->new;
|
||||
$polyline->split_at($polyline->first_point, $p1, $p2);
|
||||
is scalar(@$p1), 1, 'split_at';
|
||||
is scalar(@$p2), 4, 'split_at';
|
||||
}
|
||||
|
||||
__END__
|
Loading…
x
Reference in New Issue
Block a user