siren2 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.travis.yml +5 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +21 -0
  6. data/README.md +36 -0
  7. data/Rakefile +18 -0
  8. data/bin/console +14 -0
  9. data/bin/setup +8 -0
  10. data/ext/siren2/extconf.rb +66 -0
  11. data/ext/siren2/inc/bndbox.h +51 -0
  12. data/ext/siren2/inc/bo.h +20 -0
  13. data/ext/siren2/inc/brep.h +17 -0
  14. data/ext/siren2/inc/common.h +98 -0
  15. data/ext/siren2/inc/curve.h +65 -0
  16. data/ext/siren2/inc/curve/bscurve.h +22 -0
  17. data/ext/siren2/inc/curve/bzcurve.h +17 -0
  18. data/ext/siren2/inc/curve/circle.h +29 -0
  19. data/ext/siren2/inc/curve/ellipse.h +15 -0
  20. data/ext/siren2/inc/curve/hyperbola.h +15 -0
  21. data/ext/siren2/inc/curve/line.h +17 -0
  22. data/ext/siren2/inc/curve/offsetcurve.h +15 -0
  23. data/ext/siren2/inc/curve/parabola.h +15 -0
  24. data/ext/siren2/inc/filler.h +26 -0
  25. data/ext/siren2/inc/heal.h +19 -0
  26. data/ext/siren2/inc/io/iges.h +19 -0
  27. data/ext/siren2/inc/io/step.h +18 -0
  28. data/ext/siren2/inc/io/stl.h +13 -0
  29. data/ext/siren2/inc/offset.h +35 -0
  30. data/ext/siren2/inc/shape.h +140 -0
  31. data/ext/siren2/inc/shape/chunk.h +26 -0
  32. data/ext/siren2/inc/shape/compound.h +22 -0
  33. data/ext/siren2/inc/shape/edge.h +50 -0
  34. data/ext/siren2/inc/shape/face.h +67 -0
  35. data/ext/siren2/inc/shape/shell.h +21 -0
  36. data/ext/siren2/inc/shape/solid.h +41 -0
  37. data/ext/siren2/inc/shape/vertex.h +23 -0
  38. data/ext/siren2/inc/shape/wire.h +31 -0
  39. data/ext/siren2/inc/siren.h +39 -0
  40. data/ext/siren2/inc/surface/dummy +0 -0
  41. data/ext/siren2/inc/topalgo.h +52 -0
  42. data/ext/siren2/inc/trans.h +48 -0
  43. data/ext/siren2/inc/vec.h +65 -0
  44. data/ext/siren2/src/bndbox.cpp +343 -0
  45. data/ext/siren2/src/bo.cpp +66 -0
  46. data/ext/siren2/src/brep.cpp +69 -0
  47. data/ext/siren2/src/common.cpp +18 -0
  48. data/ext/siren2/src/curve.cpp +75 -0
  49. data/ext/siren2/src/curve/bscurve.cpp +118 -0
  50. data/ext/siren2/src/curve/bzcurve.cpp +55 -0
  51. data/ext/siren2/src/curve/circle.cpp +146 -0
  52. data/ext/siren2/src/curve/ellipse.cpp +17 -0
  53. data/ext/siren2/src/curve/hyperbola.cpp +17 -0
  54. data/ext/siren2/src/curve/line.cpp +24 -0
  55. data/ext/siren2/src/curve/offsetcurve.cpp +17 -0
  56. data/ext/siren2/src/curve/parabola.cpp +17 -0
  57. data/ext/siren2/src/filler.cpp +191 -0
  58. data/ext/siren2/src/heal.cpp +92 -0
  59. data/ext/siren2/src/io/iges.cpp +85 -0
  60. data/ext/siren2/src/io/step.cpp +47 -0
  61. data/ext/siren2/src/io/stl.cpp +22 -0
  62. data/ext/siren2/src/offset.cpp +256 -0
  63. data/ext/siren2/src/shape.cpp +617 -0
  64. data/ext/siren2/src/shape/chunk.cpp +65 -0
  65. data/ext/siren2/src/shape/compound.cpp +96 -0
  66. data/ext/siren2/src/shape/edge.cpp +254 -0
  67. data/ext/siren2/src/shape/face.cpp +366 -0
  68. data/ext/siren2/src/shape/shell.cpp +41 -0
  69. data/ext/siren2/src/shape/solid.cpp +256 -0
  70. data/ext/siren2/src/shape/vertex.cpp +68 -0
  71. data/ext/siren2/src/shape/wire.cpp +100 -0
  72. data/ext/siren2/src/siren.cpp +80 -0
  73. data/ext/siren2/src/surface/dummy +0 -0
  74. data/ext/siren2/src/topalgo.cpp +246 -0
  75. data/ext/siren2/src/trans.cpp +330 -0
  76. data/ext/siren2/src/vec.cpp +454 -0
  77. data/lib/io/dxf.rb +68 -0
  78. data/lib/io/plot.rb +38 -0
  79. data/lib/io/ply.rb +57 -0
  80. data/lib/io/stl.rb +35 -0
  81. data/lib/io/svg.rb +44 -0
  82. data/lib/kernel/array.rb +133 -0
  83. data/lib/kernel/float.rb +15 -0
  84. data/lib/shape.rb +157 -0
  85. data/lib/shape/compound.rb +11 -0
  86. data/lib/shape/edge.rb +15 -0
  87. data/lib/shape/face.rb +7 -0
  88. data/lib/shape/shell.rb +21 -0
  89. data/lib/shape/solid.rb +10 -0
  90. data/lib/shape/vertex.rb +7 -0
  91. data/lib/shape/wire.rb +14 -0
  92. data/lib/shapes.rb +52 -0
  93. data/lib/siren.rb +166 -0
  94. data/lib/siren2/version.rb +3 -0
  95. data/lib/vec.rb +81 -0
  96. data/siren2.gemspec +28 -0
  97. metadata +195 -0
@@ -0,0 +1,454 @@
1
+ #include "vec.h"
2
+
3
+ #define rb_array_p(x) RB_TYPE_P(x, T_ARRAY)
4
+ #define rb_fixnum_p(x) FIXNUM_P(x)
5
+ #define rb_float_p(x) RB_FLOAT_TYPE_P(x)
6
+
7
+ VALUE sr_cVec;
8
+
9
+ gp_Vec* siren_vec_get(VALUE obj)
10
+ {
11
+ gp_Vec* m;
12
+ Data_Get_Struct(obj, gp_Vec, m);
13
+ return m;
14
+ }
15
+
16
+ VALUE siren_vec_new(double x, double y, double z)
17
+ {
18
+ VALUE arg = rb_ary_new();
19
+ rb_ary_push(arg, DBL2NUM(x));
20
+ rb_ary_push(arg, DBL2NUM(y));
21
+ rb_ary_push(arg, DBL2NUM(z));
22
+ return rb_class_new_instance(1, &arg, sr_cVec);
23
+ }
24
+
25
+ VALUE siren_vec_new(const gp_Vec& vec)
26
+ {
27
+ return siren_vec_new(vec.X(), vec.Y(), vec.Z());
28
+ }
29
+
30
+ static VALUE siren_vec_allocate(VALUE klass)
31
+ {
32
+ void* p = ruby_xmalloc(sizeof(gp_Vec));
33
+ new(p) gp_Vec(0., 0., 0.);
34
+ return Data_Wrap_Struct(klass, NULL, siren_vec_final, p);
35
+ }
36
+
37
+ bool siren_vec_install()
38
+ {
39
+ sr_cVec = rb_define_class_under(sr_mSiren, "Vec", rb_cObject);
40
+ rb_define_alloc_func(sr_cVec, siren_vec_allocate);
41
+ rb_define_method(sr_cVec, "initialize", RUBY_METHOD_FUNC(siren_vec_init), -1);
42
+ rb_define_method(sr_cVec, "x", RUBY_METHOD_FUNC(siren_vec_x), -1);
43
+ rb_define_method(sr_cVec, "x=", RUBY_METHOD_FUNC(siren_vec_x_set), -1);
44
+ rb_define_method(sr_cVec, "y", RUBY_METHOD_FUNC(siren_vec_y), -1);
45
+ rb_define_method(sr_cVec, "y=", RUBY_METHOD_FUNC(siren_vec_y_set), -1);
46
+ rb_define_method(sr_cVec, "z", RUBY_METHOD_FUNC(siren_vec_z), -1);
47
+ rb_define_method(sr_cVec, "z=", RUBY_METHOD_FUNC(siren_vec_z_set), -1);
48
+ rb_define_method(sr_cVec, "equal?", RUBY_METHOD_FUNC(siren_vec_is_equal), -1);
49
+ rb_define_method(sr_cVec, "parallel?", RUBY_METHOD_FUNC(siren_vec_is_parallel), -1);
50
+ rb_define_method(sr_cVec, "normal?", RUBY_METHOD_FUNC(siren_vec_is_normal), -1);
51
+ rb_define_method(sr_cVec, "normal", RUBY_METHOD_FUNC(siren_vec_normal), -1);
52
+ rb_define_method(sr_cVec, "normal!", RUBY_METHOD_FUNC(siren_vec_normal_bang), -1);
53
+ rb_define_method(sr_cVec, "reverse?", RUBY_METHOD_FUNC(siren_vec_is_reverse), -1);
54
+ rb_define_method(sr_cVec, "reverse", RUBY_METHOD_FUNC(siren_vec_reverse), -1);
55
+ rb_define_method(sr_cVec, "reverse!", RUBY_METHOD_FUNC(siren_vec_reverse_bang), -1);
56
+ rb_define_method(sr_cVec, "angle", RUBY_METHOD_FUNC(siren_vec_angle), -1);
57
+ rb_define_method(sr_cVec, "angleref", RUBY_METHOD_FUNC(siren_vec_angleref), -1);
58
+ rb_define_method(sr_cVec, "magnitude", RUBY_METHOD_FUNC(siren_vec_magnitude), -1);
59
+ rb_define_method(sr_cVec, "size", RUBY_METHOD_FUNC(siren_vec_magnitude), -1);
60
+ rb_define_method(sr_cVec, "length", RUBY_METHOD_FUNC(siren_vec_magnitude), -1);
61
+ rb_define_method(sr_cVec, "cross", RUBY_METHOD_FUNC(siren_vec_cross), -1);
62
+ rb_define_method(sr_cVec, "cross!", RUBY_METHOD_FUNC(siren_vec_cross_bang), -1);
63
+ rb_define_method(sr_cVec, "dot", RUBY_METHOD_FUNC(siren_vec_dot), -1);
64
+ rb_define_method(sr_cVec, "dot_cross", RUBY_METHOD_FUNC(siren_vec_dot_cross), -1);
65
+ rb_define_method(sr_cVec, "cross_cross", RUBY_METHOD_FUNC(siren_vec_cross_cross), -1);
66
+ rb_define_method(sr_cVec, "cross_cross!", RUBY_METHOD_FUNC(siren_vec_cross_cross_bang), -1);
67
+ rb_define_method(sr_cVec, "cross_mag", RUBY_METHOD_FUNC(siren_vec_cross_mag), -1);
68
+ rb_define_method(sr_cVec, "cross_square_mag", RUBY_METHOD_FUNC(siren_vec_cross_square_mag), -1);
69
+ rb_define_method(sr_cVec, "square_mag", RUBY_METHOD_FUNC(siren_vec_square_mag), -1);
70
+
71
+ rb_define_method(sr_cVec, "mirror", RUBY_METHOD_FUNC(siren_vec_mirror), -1);
72
+ rb_define_method(sr_cVec, "mirror!", RUBY_METHOD_FUNC(siren_vec_mirror_bang), -1);
73
+ rb_define_method(sr_cVec, "rotate", RUBY_METHOD_FUNC(siren_vec_rotate), -1);
74
+ rb_define_method(sr_cVec, "rotate!", RUBY_METHOD_FUNC(siren_vec_rotate_bang), -1);
75
+ rb_define_method(sr_cVec, "scale", RUBY_METHOD_FUNC(siren_vec_scale), -1);
76
+ rb_define_method(sr_cVec, "scale!", RUBY_METHOD_FUNC(siren_vec_scale_bang), -1);
77
+ rb_define_method(sr_cVec, "transform", RUBY_METHOD_FUNC(siren_vec_transform), -1);
78
+ rb_define_method(sr_cVec, "transform!", RUBY_METHOD_FUNC(siren_vec_transform_bang), -1);
79
+
80
+ rb_define_method(sr_cVec, "-@", RUBY_METHOD_FUNC(siren_vec_negative), -1);
81
+ rb_define_method(sr_cVec, "==", RUBY_METHOD_FUNC(siren_vec_eq), -1);
82
+ rb_define_method(sr_cVec, "+", RUBY_METHOD_FUNC(siren_vec_plus), -1);
83
+ rb_define_method(sr_cVec, "-", RUBY_METHOD_FUNC(siren_vec_minus), -1);
84
+ rb_define_method(sr_cVec, "*", RUBY_METHOD_FUNC(siren_vec_multiply_scalar), -1);
85
+ rb_define_method(sr_cVec, "/", RUBY_METHOD_FUNC(siren_vec_devide_scalar), -1);
86
+
87
+ return true;
88
+ }
89
+
90
+ VALUE siren_vec_init(int argc, VALUE* argv, VALUE self)
91
+ {
92
+ VALUE xx, yy, zz;
93
+ rb_scan_args(argc, argv, "03", &xx, &yy, &zz);
94
+ int len = argc;
95
+
96
+ Standard_Real x = 0.0, y = 0.0, z = 0.0;
97
+ if (rb_array_p(xx)) {
98
+ gp_Pnt p = siren_ary_to_pnt(xx);
99
+ x = p.X(); y = p.Y(); z = p.Z();
100
+ }
101
+ else {
102
+ if (argc >= 1) x = NUM2DBL(xx);
103
+ if (argc >= 2) y = NUM2DBL(yy);
104
+ if (argc >= 3) z = NUM2DBL(zz);
105
+ }
106
+
107
+ gp_Vec* p;
108
+ Data_Get_Struct(self, gp_Vec, p);
109
+ p->SetX(x);
110
+ p->SetY(y);
111
+ p->SetZ(z);
112
+
113
+ return self;
114
+ }
115
+
116
+ void siren_vec_final( void* p)
117
+ {
118
+ gp_Vec* v = static_cast<gp_Vec*>(p);
119
+ ruby_xfree(v);
120
+ }
121
+
122
+ VALUE siren_vec_x(int argc, VALUE* argv, VALUE self)
123
+ {
124
+ return DBL2NUM(siren_vec_get(self)->X());
125
+ }
126
+
127
+ VALUE siren_vec_x_set(int argc, VALUE* argv, VALUE self)
128
+ {
129
+ VALUE val;
130
+ rb_scan_args(argc, argv, "1", &val);
131
+ gp_Vec* vec = siren_vec_get(self);
132
+ vec->SetX(NUM2DBL(val));
133
+ return DBL2NUM(vec->X());
134
+ }
135
+
136
+ VALUE siren_vec_y(int argc, VALUE* argv, VALUE self)
137
+ {
138
+ return DBL2NUM(siren_vec_get(self)->Y());
139
+ }
140
+
141
+ VALUE siren_vec_y_set(int argc, VALUE* argv, VALUE self)
142
+ {
143
+ VALUE val;
144
+ rb_scan_args(argc, argv, "1", &val);
145
+ gp_Vec* vec = siren_vec_get(self);
146
+ vec->SetY(NUM2DBL(val));
147
+ return DBL2NUM(vec->Y());
148
+ }
149
+
150
+ VALUE siren_vec_z(int argc, VALUE* argv, VALUE self)
151
+ {
152
+ return DBL2NUM(siren_vec_get(self)->Z());
153
+ }
154
+
155
+ VALUE siren_vec_z_set(int argc, VALUE* argv, VALUE self)
156
+ {
157
+ VALUE val;
158
+ rb_scan_args(argc, argv, "1", &val);
159
+ gp_Vec* vec = siren_vec_get(self);
160
+ vec->SetZ(NUM2DBL(val));
161
+ return DBL2NUM(vec->Z());
162
+ }
163
+
164
+ VALUE siren_vec_to_a(int argc, VALUE* argv, VALUE self)
165
+ {
166
+ gp_Vec* vec = siren_vec_get(self);
167
+ return siren_vec_to_ary(*vec);
168
+ }
169
+
170
+ VALUE siren_vec_is_equal(int argc, VALUE* argv, VALUE self)
171
+ {
172
+ VALUE other;
173
+ VALUE lintol, angtol;
174
+ rb_scan_args(argc, argv, "3", &other, &lintol, &angtol);
175
+ gp_Vec* me = siren_vec_get(self);
176
+ gp_Vec* o = siren_vec_get(other);
177
+ Standard_Boolean res = me->IsEqual(*o, NUM2DBL(lintol), NUM2DBL(angtol));
178
+ return res ? Qtrue : Qfalse;
179
+ }
180
+
181
+ VALUE siren_vec_is_normal(int argc, VALUE* argv, VALUE self)
182
+ {
183
+ VALUE other;
184
+ VALUE angtol;
185
+ rb_scan_args(argc, argv, "2", &other, &angtol);
186
+ gp_Vec* me = siren_vec_get(self);
187
+ gp_Vec* o = siren_vec_get(other);
188
+ Standard_Boolean res = me->IsNormal(*o, NUM2DBL(angtol));
189
+ return res ? Qtrue : Qfalse;
190
+ }
191
+
192
+ VALUE siren_vec_is_reverse(int argc, VALUE* argv, VALUE self)
193
+ {
194
+ VALUE other;
195
+ VALUE angtol;
196
+ rb_scan_args(argc, argv, "2", &other, &angtol);
197
+ gp_Vec* me = siren_vec_get(self);
198
+ gp_Vec* o = siren_vec_get(other);
199
+ Standard_Boolean res = me->IsOpposite(*o, NUM2DBL(angtol));
200
+ return res ? Qtrue : Qfalse;
201
+ }
202
+
203
+ VALUE siren_vec_is_parallel(int argc, VALUE* argv, VALUE self)
204
+ {
205
+ VALUE other;
206
+ VALUE angtol;
207
+ rb_scan_args(argc, argv, "2", &other, &angtol);
208
+ gp_Vec* me = siren_vec_get(self);
209
+ gp_Vec* o = siren_vec_get(other);
210
+ Standard_Boolean res = me->IsParallel(*o, NUM2DBL(angtol));
211
+ return res ? Qtrue : Qfalse;
212
+ }
213
+
214
+ VALUE siren_vec_normal(int argc, VALUE* argv, VALUE self)
215
+ {
216
+ return siren_vec_new(siren_vec_get(self)->Normalized());
217
+ }
218
+
219
+ VALUE siren_vec_normal_bang(int argc, VALUE* argv, VALUE self)
220
+ {
221
+ siren_vec_get(self)->Normalize();
222
+ return self;
223
+ }
224
+
225
+ VALUE siren_vec_reverse(int argc, VALUE* argv, VALUE self)
226
+ {
227
+ return siren_vec_new(siren_vec_get(self)->Reversed());
228
+ }
229
+
230
+ VALUE siren_vec_reverse_bang(int argc, VALUE* argv, VALUE self)
231
+ {
232
+ siren_vec_get(self)->Reverse();
233
+ return self;
234
+ }
235
+
236
+ VALUE siren_vec_angle(int argc, VALUE* argv, VALUE self)
237
+ {
238
+ VALUE other;
239
+ rb_scan_args(argc, argv, "1", &other);
240
+ gp_Vec* me = siren_vec_get(self);
241
+ gp_Vec* o = siren_vec_get(other);
242
+ Standard_Real res = me->Angle(*o);
243
+ return DBL2NUM(res);
244
+ }
245
+
246
+ VALUE siren_vec_angleref(int argc, VALUE* argv, VALUE self)
247
+ {
248
+ VALUE other, vref;
249
+ rb_scan_args(argc, argv, "2", &other, &vref);
250
+ gp_Vec* me = siren_vec_get(self);
251
+ gp_Vec* o = siren_vec_get(other);
252
+ gp_Vec* ref = siren_vec_get(vref);
253
+ Standard_Real res = me->AngleWithRef(*o, *ref);
254
+ return DBL2NUM(res);
255
+ }
256
+
257
+ VALUE siren_vec_magnitude(int argc, VALUE* argv, VALUE self)
258
+ {
259
+ Standard_Real res = siren_vec_get(self)->Magnitude();
260
+ return DBL2NUM(res);
261
+ }
262
+
263
+ VALUE siren_vec_negative(int argc, VALUE* argv, VALUE self)
264
+ {
265
+ gp_Vec ans = -(*siren_vec_get(self));
266
+ return siren_vec_new(ans.X(), ans.Y(), ans.Z());
267
+ }
268
+
269
+ VALUE siren_vec_eq(int argc, VALUE* argv, VALUE self)
270
+ {
271
+ VALUE other;
272
+ rb_scan_args(argc, argv, "1", &other);
273
+ Standard_Real lintol = 0.0, angtol = 0.0; // to be use the default tolerance value
274
+ Standard_Boolean ans = siren_vec_get(self)->IsEqual(*siren_vec_get(other), lintol, angtol);
275
+ return ans ? Qtrue : Qfalse;
276
+ }
277
+
278
+ VALUE siren_vec_plus(int argc, VALUE* argv, VALUE self)
279
+ {
280
+ VALUE other;
281
+ rb_scan_args(argc, argv, "1", &other);
282
+ gp_Vec ans = *siren_vec_get(self) + *siren_vec_get(other);
283
+ return siren_vec_new(ans.X(), ans.Y(), ans.Z());
284
+ }
285
+
286
+ VALUE siren_vec_minus(int argc, VALUE* argv, VALUE self)
287
+ {
288
+ VALUE other;
289
+ rb_scan_args(argc, argv, "1", &other);
290
+ gp_Vec ans = *siren_vec_get(self) - *siren_vec_get(other);
291
+ return siren_vec_new(ans.X(), ans.Y(), ans.Z());
292
+ }
293
+
294
+ VALUE siren_vec_multiply_scalar(int argc, VALUE* argv, VALUE self)
295
+ {
296
+ VALUE factor;
297
+ rb_scan_args(argc, argv, "1", &factor);
298
+ gp_Vec ans = *siren_vec_get(self) * NUM2DBL(factor);
299
+ return siren_vec_new(ans.X(), ans.Y(), ans.Z());
300
+ }
301
+
302
+ VALUE siren_vec_devide_scalar(int argc, VALUE* argv, VALUE self)
303
+ {
304
+ VALUE factor;
305
+ rb_scan_args(argc, argv, "1", &factor);
306
+ gp_Vec ans = *siren_vec_get(self) / NUM2DBL(factor);
307
+ return siren_vec_new(ans.X(), ans.Y(), ans.Z());
308
+ }
309
+
310
+ VALUE siren_vec_cross(int argc, VALUE* argv, VALUE self)
311
+ {
312
+ VALUE other;
313
+ rb_scan_args(argc, argv, "1", &other);
314
+ gp_Vec ans = siren_vec_get(self)->Crossed(*siren_vec_get(other));
315
+ return siren_vec_new(ans.X(), ans.Y(), ans.Z());
316
+ }
317
+
318
+ VALUE siren_vec_cross_bang(int argc, VALUE* argv, VALUE self)
319
+ {
320
+ VALUE other;
321
+ rb_scan_args(argc, argv, "1", &other);
322
+ siren_vec_get(self)->Cross(*siren_vec_get(other));
323
+ return self;
324
+ }
325
+
326
+ VALUE siren_vec_dot(int argc, VALUE* argv, VALUE self)
327
+ {
328
+ VALUE other;
329
+ rb_scan_args(argc, argv, "1", &other);
330
+ Standard_Real ans = siren_vec_get(self)->Dot(*siren_vec_get(other));
331
+ return DBL2NUM(ans);
332
+ }
333
+
334
+ VALUE siren_vec_dot_cross(int argc, VALUE* argv, VALUE self)
335
+ {
336
+ VALUE v1, v2;
337
+ rb_scan_args(argc, argv, "1", &v1, &v2);
338
+ Standard_Real ans = siren_vec_get(self)->DotCross(
339
+ *siren_vec_get(v1),
340
+ *siren_vec_get(v2));
341
+ return DBL2NUM(ans);
342
+ }
343
+
344
+ VALUE siren_vec_cross_cross(int argc, VALUE* argv, VALUE self)
345
+ {
346
+ VALUE v1, v2;
347
+ rb_scan_args(argc, argv, "1", &v1, &v2);
348
+ gp_Vec ans = siren_vec_get(self)->CrossCrossed(
349
+ *siren_vec_get(v1),
350
+ *siren_vec_get(v2)
351
+ );
352
+ return siren_vec_new(ans.X(), ans.Y(), ans.Z());
353
+ }
354
+
355
+ VALUE siren_vec_cross_cross_bang(int argc, VALUE* argv, VALUE self)
356
+ {
357
+ VALUE v1, v2;
358
+ rb_scan_args(argc, argv, "1", &v1, &v2);
359
+ siren_vec_get(self)->CrossCross(
360
+ *siren_vec_get(v1),
361
+ *siren_vec_get(v2)
362
+ );
363
+ return self;
364
+ }
365
+
366
+ VALUE siren_vec_cross_mag(int argc, VALUE* argv, VALUE self)
367
+ {
368
+ VALUE other;
369
+ rb_scan_args(argc, argv, "1", &other);
370
+ Standard_Real ans = siren_vec_get(self)->CrossMagnitude(*siren_vec_get(other));
371
+ return DBL2NUM(ans);
372
+ }
373
+
374
+ VALUE siren_vec_cross_square_mag(int argc, VALUE* argv, VALUE self)
375
+ {
376
+ VALUE other;
377
+ rb_scan_args(argc, argv, "1", &other);
378
+ Standard_Real ans = siren_vec_get(self)->CrossSquareMagnitude(*siren_vec_get(other));
379
+ return DBL2NUM(ans);
380
+ }
381
+
382
+ VALUE siren_vec_square_mag(int argc, VALUE* argv, VALUE self)
383
+ {
384
+ Standard_Real res = siren_vec_get(self)->SquareMagnitude();
385
+ return DBL2NUM(res);
386
+ }
387
+
388
+ VALUE siren_vec_mirror(int argc, VALUE* argv, VALUE self)
389
+ {
390
+ VALUE dir;
391
+ rb_scan_args(argc, argv, "1", &dir);
392
+ gp_Vec res = siren_vec_get(self)->Mirrored(*siren_vec_get(dir));
393
+ return siren_vec_new(res.X(), res.Y(), res.Z());
394
+ }
395
+
396
+ VALUE siren_vec_mirror_bang(int argc, VALUE* argv, VALUE self)
397
+ {
398
+ VALUE dir;
399
+ rb_scan_args(argc, argv, "1", &dir);
400
+ siren_vec_get(self)->Mirror(*siren_vec_get(dir));
401
+ return self;
402
+ }
403
+
404
+ VALUE siren_vec_rotate(int argc, VALUE* argv, VALUE self)
405
+ {
406
+ VALUE dir;
407
+ VALUE angle;
408
+ rb_scan_args(argc, argv, "2", &dir, &angle);
409
+ gp_Vec res = siren_vec_get(self)->Rotated(
410
+ gp_Ax1(gp_Pnt(0.0, 0.0, 0.0), *siren_vec_get(dir)), NUM2DBL(angle));
411
+ return siren_vec_new(res.X(), res.Y(), res.Z());
412
+ }
413
+
414
+ VALUE siren_vec_rotate_bang(int argc, VALUE* argv, VALUE self)
415
+ {
416
+ VALUE dir;
417
+ VALUE angle;
418
+ rb_scan_args(argc, argv, "2", &dir, &angle);
419
+ siren_vec_get(self)->Rotate(
420
+ gp_Ax1(gp_Pnt(0.0, 0.0, 0.0), *siren_vec_get(dir)), NUM2DBL(angle));
421
+ return self;
422
+ }
423
+
424
+ VALUE siren_vec_scale(int argc, VALUE* argv, VALUE self)
425
+ {
426
+ VALUE f;
427
+ rb_scan_args(argc, argv, "1", &f);
428
+ gp_Vec res = siren_vec_get(self)->Scaled(NUM2DBL(f));
429
+ return siren_vec_new(res.X(), res.Y(), res.Z());
430
+ }
431
+
432
+ VALUE siren_vec_scale_bang(int argc, VALUE* argv, VALUE self)
433
+ {
434
+ VALUE f;
435
+ rb_scan_args(argc, argv, "1", &f);
436
+ siren_vec_get(self)->Scale(NUM2DBL(f));
437
+ return self;
438
+ }
439
+
440
+ VALUE siren_vec_transform(int argc, VALUE* argv, VALUE self)
441
+ {
442
+ VALUE t;
443
+ rb_scan_args(argc, argv, "1", &t);
444
+ gp_Vec res = siren_vec_get(self)->Transformed(*siren_trans_get(t));
445
+ return siren_vec_new(res.X(), res.Y(), res.Z());
446
+ }
447
+
448
+ VALUE siren_vec_transform_bang(int argc, VALUE* argv, VALUE self)
449
+ {
450
+ VALUE t;
451
+ rb_scan_args(argc, argv, "1", &t);
452
+ siren_vec_get(self)->Transform(*siren_trans_get(t));
453
+ return self;
454
+ }