0
|
1 /* |
|
2 |
|
3 Copyright (C) 2001 Rafael Laboissiere |
|
4 |
|
5 This file is part of octave-gpc. |
|
6 |
|
7 octave-gpc is free software; you can redistribute it and/or modify it |
|
8 under the terms of the GNU General Public License as published by the |
|
9 Free Software Foundation; either version 2, or (at your option) any |
|
10 later version. |
|
11 |
|
12 octave-gpc is distributed in the hope that it will be useful, but WITHOUT |
|
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
15 for more details. |
|
16 |
|
17 You should have received a copy of the GNU General Public License |
|
18 along with octave-gpc; see the file COPYING. If not, write to the Free |
|
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
|
20 |
|
21 */ |
|
22 |
|
23 #include "octave-gpc.h" |
|
24 |
|
25 // This is the user function for polygon operations |
|
26 DEFUN_DLD (gpc_clip, args, , |
|
27 " SYNOPSIS:\n" |
|
28 " result = gpc_clip (subject, clip, [operation]])\n" |
|
29 "\n" |
|
30 " DESCRIPTION:\n" |
|
31 " Make an clipping operation between the SUBJECT and CLIP\n" |
|
32 " arguments, which must be gpc_polygon objects. The OPERATION\n" |
|
33 " argument must be one of \"DIFF\", \"INT\", \"XOR\", or\n" |
|
34 " \"UNION\" (the default value is \"INT\").\n" |
|
35 "\n" |
|
36 " RESULT is the resulting gpc_polygon object.\n" |
|
37 "\n" |
|
38 " SEE ALSO:\n" |
|
39 " The General Polygon Clipper Library documentation.\n" |
|
40 " gpc_create, gpc_get, gpc_read, gpc_write,\n" |
|
41 " gpc_is_polygon, gpc_plot.\n" ) |
|
42 { |
|
43 octave_value retval; |
|
44 gpc_op operation = GPC_INT; |
|
45 gpc_polygon *subject, *clip, result; |
|
46 |
|
47 // Sanity check of the arguments |
|
48 int nargin = args.length (); |
|
49 |
|
50 if (nargin < 2 || nargin > 3) |
|
51 print_usage ("gpc_clip"); |
|
52 else |
|
53 { |
|
54 if ( nargin == 3 ) |
|
55 { |
|
56 string op = args (2).string_value (); |
|
57 if ( error_state ) |
|
58 { |
|
59 error ("gpc_clip: operation argument should be a " |
|
60 "string"); |
|
61 return retval; |
|
62 } |
|
63 else |
|
64 { |
|
65 if ( op == "DIFF" ) |
|
66 operation = GPC_DIFF; |
|
67 else |
|
68 if ( op == "INT" ) |
|
69 operation = GPC_INT; |
|
70 else |
|
71 if ( op == "XOR" ) |
|
72 operation = GPC_XOR; |
|
73 else |
|
74 if ( op == "UNION" ) |
|
75 operation = GPC_UNION; |
|
76 else |
|
77 { |
|
78 error ("gpc_clip: operation argument must be " |
|
79 "one of \"DIFF\", \"INT\", \"XOR\", or " |
|
80 "\"UNION\""); |
|
81 return retval; |
|
82 } |
|
83 } |
|
84 } |
|
85 |
|
86 if ( args(0).type_id () == octave_gpc_polygon::static_type_id () ) |
|
87 subject = get_gpc_pt (args(0)); |
|
88 else |
|
89 { |
|
90 error ("gpc_clip: subject argument must be of type " |
|
91 "gpc_polygon"); |
|
92 return retval; |
|
93 } |
|
94 |
|
95 if ( args (1).type_id () == octave_gpc_polygon::static_type_id () ) |
|
96 clip = get_gpc_pt (args(1)); |
|
97 else |
|
98 { |
|
99 error ("gpc_clip: clip argument must be of type " |
|
100 "gpc_polygon"); |
|
101 return retval; |
|
102 } |
|
103 |
|
104 gpc_polygon_clip (operation, subject, clip, &result); |
|
105 Octave_map m; |
|
106 gpc_to_map (&result, &m); |
|
107 retval = octave_value (new octave_gpc_polygon (m)); |
|
108 |
|
109 // The result polygon must be freed by the C library function as |
|
110 // it was created by gpc_polygon_clip. |
|
111 gpc_free_polygon (&result); |
|
112 } |
|
113 return retval; |
|
114 } |
|
115 |
|
116 /* |
|
117 ;;; Local Variables: *** |
|
118 ;;; mode: C++ *** |
|
119 ;;; End: *** |
|
120 */ |