mirror of https://github.com/KLayout/klayout.git
FEATURE: added RBA::Polygon#split, RBA::Polygon#split, RBA::DSimplePolygon#split, RBA::DSimplePolygon#split
This commit is contained in:
parent
5fbbccd9e2
commit
e710b28a6d
|
|
@ -230,6 +230,13 @@ struct simple_polygon_defs
|
||||||
return db::interact (*p, spoly);
|
return db::interact (*p, spoly);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::vector<C> split_poly (const C *p)
|
||||||
|
{
|
||||||
|
std::vector<C> parts;
|
||||||
|
db::split_polygon (*p, parts);
|
||||||
|
return parts;
|
||||||
|
}
|
||||||
|
|
||||||
static gsi::Methods methods ()
|
static gsi::Methods methods ()
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
|
|
@ -495,6 +502,19 @@ struct simple_polygon_defs
|
||||||
"\n"
|
"\n"
|
||||||
"This method was introduced in version 0.25.\n"
|
"This method was introduced in version 0.25.\n"
|
||||||
) +
|
) +
|
||||||
|
method_ext ("split", &split_poly,
|
||||||
|
"@brief Splits the polygon into two or more parts\n"
|
||||||
|
"This method will break the polygon into parts. The exact breaking algorithm is unspecified, the "
|
||||||
|
"result are smaller polygons of roughly equal number of points and 'less concave' nature. "
|
||||||
|
"Usually the returned polygon set consists of two polygons, but there can be more. "
|
||||||
|
"The merged region of the resulting polygons equals the original polygon with the exception of "
|
||||||
|
"small snapping effects at new vertexes.\n"
|
||||||
|
"\n"
|
||||||
|
"The intended use for this method is a iteratively split polygons until the satisfy some "
|
||||||
|
"maximum number of points limit.\n"
|
||||||
|
"\n"
|
||||||
|
"This method has been introduced in version 0.25.3."
|
||||||
|
) +
|
||||||
method_ext ("area", &area,
|
method_ext ("area", &area,
|
||||||
"@brief The area of the polygon\n"
|
"@brief The area of the polygon\n"
|
||||||
"The area is correct only if the polygon is not self-overlapping and the polygon is oriented clockwise."
|
"The area is correct only if the polygon is not self-overlapping and the polygon is oriented clockwise."
|
||||||
|
|
@ -1058,6 +1078,13 @@ struct polygon_defs
|
||||||
return db::interact (*p, spoly);
|
return db::interact (*p, spoly);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::vector<C> split_spoly (const C *p)
|
||||||
|
{
|
||||||
|
std::vector<C> parts;
|
||||||
|
db::split_polygon (*p, parts);
|
||||||
|
return parts;
|
||||||
|
}
|
||||||
|
|
||||||
static gsi::Methods methods ()
|
static gsi::Methods methods ()
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
|
|
@ -1486,6 +1513,19 @@ struct polygon_defs
|
||||||
"\n"
|
"\n"
|
||||||
"This method was introduced in version 0.25.\n"
|
"This method was introduced in version 0.25.\n"
|
||||||
) +
|
) +
|
||||||
|
method_ext ("split", &split_spoly,
|
||||||
|
"@brief Splits the polygon into two or more parts\n"
|
||||||
|
"This method will break the polygon into parts. The exact breaking algorithm is unspecified, the "
|
||||||
|
"result are smaller polygons of roughly equal number of points and 'less concave' nature. "
|
||||||
|
"Usually the returned polygon set consists of two polygons, but there can be more. "
|
||||||
|
"The merged region of the resulting polygons equals the original polygon with the exception of "
|
||||||
|
"small snapping effects at new vertexes.\n"
|
||||||
|
"\n"
|
||||||
|
"The intended use for this method is a iteratively split polygons until the satisfy some "
|
||||||
|
"maximum number of points limit.\n"
|
||||||
|
"\n"
|
||||||
|
"This method has been introduced in version 0.25.3."
|
||||||
|
) +
|
||||||
method_ext ("area", &area,
|
method_ext ("area", &area,
|
||||||
"@brief The area of the polygon\n"
|
"@brief The area of the polygon\n"
|
||||||
"The area is correct only if the polygon is not self-overlapping and the polygon is oriented clockwise."
|
"The area is correct only if the polygon is not self-overlapping and the polygon is oriented clockwise."
|
||||||
|
|
|
||||||
|
|
@ -731,6 +731,36 @@ class DBPolygon_TestClass < TestBase
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_splitPolygon
|
||||||
|
|
||||||
|
pts = []
|
||||||
|
pts << RBA::Point::new(0, 0)
|
||||||
|
pts << RBA::Point::new(0, 1000)
|
||||||
|
pts << RBA::Point::new(100, 1000)
|
||||||
|
pts << RBA::Point::new(100, 100)
|
||||||
|
pts << RBA::Point::new(1000, 100)
|
||||||
|
pts << RBA::Point::new(1000, 0)
|
||||||
|
split = RBA::Polygon::new(pts).split
|
||||||
|
assert_equal(split.collect { |p| p.to_s }.join(";"), "(0,0;0,100;1000,100;1000,0);(0,100;0,1000;100,1000;100,100)")
|
||||||
|
|
||||||
|
split = RBA::SimplePolygon::new(pts).split
|
||||||
|
assert_equal(split.collect { |p| p.to_s }.join(";"), "(0,0;0,100;1000,100;1000,0);(0,100;0,1000;100,1000;100,100)")
|
||||||
|
|
||||||
|
pts = []
|
||||||
|
pts << RBA::DPoint::new(0, 0)
|
||||||
|
pts << RBA::DPoint::new(0, 1000)
|
||||||
|
pts << RBA::DPoint::new(100, 1000)
|
||||||
|
pts << RBA::DPoint::new(100, 100)
|
||||||
|
pts << RBA::DPoint::new(1000, 100)
|
||||||
|
pts << RBA::DPoint::new(1000, 0)
|
||||||
|
split = RBA::DPolygon::new(pts).split
|
||||||
|
assert_equal(split.collect { |p| p.to_s }.join(";"), "(0,0;0,100;1000,100;1000,0);(0,100;0,1000;100,1000;100,100)")
|
||||||
|
|
||||||
|
split = RBA::DSimplePolygon::new(pts).split
|
||||||
|
assert_equal(split.collect { |p| p.to_s }.join(";"), "(0,0;0,100;1000,100;1000,0);(0,100;0,1000;100,1000;100,100)")
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
load("test_epilogue.rb")
|
load("test_epilogue.rb")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue