Spell check.

This commit is contained in:
Sylvain Pion 2007-04-17 16:19:16 +00:00
parent 77f70e18f9
commit ca2cf8c462
6 changed files with 12 additions and 12 deletions

View File

@ -331,7 +331,7 @@ halfedges and incident skeleton halfedges. That is, the degree of a skeleton ver
The defining contour halfedges and incident halfedges around a vertex can be traced using the circulators provided by the vertex class. The degree of a vertex is not cached and cannot be directly obtained from the vertex, but you can calculate this number by manually counting the number of incident halfedges around the vertex.
Each vertex stores a 2D point and a \ccc{time}, which is the euclidean distance from the vertex's point to the \textit{lines} supporting each of the defining contour edges of the vertex (the distance is the same to each line). Unless the polygon is convex, this distance is not equidistant to the edges, as in the case of a Medial Axis, therefore, the time of a skeleton vertex does not correspond to the distance from the polygon to the vertex (so it cannot be used to obtain the deep of a region in a shape, for instance).\\
If the polygon \textit{is} convex, the straight skeleton is exactly equivalent to the polygon's voronoi diagram and each vertex time is the equidistance to the defining edges.\\
If the polygon \textit{is} convex, the straight skeleton is exactly equivalent to the polygon's Voronoi diagram and each vertex time is the equidistance to the defining edges.\\
Contour vertices have time zero.
\begin{figure}[htbp]
@ -478,8 +478,8 @@ If you use this function to place the outer frame you are guaranteed to obtain a
\section{Straight Skeletons, Medial Axis and Voronoi Diagrams}
The straight skeleton of a polygon is similar to the medial
axis and the voronoi diagram of a polygon in the way it partitions
it; however, unlike the medial axis and voronoi diagram, the
axis and the Voronoi diagram of a polygon in the way it partitions
it; however, unlike the medial axis and Voronoi diagram, the
bisectors are not equidistant to its defining edges but to the
supporting lines of such edges. As a result, Straight Skeleton
bisectors might not be located in the center of the polygon and so
@ -504,7 +504,7 @@ Anther usage, perhaps its very first, is roof design: The straight skeleton of a
Just like medial axes, 2D straight skeletons can also be used for 2D shape description and matching. Essentially, all the applications of image-based skeletonization (for which there is a vast literature) are also direct applications of the straight skeleton, specially since skeleton edges are simply straight line segments.
Consider the subgraph formed only by \textit{inner bisectors} (that is, only the skeleton halfeges which are not incident upon a contour vertex). Call this subgraph a {\em skeleton axis}.
Consider the subgraph formed only by \textit{inner bisectors} (that is, only the skeleton halfedges which are not incident upon a contour vertex). Call this subgraph a {\em skeleton axis}.
Each node in the skeleton axis whose degree is $>=3$ roots more than one skeleton tree. Each skeleton tree roughly corresponds to a region in the input topologically equivalent to a rectangle; that is, without branches. For example, a simple letter "H" would contain 2 higher degree nodes separating the skeleton axis in 5 trees; while the letter "@" would contain just 1 higher degree node separating the skeleton axis in 2 curly trees.
Since a skeleton edge is a 2D straight line, each branch in a skeleton tree is a polyline. Thus, the path-length of the tree can be directly computed. Furthermore, the polyline for a particular tree can be interpolated to obtain curve-related information.

View File

@ -30,7 +30,7 @@ The concept \ccRefName\ describes the requirements for the geometric traits clas
\ccNestedType{FT}{A \ccc{SqrtFieldNumberType} provided by the kernel. This type is used to represent the
coordinates of the input points, of the skeleton nodes and as the event time stored in the skeleton nodes.}{}
\ccGlue
\ccTypedef{boost::tuple<FT,FT> Vertex;}{A pair of (x,y) coordinates representing a 2D cartesian point.}
\ccTypedef{boost::tuple<FT,FT> Vertex;}{A pair of (x,y) coordinates representing a 2D Cartesian point.}
\ccGlue
\ccTypedef{boost::tuple<Vertex,Vertex> Edge;}{A pair of vertices representing an edge}
\ccGlue
@ -84,11 +84,11 @@ If the values cannot be computed, not even approximately (because of overflow fo
\ccNestedType{Construct_ss_vertex_2}
{A construction object type.\\
Must provide \ccc{Vertex operator()( Point_2 const& p)}, which given a \ccc{Point_2} \ccc{p} returns a Vertex encapsulating the corresponding (x,y) pair of \textit{cartesian} coordinates.}
Must provide \ccc{Vertex operator()( Point_2 const& p)}, which given a \ccc{Point_2} \ccc{p} returns a Vertex encapsulating the corresponding (x,y) pair of \textit{Cartesian} coordinates.}
\ccNestedType{Construct_ss_edge_2}
{A construction object type.\\
Must provide \ccc{Edge operator()( Point_2 const& s, Point_2 const& t)}, which given source and target points \ccc{s} and \ccc{t} returns an Edge encapsulating the corresponding input segment (in \textit{cartesian} coordinates.)}
Must provide \ccc{Edge operator()( Point_2 const& s, Point_2 const& t)}, which given source and target points \ccc{s} and \ccc{t} returns an Edge encapsulating the corresponding input segment (in \textit{Cartesian} coordinates.)}
\ccNestedType{Construct_ss_triedge_2}
{A construction object type.\\

View File

@ -67,7 +67,7 @@ with support for storage of the incident halfedge. The \ccRefName\ concept requi
\ccGlue
\ccMethod{Halfedge_around_vertex_const_circulator halfedge_around_vertex_begin() const;}
{Returns a bi-directional circulator pointing to one of the incident halfedges (which one is unspecified).\\
There will always be as many incident halffedges as the degree of the vertex.\\
There will always be as many incident halfedges as the degree of the vertex.\\
If this is a \textit{contour} vertex, its degree is exactly 3, and from the halfedges pointed to by the circulator, 2 are contour and 1 is a bisector.\\
If this is an \ccc{skeleton} vertex, its degree is at least 3 and all of the halfedges pointed to by the circulator are bisectors.\\
Each halfedge pointed to by this circulator is the one which is oriented towards the vertex (according to the geometric embedding).}

View File

@ -74,12 +74,12 @@ From the perspective of a dynamic system of moving edges, such a distance can be
{\em instant} (in time). Therefore, every distinct position along a bisector corresponds to a distinct instant in the offsetting process.\\
As they move inward, edges can expand or contract w.r.t to the endpoints sharing a vertex. If a vertex has an internal angle $<pi$, its incident edges will contract but if its internal angle $>pi$, they will expand. The movement of the edges, along with their extent change, result in collisions between non-adjacent edges. These collisions are called {\em events}, and they occur when the colliding edges have moved a certain distance, that is, at certain \textit{instants}.\\
If non-consecutive edges \ccc{E(j),E(k)} move while edge \ccc{E(i)} contracts, they can collide at the point when \ccc{E(i)} shrinks to nothing (that is, the three edges might meet at a certain offset). This introduces a \textit{topological change} in the polygon: Edges \ccc{E(j),E(k)} are now adjacent, edge \ccc{E(i)} disappears, and a new vertex appears. This topological change is called an {\em edge event}.\\
Similarly, consecutive expanding edges \ccc{E(i),E(i+1)} sharing a reflex vertex (internal angle $>=pi$) might collide with any edge \ccc{E(j)} on the rest of the same connected component of the polygon boundary (even far away from the initial edge's position). This also introduces a topological change: \ccc{E(j)} gets split in two edges and the connected component having \ccc{E(i),E(i+1) and E(j)} is split in two unconnected parts: one having \ccc{E(i)} and the corresponding subsegment of \ccc{E(j)} and the other with \ccc{E(i+1)} and the rest of \ccc{E(j)}. This is called a {\em split event}.\\ If a reflex vertex hits not an edge \ccc{E(j)} but another reflex vertex \ccc{E(j),E(j+1)}, and viceversa (the reflex vertex V(j) hits V(i)), there is no actual split and the two unconnected parts have \ccc{E(i),E(j)} and \ccc{E(i+1),E(j+1)} (or \ccc{E(i),E(j+1)} and \ccc{E(i+1),E(j)}). This topological change is called a {\em vertex event}. Although similar to a split event in the sense that two new unconnected contours emerge introducing two new contour vertices, in the case of a vertex event one of the new contour vertices might be reflex; that is, a vertex event \textit{may} result in one of the offset polygons having a \textit{reflex} contour vertex which was not in the original polygon.
Similarly, consecutive expanding edges \ccc{E(i),E(i+1)} sharing a reflex vertex (internal angle $>=pi$) might collide with any edge \ccc{E(j)} on the rest of the same connected component of the polygon boundary (even far away from the initial edge's position). This also introduces a topological change: \ccc{E(j)} gets split in two edges and the connected component having \ccc{E(i),E(i+1) and E(j)} is split in two unconnected parts: one having \ccc{E(i)} and the corresponding subsegment of \ccc{E(j)} and the other with \ccc{E(i+1)} and the rest of \ccc{E(j)}. This is called a {\em split event}.\\ If a reflex vertex hits not an edge \ccc{E(j)} but another reflex vertex \ccc{E(j),E(j+1)}, and vice-versa (the reflex vertex V(j) hits V(i)), there is no actual split and the two unconnected parts have \ccc{E(i),E(j)} and \ccc{E(i+1),E(j+1)} (or \ccc{E(i),E(j+1)} and \ccc{E(i+1),E(j)}). This topological change is called a {\em vertex event}. Although similar to a split event in the sense that two new unconnected contours emerge introducing two new contour vertices, in the case of a vertex event one of the new contour vertices might be reflex; that is, a vertex event \textit{may} result in one of the offset polygons having a \textit{reflex} contour vertex which was not in the original polygon.
Edges movement is described by vertices movement, and these by bisectors. Therefore, the collision between edges \ccc{E(j),E(i),E(k)} (all in the same connected component) occurs when the moving vertices \ccc{E(j)->E(i)} and \ccc{E(i)->E(k)} meet ; that is, when the two bisectors describing the moving vertices
{\em intersect} (Note: as the edges move inward and events occur, a vertex between edges A and B might exist even if A and B are not consecutive; that is, j and k are not necessarily i-1 and i+1 respectively, although initially they are).\\
Similarly, the collision between \ccc{E(i),E(i+1)} with \ccc{E(j)} (all in the same connected component) occurs when the bisector corresponding to the moving vertex \ccc{E(i)->E(i+1)} hits the moving edge \ccc{E(j)}.\\
Since each event changes the topology of the moving polygon, it is not possible or practical to forsee all events at once. Rather, the algorithm starts by estimating an initial set of potential events and from there it computes one next event at a time based on the previous one. The chaining of events is governed by their relative instants: events that occur first are processed first.\\
Since each event changes the topology of the moving polygon, it is not possible or practical to foresee all events at once. Rather, the algorithm starts by estimating an initial set of potential events and from there it computes one next event at a time based on the previous one. The chaining of events is governed by their relative instants: events that occur first are processed first.\\
An initial set of \textit{potential} split events is first computed independently (the computation of a potential split event is based solely on a reflex vertex and all other edges in the same connected component); and an initial set of \textit{potential} edge events between initially consecutive bisectors is first computed independently (based solely on each bisector pair under consideration).\\
Events occur at certain instants and the algorithm must be able to order them
accordingly. The correctness of the algorithm is uniquely and directly governed by the correct computation and ordering of the events. Any potential event might no longer be applicable after the topological change introduced by a prior event.\\

View File

@ -27,7 +27,7 @@ The class \ccRefName\ provides a model for the
\ccc{StraightSkeletonBuilderTraits_2} concept which is the traits class
required by the \ccc{Straight_skeleton_builder_2} algorithm class. The class
\ccRefName\ has one template argument: a 2D CGAL Kernel. This parameter must be a model for the \ccc{Kernel} concept, such as the \ccc{Exact_predicates_inexact_constructions_kernel}, which is the recommended one.\\
It is unspecified which subset of the kernel is usedd into the output sequence and the returned iterator will be equal to \ccc{out}.
It is unspecified which subset of the kernel is used into the output sequence and the returned iterator will be equal to \ccc{out}.
For any given input polygon, it in this traits class (and by extension in the builder class). This is to avoid restricting the choices in the implementation.

View File

@ -50,7 +50,7 @@
\ccDefinition
The class \ccClassTemplateName\ represents a halfedge of the straight skeleton.
A straight skeleton contains two kinds of halfedges: borders and bisectors. Border halfedges correspond to the edges of the innput polygon while Bisector halfedges correspond to the straight-line segments that make the skeleton itself.
A straight skeleton contains two kinds of halfedges: borders and bisectors. Border halfedges correspond to the edges of the input polygon while Bisector halfedges correspond to the straight-line segments that make the skeleton itself.
Each face of the straight skeleton contains exactly 1 border halfedge and 2 or more bisector halfedges.
\ccInheritsFrom