1
1
// Copyright 2010 Jussi Lepisto
3
#include "rowvector2f.h"
3
#include "RowVector2f.h"
5
5
#include <Eigen/Array>
6
6
#include <Eigen/Geometry>
8
#include "matrix/matrix2f.h"
9
8
#include "util/macros.h"
10
#include "vector/vector2f.h"
9
#include "vector/Vector2f.h"
25
24
"This vector divided by its norm.", NULL},
26
25
{"transpose", (getter)RowVector2f_get_transpose, NULL,
27
26
"Transpose of this vector.", NULL},
28
(getter)RowVector2f_get_transpose, (setter)RowVector2f_set_transpose,
29
"Transpose of this vector.", NULL},
134
136
Py_TPFLAGS_DEFAULT | // tp_flags
135
137
Py_TPFLAGS_BASETYPE |
136
138
Py_TPFLAGS_CHECKTYPES,
137
"2-dimensional row vector with float elements", // tp_doc
139
"2-dimensional vector with float elements", // tp_doc
138
140
0, // tp_traverse
140
142
RowVector2f_richcompare, // tp_richcompare
241
243
return (PyObject*)result;
246
int RowVector2f_set_transpose(RowVector2f* self, PyObject* value,
249
if(!Vector2f_Check(value))
251
PyErr_SetString(PyExc_TypeError, "transpose must be a Vector2f");
255
Vector2f* v = (Vector2f*)value;
256
self->vector.transpose() = v->vector;
245
261
PyObject* RowVector2f_zero(PyTypeObject* cls, PyObject* noargs)
287
303
RowVector2f* result = PyObject_New(RowVector2f, cls);
288
304
if(result != NULL)
289
result->vector << 1.f, 0.f;
305
result->vector << 1.0f, 0.0f;
291
307
return (PyObject*)result;
296
312
RowVector2f* result = PyObject_New(RowVector2f, cls);
297
313
if(result != NULL)
298
result->vector << 0.f, 1.f;
314
result->vector << 0.0f, 1.0f;
300
316
return (PyObject*)result;
389
405
PyObject* RowVector2f_multiply(PyObject* o1, PyObject* o2)
392
if(RowVector2f_Check(o1) && Matrix2f_Check(o2))
394
RowVector2f* v = (RowVector2f*)o1;
395
Matrix2f* m = (Matrix2f*)o2;
397
RowVector2f* result = PyObject_New(RowVector2f, &RowVector2fType);
399
result->vector = v->vector * m->matrix;
401
return (PyObject*)result;
404
else if(RowVector2f_Check(o1) && PyNumber_Check(o2))
407
if(RowVector2f_Check(o1) && PyNumber_Check(o2))
406
409
RowVector2f* v = (RowVector2f*)o1;
407
410
float scalar = (float)PyFloat_AsDouble(o2);
408
if(PyErr_Occurred() != NULL)
411
414
RowVector2f* result = PyObject_New(RowVector2f, &RowVector2fType);
412
415
if(result != NULL)
413
416
result->vector = v->vector * scalar;
415
417
return (PyObject*)result;
417
419
else if(PyNumber_Check(o1) && RowVector2f_Check(o2))
419
421
float scalar = (float)PyFloat_AsDouble(o1);
420
422
RowVector2f* v = (RowVector2f*)o2;
421
if(PyErr_Occurred() != NULL)
424
426
RowVector2f* result = PyObject_New(RowVector2f, &RowVector2fType);
425
427
if(result != NULL)
426
428
result->vector = v->vector * scalar;
428
429
return (PyObject*)result;
439
440
RowVector2f* v = (RowVector2f*)o1;
440
441
float scalar = (float)PyFloat_AsDouble(o2);
441
if(PyErr_Occurred() != NULL)
444
445
RowVector2f* result = PyObject_New(RowVector2f, &RowVector2fType);
451
452
PyObject* RowVector2f_negative(PyObject* o)
453
if(!RowVector2f_Check(o))
454
pyeigen_RETURN_NOTIMPLEMENTED;
456
454
RowVector2f* v = (RowVector2f*)o;
457
455
RowVector2f* result = PyObject_New(RowVector2f, &RowVector2fType);
458
456
if(result != NULL)
464
462
PyObject* RowVector2f_inplace_add(PyObject* o1, PyObject* o2)
466
if(!RowVector2f_Check(o1) || !PyNumber_Check(o2))
464
if(!RowVector2f_Check(o1) || !RowVector2f_Check(o2))
467
465
pyeigen_RETURN_NOTIMPLEMENTED;
469
467
RowVector2f* v1 = (RowVector2f*)o1;
470
468
RowVector2f* v2 = (RowVector2f*)o2;
471
470
v1->vector += v2->vector;
473
return (PyObject*)v1;
476
476
PyObject* RowVector2f_inplace_subtract(PyObject* o1, PyObject* o2)
478
if(!RowVector2f_Check(o1) || !PyNumber_Check(o2))
478
if(!RowVector2f_Check(o1) || !RowVector2f_Check(o2))
479
479
pyeigen_RETURN_NOTIMPLEMENTED;
481
481
RowVector2f* v1 = (RowVector2f*)o1;
482
482
RowVector2f* v2 = (RowVector2f*)o2;
483
484
v1->vector -= v2->vector;
487
return (PyObject*)v1;
488
490
PyObject* RowVector2f_inplace_multiply(PyObject* o1, PyObject* o2)
490
RowVector2f* v = (RowVector2f*)o1;
493
if(Matrix2f_Check(o2))
495
Matrix2f* m = (Matrix2f*)o2;
496
v->vector *= m->matrix;
499
else if(RowVector2f_Check(o1) && PyNumber_Check(o2))
492
if(RowVector2f_Check(o1) && PyNumber_Check(o2))
494
RowVector2f* v = (RowVector2f*)o1;
501
495
float scalar = (float)PyFloat_AsDouble(o2);
502
if(PyErr_Occurred() != NULL)
505
499
v->vector *= scalar;
507
504
else if(PyNumber_Check(o1) && RowVector2f_Check(o2))
509
506
float scalar = (float)PyFloat_AsDouble(o1);
510
if(PyErr_Occurred() != NULL)
507
RowVector2f* v = (RowVector2f*)o2;
513
511
v->vector *= scalar;
516
pyeigen_RETURN_NOTIMPLEMENTED;
517
pyeigen_RETURN_NOTIMPLEMENTED;
521
520
PyObject* RowVector2f_inplace_divide(PyObject* o1, PyObject* o2)
523
if(!PyNumber_Check(o2))
522
if(!RowVector2f_Check(o1) || !PyNumber_Check(o2))
524
523
pyeigen_RETURN_NOTIMPLEMENTED;
526
525
RowVector2f* v = (RowVector2f*)o1;
527
526
float scalar = (float)PyFloat_AsDouble(o2);
528
if(PyErr_Occurred() != NULL)
531
530
v->vector /= scalar;
533
533
return (PyObject*)v;
535
536
// Sequence methods
536
537
Py_ssize_t RowVector2f_length(RowVector2f* self)
549
550
return PyFloat_FromDouble(self->vector[(int)index]);
552
PyObject* RowVector2f_slice(RowVector2f* self, Py_ssize_t index1,
553
PyObject* RowVector2f_slice(RowVector2f* self, Py_ssize_t index1, Py_ssize_t index2)
589
589
self->vector[(int)index] = (float)PyFloat_AsDouble(value);
590
if(PyErr_Occurred() != NULL)
596
int RowVector2f_ass_slice(RowVector2f* self, Py_ssize_t index1,
597
Py_ssize_t index2, PyObject* value)
596
int RowVector2f_ass_slice(RowVector2f* self, Py_ssize_t index1, Py_ssize_t index2,