annotate nonfree/gpc/gpc_clip.cc @ 0:6b33357c7561 octave-forge

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