Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 77ccc82

Browse files
committed
Merge pull request #3866 from mdboom/transform-single-point
Regression in transforms: raises exception when applied to single point
2 parents 14475ab + 733570e commit 77ccc82

File tree

3 files changed

+49
-11
lines changed

3 files changed

+49
-11
lines changed

lib/matplotlib/tests/test_transforms.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,11 @@ def test_bbox_as_strings():
487487
assert_equal(eval(format(getattr(b, k), fmt)), v)
488488

489489

490+
def test_transform_single_point():
491+
t = mtrans.Affine2D()
492+
r = t.transform_affine((1, 1))
493+
assert r.shape == (2,)
494+
490495
if __name__=='__main__':
491496
import nose
492497
nose.runmodule(argv=['-s','--with-doctest'], exit=False)

src/_path.h

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,7 @@ clip_path_to_rect(PathIterator &path, agg::rect_d &rect, bool inside, std::vecto
687687
}
688688

689689
template <class VerticesArray, class ResultArray>
690-
void affine_transform(VerticesArray &vertices, agg::trans_affine &trans, ResultArray &result)
690+
void affine_transform_2d(VerticesArray &vertices, agg::trans_affine &trans, ResultArray &result)
691691
{
692692
if (vertices.dim(0) != 0 && vertices.dim(1) != 2) {
693693
throw "Invalid vertices array.";
@@ -716,6 +716,33 @@ void affine_transform(VerticesArray &vertices, agg::trans_affine &trans, ResultA
716716
}
717717
}
718718

719+
template <class VerticesArray, class ResultArray>
720+
void affine_transform_1d(VerticesArray &vertices, agg::trans_affine &trans, ResultArray &result)
721+
{
722+
if (vertices.dim(0) != 2) {
723+
throw "Invalid vertices array.";
724+
}
725+
726+
double x;
727+
double y;
728+
double t0;
729+
double t1;
730+
double t;
731+
732+
x = vertices(0);
733+
y = vertices(1);
734+
735+
t0 = trans.sx * x;
736+
t1 = trans.shx * y;
737+
t = t0 + t1 + trans.tx;
738+
result(0) = t;
739+
740+
t0 = trans.shy * x;
741+
t1 = trans.sy * y;
742+
t = t0 + t1 + trans.ty;
743+
result(1) = t;
744+
}
745+
719746
template <class BBoxArray>
720747
int count_bboxes_overlapping_bbox(agg::rect_d &a, BBoxArray &bboxes)
721748
{

src/_path_wrapper.cpp

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -419,24 +419,30 @@ const char *Py_affine_transform__doc__ = "affine_transform(points, trans)";
419419

420420
static PyObject *Py_affine_transform(PyObject *self, PyObject *args, PyObject *kwds)
421421
{
422-
numpy::array_view<const double, 2> vertices;
422+
PyObject *vertices_obj;
423423
agg::trans_affine trans;
424424

425425
if (!PyArg_ParseTuple(args,
426-
"O&O&:affine_transform",
427-
&vertices.converter,
428-
&vertices,
426+
"OO&:affine_transform",
427+
&vertices_obj,
429428
&convert_trans_affine,
430429
&trans)) {
431430
return NULL;
432431
}
433432

434-
npy_intp dims[] = { vertices.dim(0), 2 };
435-
numpy::array_view<double, 2> result(dims);
436-
437-
CALL_CPP("affine_transform", (affine_transform(vertices, trans, result)));
438-
439-
return result.pyobj();
433+
try {
434+
numpy::array_view<double, 2> vertices(vertices_obj);
435+
npy_intp dims[] = { vertices.dim(0), 2 };
436+
numpy::array_view<double, 2> result(dims);
437+
CALL_CPP("affine_transform", (affine_transform_2d(vertices, trans, result)));
438+
return result.pyobj();
439+
} catch (py::exception) {
440+
numpy::array_view<double, 1> vertices(vertices_obj);
441+
npy_intp dims[] = { vertices.dim(0) };
442+
numpy::array_view<double, 1> result(dims);
443+
CALL_CPP("affine_transform", (affine_transform_1d(vertices, trans, result)));
444+
return result.pyobj();
445+
}
440446
}
441447

442448
const char *Py_count_bboxes_overlapping_bbox__doc__ = "count_bboxes_overlapping_bbox(bbox, bboxes)";

0 commit comments

Comments
 (0)