Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
4ce4631d
Commit
4ce4631d
authored
Dec 08, 2007
by
raburton
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
set eol-style and mime-type properties for new polygon related files
parent
dab0fd9e
Changes
12
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
1657 additions
and
1657 deletions
+1657
-1657
GenericPolygonClipperLibrary.cpp
polygon/GenericPolygonClipperLibrary.cpp
+1
-1
GenericPolygonClipperLibraryVERSIONS.TXT
polygon/GenericPolygonClipperLibraryVERSIONS.TXT
+123
-123
defs-macros.h
polygon/defs-macros.h
+32
-32
links.txt
polygon/links.txt
+17
-17
makefile.g95
polygon/makefile.g95
+18
-18
makefile.gtk
polygon/makefile.gtk
+37
-37
makefile.include
polygon/makefile.include
+16
-16
makefile.macosx
polygon/makefile.macosx
+26
-26
php_polygon.cpp
polygon/php_polygon.cpp
+1101
-1101
php_polygon.h
polygon/php_polygon.h
+61
-61
php_polygon_vertex.cpp
polygon/php_polygon_vertex.cpp
+144
-144
php_polygon_vertex.h
polygon/php_polygon_vertex.h
+81
-81
No files found.
polygon/GenericPolygonClipperLibrary.cpp
View file @
4ce4631d
...
...
@@ -1741,7 +1741,7 @@ void gpc_polygon_clip(gpc_op op, gpc_polygon *subj, gpc_polygon *clip,
npoly
=
poly
->
next
;
FREE
(
poly
);
}
}
}
/* Tidy up */
reset_it
(
&
it
);
...
...
polygon/GenericPolygonClipperLibraryVERSIONS.TXT
View file @
4ce4631d
Generic Polygon Clipper (gpc) Revision History
==============================================
v2.32 17th Dec 2004
---------------------
Fixed occasional memory leak occurring when processing some
degenerate polygon arrangements.
Added explicit type casting to memory allocator in support of
increased code portability.
v2.31 4th Jun 1999
---------------------
Separated edge merging measure based on a user-defined GPC_EPSILON
value from general numeric equality testing and ordering, which now
uses direct arithmetic comparison rather an EPSILON based proximity
test.
Fixed problem with numerical equality test during construction of
local minima and scanbeam tables, leading to occasional crash.
Fixed hole array memory leak in gpc_add_contour.
Fixed uninitialised hole field bug in gpc_polygon_clip result.
v2.30 11th Apr 1999
---------------------
Major re-write.
Minor API change: additional 'hole' array field added to gpc_polygon
datatype to indicate which constituent contours are internal holes,
and which form external boundaries.
Minor API change: additional 'hole' argument to gpc_add_contour
to indicate whether the new contour is a hole or external contour.
Minor API change: additional parameter to gpc_read_polygon and
gpc_write_polygon to indicate whether or not to read or write
contour hole flags.
Fixed NULL pointer bug in add/merge left/right operations.
Fixed numerical problem in intersection table generation.
Fixed zero byte malloc problem.
Fixed problem producing occasional 2 vertex contours.
Added bounding box test optimisations.
Simplified edge bundle creation, detection of scanbeam internal
edge intersections and tristrip scanbeam boundary code.
Renamed 'class' variable to be C++ friendly.
v2.22 17th Oct 1998
---------------------
Re-implemented edge interpolation and intersection calculations
to improve numerical robustness.
Simplified setting of GPC_EPSILON.
v2.21 19th Aug 1998
---------------------
Fixed problem causing occasional incorrect output when processing
self-intersecting polygons (bow-ties etc).
Removed bug which may lead to non-generation of uppermost triangle
in tristrip output.
v2.20 26th May 1998
---------------------
Major re-write.
Added exclusive-or polygon set operation.
Replaced table-based processing of edge intersections with
rule-based system.
Replaced two-pass approach to scanbeam interior processing with
single pass method.
v2.10a 14th May 1998
---------------------
Minor bug-fixes to counter some v2.10 reliability problems.
v2.10 11th May 1998
---------------------
Major re-write.
Incorporated edge bundle processing of AET to overcome coincident
edge problems present in previous releases.
Replaced Vatti's method for processing scanbeam interior regions
with an adapted version of the scanbeam boundary processing
algorithm.
v2.02 16th Apr 1998 (unreleased)
----------------------------------
Fixed internal minimum vertex duplication in gpc_polygon_clip
result.
Improved line intersection code discourage superfluous
intersections near line ends.
Removed limited precision number formatting in gpc_write_polygon.
Modification to allow subject or clip polygon to be reused as the
result in gpc_polygon_clip without memory leakage.
v2.01 23rd Feb 1998
---------------------
Removed bug causing duplicated vertices in output polygon.
Fixed scanbeam table index overrun problem.
v2.00 25th Nov 1997
---------------------
Major re-write.
Replaced temporary horizontal edge work-around (using tilting)
with true horizontal edge handling.
Trapezoidal output replaced by tristrips.
gpc_op constants now feature a `GPC_' prefix.
Data structures now passed by reference to gpc functions.
Replaced AET search by proxy addressing in polygon table.
Eliminated most (all?) coincident vertex / edge crashes.
v1.02 18th Oct 1997 (unreleased)
----------------------------------
Significantly reduced number of mallocs in build_lmt.
Scanbeam table now built using heapsort rather than insertion
sort.
v1.01 12th Oct 1997
---------------------
Fixed memory leak during output polygon build in
gpc_clip_polygon.
Removed superfluous logfile debug code.
Commented out malloc counts.
Added missing horizontal edge tilt-correction code in
gpc_clip_polygon.
v1.00 8th Oct 1997
--------------------
First release.
Generic Polygon Clipper (gpc) Revision History
==============================================
v2.32 17th Dec 2004
---------------------
Fixed occasional memory leak occurring when processing some
degenerate polygon arrangements.
Added explicit type casting to memory allocator in support of
increased code portability.
v2.31 4th Jun 1999
---------------------
Separated edge merging measure based on a user-defined GPC_EPSILON
value from general numeric equality testing and ordering, which now
uses direct arithmetic comparison rather an EPSILON based proximity
test.
Fixed problem with numerical equality test during construction of
local minima and scanbeam tables, leading to occasional crash.
Fixed hole array memory leak in gpc_add_contour.
Fixed uninitialised hole field bug in gpc_polygon_clip result.
v2.30 11th Apr 1999
---------------------
Major re-write.
Minor API change: additional 'hole' array field added to gpc_polygon
datatype to indicate which constituent contours are internal holes,
and which form external boundaries.
Minor API change: additional 'hole' argument to gpc_add_contour
to indicate whether the new contour is a hole or external contour.
Minor API change: additional parameter to gpc_read_polygon and
gpc_write_polygon to indicate whether or not to read or write
contour hole flags.
Fixed NULL pointer bug in add/merge left/right operations.
Fixed numerical problem in intersection table generation.
Fixed zero byte malloc problem.
Fixed problem producing occasional 2 vertex contours.
Added bounding box test optimisations.
Simplified edge bundle creation, detection of scanbeam internal
edge intersections and tristrip scanbeam boundary code.
Renamed 'class' variable to be C++ friendly.
v2.22 17th Oct 1998
---------------------
Re-implemented edge interpolation and intersection calculations
to improve numerical robustness.
Simplified setting of GPC_EPSILON.
v2.21 19th Aug 1998
---------------------
Fixed problem causing occasional incorrect output when processing
self-intersecting polygons (bow-ties etc).
Removed bug which may lead to non-generation of uppermost triangle
in tristrip output.
v2.20 26th May 1998
---------------------
Major re-write.
Added exclusive-or polygon set operation.
Replaced table-based processing of edge intersections with
rule-based system.
Replaced two-pass approach to scanbeam interior processing with
single pass method.
v2.10a 14th May 1998
---------------------
Minor bug-fixes to counter some v2.10 reliability problems.
v2.10 11th May 1998
---------------------
Major re-write.
Incorporated edge bundle processing of AET to overcome coincident
edge problems present in previous releases.
Replaced Vatti's method for processing scanbeam interior regions
with an adapted version of the scanbeam boundary processing
algorithm.
v2.02 16th Apr 1998 (unreleased)
----------------------------------
Fixed internal minimum vertex duplication in gpc_polygon_clip
result.
Improved line intersection code discourage superfluous
intersections near line ends.
Removed limited precision number formatting in gpc_write_polygon.
Modification to allow subject or clip polygon to be reused as the
result in gpc_polygon_clip without memory leakage.
v2.01 23rd Feb 1998
---------------------
Removed bug causing duplicated vertices in output polygon.
Fixed scanbeam table index overrun problem.
v2.00 25th Nov 1997
---------------------
Major re-write.
Replaced temporary horizontal edge work-around (using tilting)
with true horizontal edge handling.
Trapezoidal output replaced by tristrips.
gpc_op constants now feature a `GPC_' prefix.
Data structures now passed by reference to gpc functions.
Replaced AET search by proxy addressing in polygon table.
Eliminated most (all?) coincident vertex / edge crashes.
v1.02 18th Oct 1997 (unreleased)
----------------------------------
Significantly reduced number of mallocs in build_lmt.
Scanbeam table now built using heapsort rather than insertion
sort.
v1.01 12th Oct 1997
---------------------
Fixed memory leak during output polygon build in
gpc_clip_polygon.
Removed superfluous logfile debug code.
Commented out malloc counts.
Added missing horizontal edge tilt-correction code in
gpc_clip_polygon.
v1.00 8th Oct 1997
--------------------
First release.
polygon/defs-macros.h
View file @
4ce4631d
/**********************/
/* Some usual defines */
/**********************/
#ifndef DEFS_MACROS_H
#define DEFS_MACROS_H
#ifndef BOOL
#define BOOL bool
#endif
#ifndef FALSE
#define FALSE false
#endif
#ifndef TRUE
#define TRUE true
#endif
#ifndef NULL
#define NULL 0
#endif
#ifndef abs
#define abs(x) (((x) >=0) ? (x) : (-(x)))
#endif
#define TRACE printf
#define ASSERT(x) // todo : change to DEBUG, under wxWidgets
#endif // ifndef DEFS_MACROS_H
/**********************/
/* Some usual defines */
/**********************/
#ifndef DEFS_MACROS_H
#define DEFS_MACROS_H
#ifndef BOOL
#define BOOL bool
#endif
#ifndef FALSE
#define FALSE false
#endif
#ifndef TRUE
#define TRUE true
#endif
#ifndef NULL
#define NULL 0
#endif
#ifndef abs
#define abs(x) (((x) >=0) ? (x) : (-(x)))
#endif
#define TRACE printf
#define ASSERT(x) // todo : change to DEBUG, under wxWidgets
#endif // ifndef DEFS_MACROS_H
polygon/links.txt
View file @
4ce4631d
links to software relative to polygons (clipping and and other operations)
used in freePCB (Written by Alan Wright)
gpc (here: GenericPolygonClipperLibrary.cpp)
http://www.cs.man.ac.uk/~toby/alan/software/gpc.html
polygon.php (ported in "C++" by Alan Wright)
the c++ corresponding file is php_polygon.cpp
http://www.phpclasses.org/browse/file/10683.html
used in gpcb:
polygon1.c:
http://www.koders.com/c/
and for this file:
http://www.koders.com/c/fidE26CF2236C2DF7E435D597390A05B982EDFB4C38.aspx
gpcb uses a modified file (integer coordinates)
links to software relative to polygons (clipping and and other operations)
used in freePCB (Written by Alan Wright)
gpc (here: GenericPolygonClipperLibrary.cpp)
http://www.cs.man.ac.uk/~toby/alan/software/gpc.html
polygon.php (ported in "C++" by Alan Wright)
the c++ corresponding file is php_polygon.cpp
http://www.phpclasses.org/browse/file/10683.html
used in gpcb:
polygon1.c:
http://www.koders.com/c/
and for this file:
http://www.koders.com/c/fidE26CF2236C2DF7E435D597390A05B982EDFB4C38.aspx
gpcb uses a modified file (integer coordinates)
polygon/makefile.g95
View file @
4ce4631d
WXDIR
=
$(WXWIN)
TARGET
=
lib_polygon.a
all
:
$(TARGET)
include
../libs.win
include
makefile.include
$(TARGET)
:
$(OBJECTS) ../libs.win makefile.include
ar ruv
$@
$(OBJECTS)
ranlib
$@
clean
:
rm
-f
*
.bak
rm
-f
*
.o
rm
-f
$(TARGET)
WXDIR
=
$(WXWIN)
TARGET
=
lib_polygon.a
all
:
$(TARGET)
include
../libs.win
include
makefile.include
$(TARGET)
:
$(OBJECTS) ../libs.win makefile.include
ar ruv
$@
$(OBJECTS)
ranlib
$@
clean
:
rm
-f
*
.bak
rm
-f
*
.o
rm
-f
$(TARGET)
polygon/makefile.gtk
View file @
4ce4631d
## Makefile for common.a
CC
=
gcc
include
../libs.linux
# Compiler flags.
CPPFLAGS
+=
-I
./
-I
../include
EDACPPFLAGS
=
$(CPPFLAGS)
TARGET
=
lib_polygon.a
all
:
$(TARGET)
deps
:
$(CXX)
$(CPPFLAGS)
-E
-MMD
-MG
*
.cpp
>
/dev/null
include
makefile.include
-include
*.d
CPPFLAGS
+=
$(EXTRACPPFLAGS)
-fno-strict-aliasing
EDACPPFLAGS
=
$(CPPFLAGS)
$(TARGET)
:
$(OBJECTS) makefile.gtk makefile.include
rm
-f
$@
ar
-rv
$@
$(OBJECTS)
ranlib
$@
install
:
$(TARGET)
clean
:
rm
-f
*
.o
*
~ core
*
.bak
*
.obj
*
.d
rm
-f
$(TARGET)
## Makefile for common.a
CC
=
gcc
include
../libs.linux
# Compiler flags.
CPPFLAGS
+=
-I
./
-I
../include
EDACPPFLAGS
=
$(CPPFLAGS)
TARGET
=
lib_polygon.a
all
:
$(TARGET)
deps
:
$(CXX)
$(CPPFLAGS)
-E
-MMD
-MG
*
.cpp
>
/dev/null
include
makefile.include
-include
*.d
CPPFLAGS
+=
$(EXTRACPPFLAGS)
-fno-strict-aliasing
EDACPPFLAGS
=
$(CPPFLAGS)
$(TARGET)
:
$(OBJECTS) makefile.gtk makefile.include
rm
-f
$@
ar
-rv
$@
$(OBJECTS)
ranlib
$@
install
:
$(TARGET)
clean
:
rm
-f
*
.o
*
~ core
*
.bak
*
.obj
*
.d
rm
-f
$(TARGET)
polygon/makefile.include
View file @
4ce4631d
EXTRACPPFLAGS
+=
-I
$(SYSINCLUDE)
-I
./
-Ibitmaps
-I
../include
COMMON
=
OBJECTS
=
\
GenericPolygonClipperLibrary.o
\
php_polygon.o\
php_polygon_vertex.o
GenericPolygonClipperLibrary.o
:
GenericPolygonClipperLibrary.cpp GenericPolygonClipperLibrary.h
php_polygon.o
:
php_polygon.cpp php_polygon.h php_polygon_vertex.h defs-macros.h
#polygon1.o: polygon1.cpp polyarea.h vectmatr.h
EXTRACPPFLAGS
+=
-I
$(SYSINCLUDE)
-I
./
-Ibitmaps
-I
../include
COMMON
=
OBJECTS
=
\
GenericPolygonClipperLibrary.o
\
php_polygon.o
\
php_polygon_vertex.o
GenericPolygonClipperLibrary.o
:
GenericPolygonClipperLibrary.cpp GenericPolygonClipperLibrary.h
php_polygon.o
:
php_polygon.cpp php_polygon.h php_polygon_vertex.h defs-macros.h
#polygon1.o: polygon1.cpp polyarea.h vectmatr.h
polygon/makefile.macosx
View file @
4ce4631d
## Makefile for common.a
include
../libs.macosx
TARGET
=
lib_polygon.a
all
:
$(TARGET)
deps
:
$(CXX)
$(CPPFLAGS)
-E
-MMD
-MG
*
.cpp
>
/dev/null
include
makefile.include
-include
*.d
CPPFLAGS
+=
$(EXTRACPPFLAGS)
EDACPPFLAGS
=
$(CPPFLAGS)
$(TARGET)
:
$(OBJECTS) makefile.macosx makefile.include
rm
-f
$@
ar
-rv
$@
$(OBJECTS)
ranlib
$@
clean
:
rm
-f
*
.o
;
rm
-f
*
~
rm
-f
$(TARGET)
## Makefile for common.a
include
../libs.macosx
TARGET
=
lib_polygon.a
all
:
$(TARGET)
deps
:
$(CXX)
$(CPPFLAGS)
-E
-MMD
-MG
*
.cpp
>
/dev/null
include
makefile.include
-include
*.d
CPPFLAGS
+=
$(EXTRACPPFLAGS)
EDACPPFLAGS
=
$(CPPFLAGS)
$(TARGET)
:
$(OBJECTS) makefile.macosx makefile.include
rm
-f
$@
ar
-rv
$@
$(OBJECTS)
ranlib
$@
clean
:
rm
-f
*
.o
;
rm
-f
*
~
rm
-f
$(TARGET)
polygon/php_polygon.cpp
View file @
4ce4631d
This diff is collapsed.
Click to expand it.
polygon/php_polygon.h
View file @
4ce4631d
// file php_polygon.h
// See comments in php_polygon.cpp
#ifndef PHP_POLYGON_H
#define PHP_POLYGON_H
class
vertex
;
class
segment
;
#define infinity 100000000 // for places that are far far away
#define PI 3.14159265359
enum
{
A_OR_B
,
A_AND_B
,
A_MINUS_B
,
B_MINUS_A
};
class
polygon
{
public
:
/*------------------------------------------------------------------------------
** This class manages a doubly linked list of vertex objects that represents
** a polygon. The class consists of basic methods to manage the list
** and methods to implement boolean operations between polygon objects.
*/
vertex
*
m_first
;
// Reference to first vertex in the linked list
int
m_cnt
;
// Tracks number of vertices in the polygon
polygon
(
vertex
*
first
=
NULL
);
~
polygon
();
vertex
*
getFirst
();
polygon
*
NextPoly
();
void
add
(
vertex
*
nv
);
void
addv
(
double
x
,
double
y
,
double
xc
=
0
,
double
yc
=
0
,
int
d
=
0
);
vertex
*
del
(
vertex
*
v
);
void
res
();
polygon
*
copy_poly
();
void
insertSort
(
vertex
*
nv
,
vertex
*
s
,
vertex
*
e
);
vertex
*
nxt
(
vertex
*
v
);
BOOL
unckd_remain
();
vertex
*
first_unckd_intersect
();
double
dist
(
double
x1
,
double
y1
,
double
x2
,
double
y2
);
double
angle
(
double
xc
,
double
yc
,
double
x1
,
double
y1
);
double
aAlpha
(
double
x1
,
double
y1
,
double
x2
,
double
y2
,
double
xc
,
double
yc
,
double
xi
,
double
yi
,
double
d
);
void
perturb
(
vertex
*
p1
,
vertex
*
p2
,
vertex
*
q1
,
vertex
*
q2
,
double
aP
,
double
aQ
);
BOOL
ints
(
vertex
*
p1
,
vertex
*
p2
,
vertex
*
q1
,
vertex
*
q2
,
int
*
n
,
double
ix
[],
double
iy
[],
double
alphaP
[],
double
alphaQ
[]
);
BOOL
isInside
(
vertex
*
v
);
polygon
*
boolean
(
polygon
*
polyB
,
int
oper
);
#if 0
function isPolyInside (p);
function move (dx, dy);
function rotate (xr, yr, a);
function &bRect ();
#endif
};
//end of class polygon
#endif // ifndef PHP_POLYGON_H
// file php_polygon.h
// See comments in php_polygon.cpp
#ifndef PHP_POLYGON_H
#define PHP_POLYGON_H
class
vertex
;
class
segment
;
#define infinity 100000000 // for places that are far far away
#define PI 3.14159265359
enum
{
A_OR_B
,
A_AND_B
,
A_MINUS_B
,
B_MINUS_A
};
class
polygon
{
public
:
/*------------------------------------------------------------------------------
** This class manages a doubly linked list of vertex objects that represents
** a polygon. The class consists of basic methods to manage the list
** and methods to implement boolean operations between polygon objects.
*/
vertex
*
m_first
;
// Reference to first vertex in the linked list
int
m_cnt
;
// Tracks number of vertices in the polygon
polygon
(
vertex
*
first
=
NULL
);
~
polygon
();
vertex
*
getFirst
();
polygon
*
NextPoly
();
void
add
(
vertex
*
nv
);
void
addv
(
double
x
,
double
y
,
double
xc
=
0
,
double
yc
=
0
,
int
d
=
0
);
vertex
*
del
(
vertex
*
v
);
void
res
();
polygon
*
copy_poly
();
void
insertSort
(
vertex
*
nv
,
vertex
*
s
,
vertex
*
e
);
vertex
*
nxt
(
vertex
*
v
);
BOOL
unckd_remain
();
vertex
*
first_unckd_intersect
();
double
dist
(
double
x1
,
double
y1
,
double
x2
,
double
y2
);
double
angle
(
double
xc
,
double
yc
,
double
x1
,
double
y1
);
double
aAlpha
(
double
x1
,
double
y1
,
double
x2
,
double
y2
,
double
xc
,
double
yc
,
double
xi
,
double
yi
,
double
d
);
void
perturb
(
vertex
*
p1
,
vertex
*
p2
,
vertex
*
q1
,
vertex
*
q2
,
double
aP
,
double
aQ
);
BOOL
ints
(
vertex
*
p1
,
vertex
*
p2
,
vertex
*
q1
,
vertex
*
q2
,
int
*
n
,
double
ix
[],
double
iy
[],
double
alphaP
[],
double
alphaQ
[]
);
BOOL
isInside
(
vertex
*
v
);
polygon
*
boolean
(
polygon
*
polyB
,
int
oper
);
#if 0
function isPolyInside (p);
function move (dx, dy);
function rotate (xr, yr, a);
function &bRect ();
#endif
};
//end of class polygon
#endif // ifndef PHP_POLYGON_H
polygon/php_polygon_vertex.cpp
View file @
4ce4631d
// file php_polygon_vertex.cpp
// This is a port of a php class written by Brenor Brophy (see below)
/*------------------------------------------------------------------------------
** File: vertex.php
** Description: PHP class for a polygon vertex. Used as the base object to
** build a class of polygons.
** Version: 1.1
** Author: Brenor Brophy
** Email: brenor at sbcglobal dot net
** Homepage: www.brenorbrophy.com
**------------------------------------------------------------------------------
** COPYRIGHT (c) 2005 BRENOR BROPHY
**
** The source code included in this package is free software; you can
** redistribute it and/or modify it under the terms of the GNU General Public
** License as published by the Free Software Foundation. This license can be
** read at:
**
** http://www.opensource.org/licenses/gpl-license.php
**
** This program is distributed in the hope that it will be useful, but WITHOUT
** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
**------------------------------------------------------------------------------
**
** Based on the paper "Efficient Clipping of Arbitary Polygons" by Gunther
** Greiner (greiner at informatik dot uni-erlangen dot de) and Kai Hormann
** (hormann at informatik dot tu-clausthal dot de), ACM Transactions on Graphics
** 1998;17(2):71-83.
**
** Available at: www.in.tu-clausthal.de/~hormann/papers/clipping.pdf
**
** Another useful site describing the algorithm and with some example
** C code by Ionel Daniel Stroe is at:
**
** http://davis.wpi.edu/~matt/courses/clipping/
**
** The algorithm is extended by Brenor Brophy to allow polygons with
** arcs between vertices.
**
** Rev History
** -----------------------------------------------------------------------------
** 1.0 08/25/2005 Initial Release
** 1.1 09/04/2005 Added software license language to header comments
*/
//#include "stdafx.h"
#include <math.h>
#include "php_polygon_vertex.h"
segment
::
segment
(
double
xc
,
double
yc
,
int
d
)
{
m_xc
=
xc
;
m_yc
=
yc
;
m_d
=
d
;
}
vertex
::
vertex
(
double
x
,
double
y
,
double
xc
,
double
yc
,
double
d
,
vertex
*
nextV
,
vertex
*
prevV
,
polygon
*
nextPoly
,
BOOL
intersect
,
vertex
*
neighbor
,
double
alpha
,
BOOL
entry
,
BOOL
checked
)
{
m_x
=
x
;
m_y
=
y
;
m_nextV
=
nextV
;
m_prevV
=
prevV
;
m_nextPoly
=
nextPoly
;
m_intersect
=
intersect
;
m_neighbor
=
neighbor
;
m_alpha
=
alpha
;
m_entry
=
entry
;
m_checked
=
checked
;
m_id
=
0
;
m_nSeg
=
new
segment
(
xc
,
yc
,
d
);
m_pSeg
=
NULL
;
}
vertex
::~
vertex
()
{
if
(
m_nSeg
)
delete
m_nSeg
;
}
double
vertex
::
Xc
(
BOOL
g
)
{
if
(
isIntersect
()
)
{
if
(
m_neighbor
->
isEntry
()
)
return
m_neighbor
->
m_nSeg
->
Xc
();
else
return
m_neighbor
->
m_pSeg
->
Xc
();
}
else
if
(
g
)
return
m_nSeg
->
Xc
();
else
return
m_pSeg
->
Xc
();
}
double
vertex
::
Yc
(
BOOL
g
)
{
if
(
isIntersect
()
)
{
if
(
m_neighbor
->
isEntry
()
)
return
m_neighbor
->
m_nSeg
->
Yc
();
else
return
m_neighbor
->
m_pSeg
->
Yc
();
}
else
if
(
g
)
return
m_nSeg
->
Yc
();
else
return
m_pSeg
->
Yc
();
}
double
vertex
::
d
(
BOOL
g
)
{
if
(
isIntersect
()
)
{
if
(
m_neighbor
->
isEntry
()
)
return
m_neighbor
->
m_nSeg
->
d
();
else
return
(
-
1
*
m_neighbor
->
m_pSeg
->
d
());
}
else
if
(
g
)
return
m_nSeg
->
d
();
else
return
(
-
1
*
m_pSeg
->
d
());
}
void
vertex
::
setChecked
(
BOOL
check
)
{
m_checked
=
check
;
if
(
m_neighbor
)
if
(
!
m_neighbor
->
isChecked
()
)
m_neighbor
->
setChecked
();
}
// file php_polygon_vertex.cpp
// This is a port of a php class written by Brenor Brophy (see below)
/*------------------------------------------------------------------------------
** File: vertex.php
** Description: PHP class for a polygon vertex. Used as the base object to
** build a class of polygons.
** Version: 1.1
** Author: Brenor Brophy
** Email: brenor at sbcglobal dot net
** Homepage: www.brenorbrophy.com
**------------------------------------------------------------------------------
** COPYRIGHT (c) 2005 BRENOR BROPHY
**
** The source code included in this package is free software; you can
** redistribute it and/or modify it under the terms of the GNU General Public
** License as published by the Free Software Foundation. This license can be
** read at:
**
** http://www.opensource.org/licenses/gpl-license.php
**
** This program is distributed in the hope that it will be useful, but WITHOUT
** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
**------------------------------------------------------------------------------
**
** Based on the paper "Efficient Clipping of Arbitary Polygons" by Gunther
** Greiner (greiner at informatik dot uni-erlangen dot de) and Kai Hormann
** (hormann at informatik dot tu-clausthal dot de), ACM Transactions on Graphics
** 1998;17(2):71-83.
**
** Available at: www.in.tu-clausthal.de/~hormann/papers/clipping.pdf
**
** Another useful site describing the algorithm and with some example
** C code by Ionel Daniel Stroe is at:
**
** http://davis.wpi.edu/~matt/courses/clipping/
**
** The algorithm is extended by Brenor Brophy to allow polygons with
** arcs between vertices.
**
** Rev History
** -----------------------------------------------------------------------------
** 1.0 08/25/2005 Initial Release
** 1.1 09/04/2005 Added software license language to header comments
*/
//#include "stdafx.h"
#include <math.h>
#include "php_polygon_vertex.h"
segment
::
segment
(
double
xc
,
double
yc
,
int
d
)
{
m_xc
=
xc
;
m_yc
=
yc
;
m_d
=
d
;
}
vertex
::
vertex
(
double
x
,
double
y
,
double
xc
,
double
yc
,
double
d
,
vertex
*
nextV
,
vertex
*
prevV
,
polygon
*
nextPoly
,
BOOL
intersect
,
vertex
*
neighbor
,
double
alpha
,
BOOL
entry
,
BOOL
checked
)
{
m_x
=
x
;
m_y
=
y
;
m_nextV
=
nextV
;
m_prevV
=
prevV
;
m_nextPoly
=
nextPoly
;
m_intersect
=
intersect
;
m_neighbor
=
neighbor
;
m_alpha
=
alpha
;
m_entry
=
entry
;
m_checked
=
checked
;
m_id
=
0
;
m_nSeg
=
new
segment
(
xc
,
yc
,
d
);
m_pSeg
=
NULL
;
}
vertex
::~
vertex
()
{
if
(
m_nSeg
)
delete
m_nSeg
;
}
double
vertex
::
Xc
(
BOOL
g
)
{
if
(
isIntersect
()
)
{
if
(
m_neighbor
->
isEntry
()
)
return
m_neighbor
->
m_nSeg
->
Xc
();
else
return
m_neighbor
->
m_pSeg
->
Xc
();
}
else
if
(
g
)
return
m_nSeg
->
Xc
();
else
return
m_pSeg
->
Xc
();
}
double
vertex
::
Yc
(
BOOL
g
)
{
if
(
isIntersect
()
)
{
if
(
m_neighbor
->
isEntry
()
)
return
m_neighbor
->
m_nSeg
->
Yc
();
else
return
m_neighbor
->
m_pSeg
->
Yc
();
}
else
if
(
g
)
return
m_nSeg
->
Yc
();
else
return
m_pSeg
->
Yc
();
}
double
vertex
::
d
(
BOOL
g
)
{
if
(
isIntersect
()
)
{
if
(
m_neighbor
->
isEntry
()
)
return
m_neighbor
->
m_nSeg
->
d
();
else
return
(
-
1
*
m_neighbor
->
m_pSeg
->
d
());
}
else
if
(
g
)
return
m_nSeg
->
d
();
else
return
(
-
1
*
m_pSeg
->
d
());
}
void
vertex
::
setChecked
(
BOOL
check
)
{
m_checked
=
check
;
if
(
m_neighbor
)
if
(
!
m_neighbor
->
isChecked
()
)
m_neighbor
->
setChecked
();
}
polygon/php_polygon_vertex.h
View file @
4ce4631d
// file php_polygon_vertex.h
// See comments in file php_polygon_vertex.cpp
#ifndef PHP_POLYGON_VERTEX_H
#define PHP_POLYGON_VERTEX_H
#include "defs-macros.h"
class
vertex
;
class
polygon
;
class
segment
{
public
:
segment
(
double
xc
=
0
.
0
,
double
yc
=
0
.
0
,
int
d
=
0
);
double
Xc
(){
return
m_xc
;
};
double
Yc
(){
return
m_yc
;
};
int
d
(){
return
m_d
;
};
void
setXc
(
double
xc
){
m_xc
=
xc
;
};
void
setYc
(
double
yc
){
m_yc
=
yc
;
};
double
m_xc
,
m_yc
;
// center of arc
int
m_d
;
// direction (-1=CW, 0=LINE, 1=CCW)
};
class
vertex
{
public
:
vertex
(
double
x
,
double
y
,
double
xc
=
0
.
0
,
double
yc
=
0
.
0
,
double
d
=
0
.
0
,
vertex
*
nextV
=
NULL
,
vertex
*
prevV
=
NULL
,
polygon
*
nextPoly
=
NULL
,
BOOL
intersect
=
FALSE
,
vertex
*
neighbor
=
NULL
,
double
alpha
=
0
.
0
,
BOOL
entry
=
TRUE
,
BOOL
checked
=
FALSE
);
~
vertex
();
int
id
()
{
return
m_id
;
};
double
X
()
{
return
m_x
;
};
void
setX
(
double
x
)
{
m_x
=
x
;
};
double
Y
()
{
return
m_y
;
};
void
setY
(
double
y
)
{
m_y
=
y
;
};
double
Xc
(
BOOL
g
=
TRUE
);
double
Yc
(
BOOL
g
=
TRUE
);
double
d
(
BOOL
g
=
TRUE
);
void
setXc
(
double
xc
)
{
m_nSeg
->
setXc
(
xc
);
};
void
setYc
(
double
yc
)
{
m_nSeg
->
setYc
(
yc
);
};
void
setNext
(
vertex
*
nextV
){
m_nextV
=
nextV
;
};
vertex
*
Next
(){
return
m_nextV
;
};
void
setPrev
(
vertex
*
prevV
){
m_prevV
=
prevV
;
};
vertex
*
Prev
(){
return
m_prevV
;
};
void
setNseg
(
segment
*
nSeg
){
m_nSeg
=
nSeg
;
};
segment
*
Nseg
(){
return
m_nSeg
;
};
void
setPseg
(
segment
*
pSeg
){
m_pSeg
=
pSeg
;
};
segment
*
Pseg
(){
return
m_pSeg
;
};
void
setNextPoly
(
polygon
*
nextPoly
){
m_nextPoly
=
nextPoly
;
};
polygon
*
NextPoly
(){
return
m_nextPoly
;
};
void
setNeighbor
(
vertex
*
neighbor
){
m_neighbor
=
neighbor
;
};
vertex
*
Neighbor
(){
return
m_neighbor
;
};
double
Alpha
(){
return
m_alpha
;
};
BOOL
isIntersect
(){
return
m_intersect
;
};
void
setChecked
(
BOOL
check
=
TRUE
);
BOOL
isChecked
()
{
return
m_checked
;
};
void
setEntry
(
BOOL
entry
=
TRUE
){
m_entry
=
entry
;
}
BOOL
isEntry
(){
return
m_entry
;
};
double
m_x
,
m_y
;
// coords
vertex
*
m_nextV
;
// links to next and prev vertices
vertex
*
m_prevV
;
// links to next and prev vertices
segment
*
m_nSeg
,
*
m_pSeg
;
// links to next and prev segments
polygon
*
m_nextPoly
;
BOOL
m_intersect
;
vertex
*
m_neighbor
;
double
m_alpha
;
BOOL
m_entry
;
BOOL
m_checked
;
int
m_id
;
};
#endif // ifndef PHP_POLYGON_VERTEX_H
// file php_polygon_vertex.h
// See comments in file php_polygon_vertex.cpp
#ifndef PHP_POLYGON_VERTEX_H
#define PHP_POLYGON_VERTEX_H
#include "defs-macros.h"
class
vertex
;
class
polygon
;
class
segment
{
public
:
segment
(
double
xc
=
0
.
0
,
double
yc
=
0
.
0
,
int
d
=
0
);
double
Xc
(){
return
m_xc
;
};
double
Yc
(){
return
m_yc
;
};
int
d
(){
return
m_d
;
};
void
setXc
(
double
xc
){
m_xc
=
xc
;
};
void
setYc
(
double
yc
){
m_yc
=
yc
;
};
double
m_xc
,
m_yc
;
// center of arc
int
m_d
;
// direction (-1=CW, 0=LINE, 1=CCW)
};
class
vertex
{
public
:
vertex
(
double
x
,
double
y
,
double
xc
=
0
.
0
,
double
yc
=
0
.
0
,
double
d
=
0
.
0
,
vertex
*
nextV
=
NULL
,
vertex
*
prevV
=
NULL
,
polygon
*
nextPoly
=
NULL
,
BOOL
intersect
=
FALSE
,
vertex
*
neighbor
=
NULL
,
double
alpha
=
0
.
0
,
BOOL
entry
=
TRUE
,
BOOL
checked
=
FALSE
);
~
vertex
();
int
id
()
{
return
m_id
;
};
double
X
()
{
return
m_x
;
};
void
setX
(
double
x
)
{
m_x
=
x
;
};
double
Y
()
{
return
m_y
;
};
void
setY
(
double
y
)
{
m_y
=
y
;
};
double
Xc
(
BOOL
g
=
TRUE
);
double
Yc
(
BOOL
g
=
TRUE
);
double
d
(
BOOL
g
=
TRUE
);
void
setXc
(
double
xc
)
{
m_nSeg
->
setXc
(
xc
);
};
void
setYc
(
double
yc
)
{
m_nSeg
->
setYc
(
yc
);
};
void
setNext
(
vertex
*
nextV
){
m_nextV
=
nextV
;
};
vertex
*
Next
(){
return
m_nextV
;
};
void
setPrev
(
vertex
*
prevV
){
m_prevV
=
prevV
;
};
vertex
*
Prev
(){
return
m_prevV
;
};
void
setNseg
(
segment
*
nSeg
){
m_nSeg
=
nSeg
;
};
segment
*
Nseg
(){
return
m_nSeg
;
};
void
setPseg
(
segment
*
pSeg
){
m_pSeg
=
pSeg
;
};
segment
*
Pseg
(){
return
m_pSeg
;
};
void
setNextPoly
(
polygon
*
nextPoly
){
m_nextPoly
=
nextPoly
;
};
polygon
*
NextPoly
(){
return
m_nextPoly
;
};
void
setNeighbor
(
vertex
*
neighbor
){
m_neighbor
=
neighbor
;
};
vertex
*
Neighbor
(){
return
m_neighbor
;
};
double
Alpha
(){
return
m_alpha
;
};
BOOL
isIntersect
(){
return
m_intersect
;
};
void
setChecked
(
BOOL
check
=
TRUE
);
BOOL
isChecked
()
{
return
m_checked
;
};
void
setEntry
(
BOOL
entry
=
TRUE
){
m_entry
=
entry
;
}
BOOL
isEntry
(){
return
m_entry
;
};
double
m_x
,
m_y
;
// coords
vertex
*
m_nextV
;
// links to next and prev vertices
vertex
*
m_prevV
;
// links to next and prev vertices
segment
*
m_nSeg
,
*
m_pSeg
;
// links to next and prev segments
polygon
*
m_nextPoly
;
BOOL
m_intersect
;
vertex
*
m_neighbor
;
double
m_alpha
;
BOOL
m_entry
;
BOOL
m_checked
;
int
m_id
;
};
#endif // ifndef PHP_POLYGON_VERTEX_H
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment