mirror of https://github.com/CGAL/cgal
Removed Ron from maintainer list. Updated Ron's email address. Cleaned up documentation and example programs
This commit is contained in:
parent
7ce44a2615
commit
f48ce38473
|
|
@ -432,7 +432,7 @@ function template computes the offset of a given polygon \f$ P\f$
|
||||||
by a rational radius \f$ r\f$ in an exact manner. The input
|
by a rational radius \f$ r\f$ in an exact manner. The input
|
||||||
polygon $P$ must be either simple or degenerate consisting of two
|
polygon $P$ must be either simple or degenerate consisting of two
|
||||||
vertices (representing a line segment). The `traits` argument must model
|
vertices (representing a line segment). The `traits` argument must model
|
||||||
the concept `ArrangementTraits_2`; it should be capable of handling
|
the concept `ArrangementTraits_2` and it should be capable of handling
|
||||||
conic arcs in an exact manner---using an instance of the
|
conic arcs in an exact manner---using an instance of the
|
||||||
`Arr_conic_traits_2` class template with the number
|
`Arr_conic_traits_2` class template with the number
|
||||||
types provided by the <span class="textsc">Core</span> library is the
|
types provided by the <span class="textsc">Core</span> library is the
|
||||||
|
|
@ -455,69 +455,73 @@ considerably slower:
|
||||||
\cgalExample{Minkowski_sum_2/exact_offset.cpp}
|
\cgalExample{Minkowski_sum_2/exact_offset.cpp}
|
||||||
|
|
||||||
\cgalAdvancedBegin
|
\cgalAdvancedBegin
|
||||||
Both functions `approximated_offset_2()` and `offset_polygon_2()`
|
Both functions templates `approximated_offset_2()` and `offset_polygon_2()`
|
||||||
also have overloaded versions that accept a decomposition strategy
|
also have overloaded versions that accept a decomposition strategy
|
||||||
and use the polygon-decomposition approach to compute (or approximate)
|
and use the polygon-decomposition approach to compute (or approximate)
|
||||||
the offset. These functions are less efficient than their counterparts
|
the offset. These functions are typically considerably slower than their
|
||||||
that employ the convolution approach, and are only included in the package
|
counterparts that employ the convolution approach. However, similar to the
|
||||||
for the sake of completeness.
|
functions that compute the general Minkowski sum, they are able to compute
|
||||||
|
the offset of polygons with holes, given a decomposition strategy that
|
||||||
|
handles polygons with holes, such as the
|
||||||
|
'Polygon_vertical_decomposition_2<Kernel>' class template.
|
||||||
\cgalAdvancedEnd
|
\cgalAdvancedEnd
|
||||||
|
|
||||||
\subsection mink_ssecinner_offset Computing Inner Offsets
|
\subsection mink_ssecinner_offset Computing Inner Offsets
|
||||||
|
|
||||||
An operation closely related to the offset computation, is obtaining the
|
An operation closely related to the (outer) offset computation, is
|
||||||
<I>inner offset</I> of a polygon, or <I>insetting</I> it by a given radius.
|
computing the <I>inner offset</I> of a polygon, or <I>insetting</I> it
|
||||||
The inset of a polygon \f$ P\f$ with radius \f$ r\f$ is the set of points
|
by a given radius. The inset of a polygon \f$ P\f$ with radius
|
||||||
iside \f$ P\f$ whose distance from the polygon boundary, denoted
|
\f$ r\f$ is the set of points iside \f$ P\f$ the distance of which
|
||||||
\f$ \partial P\f$, is at least \f$ r\f$, namely:
|
from the polygon boundary, denoted \f$ \partial P\f$, is at least \f$ r\f$,
|
||||||
\f$ \{ p \in P \;|\; {\rm dist}(p, \partial P) \geq r \}\f$.
|
namely: \f$ \{ p \in P \;|\; {\rm dist}(p, \partial P) \geq r \}\f$.
|
||||||
Note that the resulting set may not be connected in case \f$ P\f$ is a
|
Note that the resulting point set may be dicconnected when \f$ P\f$ is a
|
||||||
non-convex polygon that has some narrow components, and thus is
|
non-convex polygon that has some narrow components. In such a case the
|
||||||
characterized by a (possibly empty) set of polygons whose edges are
|
resulting set is characterized by a (possibly empty) set of polygons the
|
||||||
line segments and circular arcs of radius \f$ r\f$.
|
edges of which are line segments and circular arcs of radius \f$ r\f$.
|
||||||
|
|
||||||
The offset can be computed using the convolution method if we traverse the
|
The inset can be computed using the convolution method traversing the
|
||||||
polygon in a <I>clockwise</I> orientation (and not in <I>counterclockwise</I>
|
polygon in a <I>clockwise</I> order (as oppose to the
|
||||||
orientation, as done in case of ofsetting a polygon).
|
<I>counterclockwise</I> order applied in the case of ofsetting a polygon).
|
||||||
As in case of the offset functions, the Minkowski-sum package contains two
|
As with the (outer) offset functions, the Minkowski-sum package contains two
|
||||||
functions for insetting a simple polygon:
|
functions for insetting a simple polygon, namely,
|
||||||
|
`approximated_inset_2(P, r, eps, oi)` and `inset_polygon_2(P, r, traits, oi)`.
|
||||||
|
|
||||||
The function \link approximated_inset_2() `approximated_inset_2(P, r, eps, oi)`\endlink accepts a polygon
|
The \link approximated_inset_2() `approximated_inset_2(P, r, eps, oi)`\endlink
|
||||||
\f$ P\f$, an inset radius \f$ r\f$ and \f$ \varepsilon > 0\f$. It constructs an
|
function template accepts a polygon \f$ P\f$, an inset radius \f$ r\f$,
|
||||||
approximation for the inset of \f$ P\f$ by the radius \f$ r\f$, with the approximation
|
(a floating-point number) \f$ \epsilon > 0 \f$, and an output
|
||||||
error bounded by \f$ \varepsilon\f$. The function returns its output via the
|
iterator `oi`, whose value-type must be an instance of the class template
|
||||||
output iterator `oi`, whose value-type must be
|
`Gps_circle_segment_traits_2::Polygon_2`. . It constructs an approximation
|
||||||
`Gps_circle_segment_traits_2::Polygon_2` representing
|
of the inset of \f$ P\f$ by the radius \f$ r\f$, where the approximation
|
||||||
the polygons that approximates the inset polygon.
|
error is bounded by \f$ \epsilon\f$. The function returns the polygons that
|
||||||
|
approximate the inset polygon through the output iterator `oi`.
|
||||||
|
|
||||||
\cgalExample{Minkowski_sum_2/approx_inset.cpp}
|
\cgalExample{Minkowski_sum_2/approx_inset.cpp}
|
||||||
|
|
||||||
Similarly, the function
|
Similarly, the function template
|
||||||
\link inset_polygon_2() `inset_polygon_2(P, r, traits, oi)` \endlink computes
|
\link inset_polygon_2() `inset_polygon_2(P, r, traits, oi)` \endlink
|
||||||
the exact inset of \f$ P\f$ with radius \f$ r\f$, and returns its output via the given
|
computes the exact inset of \f$ P\f$ with radius \f$ r\f$, and returns
|
||||||
output iterator `oi`. The `traits` parameter should be an instance of
|
its output through the given output iterator `oi`. The `traits` parameter
|
||||||
an arrangement-traits class that is capable of handling conic arcs in an
|
must model the concept `ArrangementTraits_2` and it should be capable of
|
||||||
exact manner, whereas `oi`'s value-type must be
|
handling conic arcs in an exact manner, whereas the value-type of `oi`
|
||||||
`Gps_traits_2::Polygon_2`.
|
must be an instance of `Gps_traits_2::Polygon_2`.
|
||||||
|
|
||||||
\cgalExample{Minkowski_sum_2/exact_inset.cpp}
|
\cgalExample{Minkowski_sum_2/exact_inset.cpp}
|
||||||
|
|
||||||
\cgalAdvancedBegin
|
Unlike the functions that compute the offsets, there are no overloaded
|
||||||
Unlike the offset functions, there are no overloaded versions of the inset
|
versions of the functions that compute the insets and use convex polygon
|
||||||
functions that use convex polygon decomposition to compute insets, as this
|
decomposition, as decomposition approach cannot be easily generalized for
|
||||||
method cannot be easily generalized for inset computations.
|
inset computations.
|
||||||
\cgalAdvancedEnd
|
|
||||||
|
|
||||||
In this context let us mention that there exist overloaded versions of the
|
The package also provides overloaded versions of the functions
|
||||||
functions
|
|
||||||
\link approximated_offset_2() `approximated_offset_2(P, r, eps)`\endlink
|
\link approximated_offset_2() `approximated_offset_2(P, r, eps)`\endlink
|
||||||
and
|
and
|
||||||
\link offset_polygon_2() `offset_polygon_2(P, r, traits)`\endlink
|
\link offset_polygon_2() `offset_polygon_2(P, r, traits)`\endlink
|
||||||
that accept a <I>polygon with holes</I>
|
that accept a <I>polygon with holes</I>
|
||||||
\f$ P\f$ and computed its offset. This ofset is obtain by taking the outer offset
|
\f$ P\f$ and compute its offset. This ofset is obtain by computing the
|
||||||
of \f$ P\f$'s outer boundary, and computing the inner offsets of \f$ P\f$'s holes.
|
outer offset of the outer boundary of \f$ P\f$'s, and computing the inner
|
||||||
The former polygon defines the output boundary of \f$ P \oplus B_r\f$, and the latter
|
offsets of the holes of \f$ P\f$. The former polygon defines the output
|
||||||
define the holes within the result.
|
boundary of \f$ P \oplus B_r\f$, and the latter define the holes within
|
||||||
|
the result.
|
||||||
|
|
||||||
\section Minkowski_sum_2Acknowledgements Acknowledgements
|
\section Minkowski_sum_2Acknowledgements Acknowledgements
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,63 +1,48 @@
|
||||||
//! \file examples/Minkowski_sum_2/approx_inset.cpp
|
//! \file examples/Minkowski_sum_2/approx_inset.cpp
|
||||||
// Computing the approximated inset of a polygon.
|
// Computing the approximated inset of a polygon.
|
||||||
|
|
||||||
#include "ms_rational_nt.h"
|
#include <fstream>
|
||||||
#include <CGAL/Lazy_exact_nt.h>
|
|
||||||
#include <CGAL/Cartesian.h>
|
|
||||||
#include <CGAL/approximated_offset_2.h>
|
|
||||||
#include <CGAL/offset_polygon_2.h>
|
|
||||||
#include <CGAL/Timer.h>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <list>
|
||||||
|
#include <boost/timer.hpp>
|
||||||
|
|
||||||
typedef CGAL::Lazy_exact_nt<Number_type> Lazy_exact_nt;
|
#include <CGAL/basic.h>
|
||||||
|
#include <CGAL/approximated_offset_2.h>
|
||||||
|
|
||||||
struct Kernel : public CGAL::Cartesian<Lazy_exact_nt> {};
|
#include "bops_circular.h"
|
||||||
typedef CGAL::Polygon_2<Kernel> Polygon_2;
|
|
||||||
|
|
||||||
typedef CGAL::Gps_circle_segment_traits_2<Kernel> Gps_traits_2;
|
typedef CGAL::Polygon_2<Kernel> Linear_polygon;
|
||||||
typedef Gps_traits_2::Polygon_2 Offset_polygon_2;
|
|
||||||
typedef Gps_traits_2::Polygon_with_holes_2 Offset_polygon_with_holes_2;
|
|
||||||
|
|
||||||
int main ()
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
// Open the input file.
|
// Open the input file and read a polygon.
|
||||||
std::ifstream in_file ("tight.dat");
|
const char* filename = (argc > 1) ? argv[1] : "tight.dat";
|
||||||
|
std::ifstream in_file(filename);
|
||||||
|
|
||||||
if (! in_file.is_open())
|
if (! in_file.is_open()) {
|
||||||
{
|
|
||||||
std::cerr << "Failed to open the input file." << std::endl;
|
std::cerr << "Failed to open the input file." << std::endl;
|
||||||
return (1);
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the input polygon.
|
// Read the input polygon.
|
||||||
Polygon_2 P;
|
Linear_polygon P;
|
||||||
|
|
||||||
in_file >> P;
|
in_file >> P;
|
||||||
in_file.close();
|
in_file.close();
|
||||||
|
|
||||||
std::cout << "Read an input polygon with "
|
std::cout << "Read an input polygon with " << P.size() << " vertices."
|
||||||
<< P.size() << " vertices." << std::endl;
|
<< std::endl;
|
||||||
|
|
||||||
// Approximate the offset polygon.
|
// Approximate the offset polygon.
|
||||||
const Number_type radius = 1;
|
std::list<Polygon> inset_polygons;
|
||||||
const double err_bound = 0.00001;
|
boost::timer timer;
|
||||||
std::list<Offset_polygon_2> inset_polygons;
|
approximated_inset_2(P, 1, 0.00001, std::back_inserter(inset_polygons));
|
||||||
std::list<Offset_polygon_2>::iterator iit;
|
double secs = timer.elapsed();
|
||||||
CGAL::Timer timer;
|
|
||||||
|
|
||||||
timer.start();
|
std::list<Polygon>::iterator it;
|
||||||
approximated_inset_2 (P, radius, err_bound,
|
std::cout << "The inset comprises " << inset_polygons.size()
|
||||||
std::back_inserter (inset_polygons));
|
<< " polygon(s)." << std::endl;
|
||||||
timer.stop();
|
for (it = inset_polygons.begin(); it != inset_polygons.end(); ++it)
|
||||||
|
std::cout << " Polygon with " << it->size() << " vertices." << std::endl;
|
||||||
std::cout << "The inset comprises "
|
std::cout << "Inset computation took " << secs << " seconds." << std::endl;
|
||||||
<< inset_polygons.size() << " polygon(s)." << std::endl;
|
return 0;
|
||||||
for (iit = inset_polygons.begin(); iit != inset_polygons.end(); ++iit)
|
|
||||||
{
|
|
||||||
std::cout << " Polygon with "
|
|
||||||
<< iit->size() << " vertices." << std::endl;
|
|
||||||
}
|
|
||||||
std::cout << "Inset computation took "
|
|
||||||
<< timer.time() << " seconds." << std::endl;
|
|
||||||
return (0);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
#ifndef ARR_CONICS_H
|
||||||
|
#define ARR_CONICS_H
|
||||||
|
|
||||||
|
#include <CGAL/Cartesian.h>
|
||||||
|
#include <CGAL/CORE_algebraic_number_traits.h>
|
||||||
|
#include <CGAL/Arr_conic_traits_2.h>
|
||||||
|
#include <CGAL/Arrangement_2.h>
|
||||||
|
|
||||||
|
typedef CGAL::CORE_algebraic_number_traits Nt_traits;
|
||||||
|
typedef Nt_traits::Rational Rational;
|
||||||
|
typedef CGAL::Cartesian<Rational> Rat_kernel;
|
||||||
|
typedef Rat_kernel::Point_2 Rat_point;
|
||||||
|
typedef Rat_kernel::Segment_2 Rat_segment;
|
||||||
|
typedef Rat_kernel::Circle_2 Rat_circle;
|
||||||
|
typedef Nt_traits::Algebraic Algebraic;
|
||||||
|
typedef CGAL::Cartesian<Algebraic> Alg_kernel;
|
||||||
|
|
||||||
|
typedef CGAL::Arr_conic_traits_2<Rat_kernel, Alg_kernel, Nt_traits>
|
||||||
|
Traits;
|
||||||
|
typedef Traits::Point_2 Point;
|
||||||
|
typedef Traits::Curve_2 Conic_arc;
|
||||||
|
typedef Traits::X_monotone_curve_2 X_monotone_conic_arc;
|
||||||
|
typedef CGAL::Arrangement_2<Traits> Arrangement;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -1,80 +1,60 @@
|
||||||
//! \file examples/Minkowski_sum_2/exact_inset.cpp
|
//! \file examples/Minkowski_sum_2/exact_inset.cpp
|
||||||
// Computing the exact inner offset of a polygon.
|
// Computing the exact inner offset of a polygon.
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include <CGAL/basic.h>
|
#include <CGAL/basic.h>
|
||||||
|
|
||||||
#ifndef CGAL_USE_CORE
|
#ifndef CGAL_USE_CORE
|
||||||
#include <iostream>
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
std::cout << "Sorry, this example needs CORE ..." << std::endl;
|
std::cout << "Sorry, this example needs CORE ..." << std::endl;
|
||||||
return (0);
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#include <CGAL/Cartesian.h>
|
#include <fstream>
|
||||||
#include <CGAL/CORE_algebraic_number_traits.h>
|
#include <boost/timer.hpp>
|
||||||
#include <CGAL/Arr_conic_traits_2.h>
|
|
||||||
|
#include <CGAL/Gps_traits_2.h>
|
||||||
#include <CGAL/offset_polygon_2.h>
|
#include <CGAL/offset_polygon_2.h>
|
||||||
#include <CGAL/Timer.h>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
typedef CGAL::CORE_algebraic_number_traits Nt_traits;
|
#include "arr_conics.h"
|
||||||
typedef Nt_traits::Rational Rational;
|
|
||||||
typedef Nt_traits::Algebraic Algebraic;
|
|
||||||
|
|
||||||
struct Rat_kernel : public CGAL::Cartesian<Rational> {};
|
typedef CGAL::Polygon_2<Rat_kernel> Polygon;
|
||||||
struct Alg_kernel : public CGAL::Cartesian<Algebraic> {};
|
typedef CGAL::Gps_traits_2<Traits> Gps_traits;
|
||||||
struct Conic_traits_2 : public CGAL::Arr_conic_traits_2<Rat_kernel,
|
typedef Gps_traits::Polygon_2 Offset_polygon;
|
||||||
Alg_kernel,
|
|
||||||
Nt_traits> {};
|
|
||||||
|
|
||||||
typedef CGAL::Polygon_2<Rat_kernel> Polygon_2;
|
int main(int argc, char* argv[])
|
||||||
|
|
||||||
typedef CGAL::Gps_traits_2<Conic_traits_2> Gps_traits_2;
|
|
||||||
typedef Gps_traits_2::Polygon_2 Offset_polygon_2;
|
|
||||||
|
|
||||||
int main ()
|
|
||||||
{
|
|
||||||
// Open the input file.
|
|
||||||
std::ifstream in_file ("tight.dat");
|
|
||||||
|
|
||||||
if (! in_file.is_open())
|
|
||||||
{
|
{
|
||||||
|
// Open the input file and read the input polygon.
|
||||||
|
const char* filename = (argc > 1) ? argv[1] : "tight.dat";
|
||||||
|
std::ifstream in_file(filename);
|
||||||
|
if (! in_file.is_open()) {
|
||||||
std::cerr << "Failed to open the input file." << std::endl;
|
std::cerr << "Failed to open the input file." << std::endl;
|
||||||
return (1);
|
return -1;
|
||||||
}
|
}
|
||||||
|
Polygon P;
|
||||||
// Read the input polygon.
|
|
||||||
Polygon_2 P;
|
|
||||||
|
|
||||||
in_file >> P;
|
in_file >> P;
|
||||||
in_file.close();
|
in_file.close();
|
||||||
|
std::cout << "Read an input polygon with " << P.size() << " vertices."
|
||||||
std::cout << "Read an input polygon with "
|
<< std::endl;
|
||||||
<< P.size() << " vertices." << std::endl;
|
|
||||||
|
|
||||||
// Compute the inner offset of the polygon.
|
// Compute the inner offset of the polygon.
|
||||||
Conic_traits_2 traits;
|
Traits traits;
|
||||||
const Rational radius = 1;
|
std::list<Offset_polygon> inset_polygons;
|
||||||
std::list<Offset_polygon_2> inset_polygons;
|
boost::timer timer;
|
||||||
std::list<Offset_polygon_2>::iterator iit;
|
inset_polygon_2(P, 1, traits, std::back_inserter(inset_polygons));
|
||||||
CGAL::Timer timer;
|
double secs = timer.elapsed();
|
||||||
|
|
||||||
timer.start();
|
|
||||||
inset_polygon_2 (P, radius, traits,
|
|
||||||
std::back_inserter (inset_polygons));
|
|
||||||
timer.stop();
|
|
||||||
|
|
||||||
|
std::list<Offset_polygon>::iterator it;
|
||||||
std::cout << "The inset comprises "
|
std::cout << "The inset comprises "
|
||||||
<< inset_polygons.size() << " polygon(s)." << std::endl;
|
<< inset_polygons.size() << " polygon(s)." << std::endl;
|
||||||
for (iit = inset_polygons.begin(); iit != inset_polygons.end(); ++iit)
|
for (it = inset_polygons.begin(); it != inset_polygons.end(); ++it)
|
||||||
{
|
std::cout << " Polygon with " << it->size() << " vertices."
|
||||||
std::cout << " Polygon with "
|
<< std::endl;
|
||||||
<< iit->size() << " vertices." << std::endl;
|
std::cout << "Inset computation took " << secs << " seconds." << std::endl;
|
||||||
}
|
return 0;
|
||||||
std::cout << "Inset computation took "
|
|
||||||
<< timer.time() << " seconds." << std::endl;
|
|
||||||
return (0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,75 +1,56 @@
|
||||||
//! \file examples/Minkowski_sum_2/exact_offset.cpp
|
//! \file examples/Minkowski_sum_2/exact_offset.cpp
|
||||||
// Computing the exact offset of a polygon.
|
// Computing the exact offset of a polygon.
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include <CGAL/basic.h>
|
#include <CGAL/basic.h>
|
||||||
|
|
||||||
#ifndef CGAL_USE_CORE
|
#ifndef CGAL_USE_CORE
|
||||||
#include <iostream>
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
std::cout << "Sorry, this example needs CORE ..." << std::endl;
|
std::cout << "Sorry, this example needs CORE ..." << std::endl;
|
||||||
return (0);
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#include <CGAL/Cartesian.h>
|
#include <fstream>
|
||||||
#include <CGAL/CORE_algebraic_number_traits.h>
|
#include <boost/timer.hpp>
|
||||||
#include <CGAL/Arr_conic_traits_2.h>
|
|
||||||
|
#include <CGAL/Gps_traits_2.h>
|
||||||
#include <CGAL/offset_polygon_2.h>
|
#include <CGAL/offset_polygon_2.h>
|
||||||
#include <CGAL/Timer.h>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
typedef CGAL::CORE_algebraic_number_traits Nt_traits;
|
#include "arr_conics.h"
|
||||||
typedef Nt_traits::Rational Rational;
|
|
||||||
typedef Nt_traits::Algebraic Algebraic;
|
|
||||||
|
|
||||||
struct Rat_kernel : public CGAL::Cartesian<Rational> {};
|
typedef CGAL::Polygon_2<Rat_kernel> Polygon;
|
||||||
struct Alg_kernel : public CGAL::Cartesian<Algebraic> {};
|
typedef CGAL::Gps_traits_2<Traits> Gps_traits;
|
||||||
struct Conic_traits_2 : public CGAL::Arr_conic_traits_2<Rat_kernel,
|
typedef Gps_traits::Polygon_with_holes_2 Offset_polygon_with_holes;
|
||||||
Alg_kernel,
|
|
||||||
Nt_traits> {};
|
|
||||||
|
|
||||||
typedef CGAL::Polygon_2<Rat_kernel> Polygon_2;
|
int main(int argc, char* argv[])
|
||||||
|
|
||||||
typedef CGAL::Gps_traits_2<Conic_traits_2> Gps_traits_2;
|
|
||||||
typedef Gps_traits_2::Polygon_2 Offset_polygon_2;
|
|
||||||
typedef Gps_traits_2::Polygon_with_holes_2 Offset_polygon_with_holes_2;
|
|
||||||
|
|
||||||
int main ()
|
|
||||||
{
|
|
||||||
// Open the input file.
|
|
||||||
std::ifstream in_file ("spiked.dat");
|
|
||||||
|
|
||||||
if (! in_file.is_open())
|
|
||||||
{
|
{
|
||||||
|
// Open the input file and read the input polygon.
|
||||||
|
const char* filename = (argc > 1) ? argv[1] : "spiked.dat";
|
||||||
|
std::ifstream in_file(filename);
|
||||||
|
if (! in_file.is_open()) {
|
||||||
std::cerr << "Failed to open the input file." << std::endl;
|
std::cerr << "Failed to open the input file." << std::endl;
|
||||||
return (1);
|
return -1;
|
||||||
}
|
}
|
||||||
|
Polygon P;
|
||||||
// Read the input polygon.
|
|
||||||
Polygon_2 P;
|
|
||||||
|
|
||||||
in_file >> P;
|
in_file >> P;
|
||||||
in_file.close();
|
in_file.close();
|
||||||
|
std::cout << "Read an input polygon with " << P.size() << " vertices."
|
||||||
std::cout << "Read an input polygon with "
|
<< std::endl;
|
||||||
<< P.size() << " vertices." << std::endl;
|
|
||||||
|
|
||||||
// Compute the offset polygon.
|
// Compute the offset polygon.
|
||||||
Conic_traits_2 traits;
|
Traits traits;
|
||||||
const Rational radius = 5;
|
boost::timer timer;
|
||||||
Offset_polygon_with_holes_2 offset;
|
Offset_polygon_with_holes offset = CGAL::offset_polygon_2(P, 5, traits);
|
||||||
CGAL::Timer timer;
|
double secs = timer.elapsed();
|
||||||
|
|
||||||
timer.start();
|
std::cout << "The offset polygon has " << offset.outer_boundary().size()
|
||||||
offset = offset_polygon_2 (P, radius, traits);
|
<< " vertices, " << offset.number_of_holes() << " holes."
|
||||||
timer.stop();
|
<< std::endl;
|
||||||
|
std::cout << "Offset computation took " << secs << " seconds." << std::endl;
|
||||||
std::cout << "The offset polygon has "
|
return 0;
|
||||||
<< offset.outer_boundary().size() << " vertices, "
|
|
||||||
<< offset.number_of_holes() << " holes." << std::endl;
|
|
||||||
std::cout << "Offset computation took "
|
|
||||||
<< timer.time() << " seconds." << std::endl;
|
|
||||||
return (0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
// Andreas Fabri <Andreas.Fabri@geometryfactory.com>
|
// Andreas Fabri <Andreas.Fabri@geometryfactory.com>
|
||||||
// Laurent Rineau <Laurent.Rineau@geometryfactory.com>
|
// Laurent Rineau <Laurent.Rineau@geometryfactory.com>
|
||||||
// Efi Fogel <efif@post.tau.ac.il>
|
// Efi Fogel <efif@post.tau.ac.il>
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
|
|
||||||
#ifndef CGAL_ARR_LABELED_TRAITS_2_H
|
#ifndef CGAL_ARR_LABELED_TRAITS_2_H
|
||||||
#define CGAL_ARR_LABELED_TRAITS_2_H
|
#define CGAL_ARR_LABELED_TRAITS_2_H
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
// Efi Fogel <efifogel@gmail.com>
|
// Efi Fogel <efifogel@gmail.com>
|
||||||
|
|
||||||
#ifndef CGAL_POLYGON_DECOMPOSITION_STRATEGY_ADAPTER_H
|
#ifndef CGAL_POLYGON_DECOMPOSITION_STRATEGY_ADAPTER_H
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
|
|
||||||
#ifndef CGAL_EXACT_OFFSET_BASE_H
|
#ifndef CGAL_EXACT_OFFSET_BASE_H
|
||||||
#define CGAL_EXACT_OFFSET_BASE_H
|
#define CGAL_EXACT_OFFSET_BASE_H
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
|
|
||||||
#ifndef CGAL_MINKOWSKI_SUM_LABELS_H
|
#ifndef CGAL_MINKOWSKI_SUM_LABELS_H
|
||||||
#define CGAL_MINKOWSKI_SUM_LABELS_H
|
#define CGAL_MINKOWSKI_SUM_LABELS_H
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
// Efi Fogel <efifogel@gmail.com>
|
// Efi Fogel <efifogel@gmail.com>
|
||||||
|
|
||||||
#ifndef CGAL_MINKOWSKI_SUM_CONV_H
|
#ifndef CGAL_MINKOWSKI_SUM_CONV_H
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
|
|
||||||
#ifndef CGAL_MINKOWSKI_SUM_DECOMP_2_H
|
#ifndef CGAL_MINKOWSKI_SUM_DECOMP_2_H
|
||||||
#define CGAL_MINKOWSKI_SUM_DECOMP_2_H
|
#define CGAL_MINKOWSKI_SUM_DECOMP_2_H
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
|
|
||||||
#ifndef CGAL_OFFSET_CONV_H
|
#ifndef CGAL_OFFSET_CONV_H
|
||||||
#define CGAL_OFFSET_CONV_H
|
#define CGAL_OFFSET_CONV_H
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
|
|
||||||
#ifndef CGAL_OFFSET_DECOMP_H
|
#ifndef CGAL_OFFSET_DECOMP_H
|
||||||
#define CGAL_OFFSET_DECOMP_H
|
#define CGAL_OFFSET_DECOMP_H
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
|
|
||||||
#ifndef CGAL_DECOMPOSITION_STRATEGY_ADAPTER_H
|
#ifndef CGAL_DECOMPOSITION_STRATEGY_ADAPTER_H
|
||||||
#define CGAL_DECOMPOSITION_STRATEGY_ADAPTER_H
|
#define CGAL_DECOMPOSITION_STRATEGY_ADAPTER_H
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
|
|
||||||
#ifndef CGAL_UNION_OF_CURVE_CYCLES_2_H
|
#ifndef CGAL_UNION_OF_CURVE_CYCLES_2_H
|
||||||
#define CGAL_UNION_OF_CURVE_CYCLES_2_H
|
#define CGAL_UNION_OF_CURVE_CYCLES_2_H
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
|
|
||||||
#ifndef CGAL_UNION_OF_CYCLES_2_H
|
#ifndef CGAL_UNION_OF_CYCLES_2_H
|
||||||
#define CGAL_UNION_OF_CYCLES_2_H
|
#define CGAL_UNION_OF_CYCLES_2_H
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
|
|
||||||
#ifndef CGAL_UNION_OF_SEGMENT_CYCLES_2_H
|
#ifndef CGAL_UNION_OF_SEGMENT_CYCLES_2_H
|
||||||
#define CGAL_UNION_OF_SEGMENT_CYCLES_2_H
|
#define CGAL_UNION_OF_SEGMENT_CYCLES_2_H
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
|
|
||||||
#ifndef CGAL_POLYGON_CONVEX_DECOMPOSITION_H
|
#ifndef CGAL_POLYGON_CONVEX_DECOMPOSITION_H
|
||||||
#define CGAL_POLYGON_CONVEX_DECOMPOSITION_H
|
#define CGAL_POLYGON_CONVEX_DECOMPOSITION_H
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,6 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Efi Fogel <efifogel@gmail.com>
|
// Author(s) : Efi Fogel <efifogel@gmail.com>
|
||||||
|
|
||||||
#ifndef CGAL_POLYGON_VERTICAL_DECOMPOSITION_2_H
|
#ifndef CGAL_POLYGON_VERTICAL_DECOMPOSITION_2_H
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
// (based on an old version by Eyal Flato)
|
// (based on an old version by Eyal Flato)
|
||||||
// Efi Fogel <efifogel@gmail.com>
|
// Efi Fogel <efifogel@gmail.com>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
|
|
||||||
#ifndef CGAL_APPROXIMATED_OFFSET_H
|
#ifndef CGAL_APPROXIMATED_OFFSET_H
|
||||||
#define CGAL_APPROXIMATED_OFFSET_H
|
#define CGAL_APPROXIMATED_OFFSET_H
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
// Efi Fogel <efifogel@gmail.com>
|
// Efi Fogel <efifogel@gmail.com>
|
||||||
|
|
||||||
#ifndef CGAL_MINKOWSKI_SUM_2_H
|
#ifndef CGAL_MINKOWSKI_SUM_2_H
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,7 @@
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
// $URL$
|
// Author(s) : Ron Wein <wein_r@yahoo.com>
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
// Author(s) : Ron Wein <wein@post.tau.ac.il>
|
|
||||||
|
|
||||||
#ifndef CGAL_OFFSET_POLYGON_H
|
#ifndef CGAL_OFFSET_POLYGON_H
|
||||||
#define CGAL_OFFSET_POLYGON_H
|
#define CGAL_OFFSET_POLYGON_H
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1 @@
|
||||||
Ron Wein <wein@post.tau.ac.il>
|
|
||||||
Efi Fogel <efif@post.tau.ac.il>
|
Efi Fogel <efif@post.tau.ac.il>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue