diff --git a/lib/matplotlib/tests/test_transforms.py b/lib/matplotlib/tests/test_transforms.py index f6534513c4bd..af9cea700a38 100644 --- a/lib/matplotlib/tests/test_transforms.py +++ b/lib/matplotlib/tests/test_transforms.py @@ -487,6 +487,11 @@ def test_bbox_as_strings(): assert_equal(eval(format(getattr(b, k), fmt)), v) +def test_transform_single_point(): + t = mtrans.Affine2D() + r = t.transform_affine((1, 1)) + assert r.shape == (2,) + if __name__=='__main__': import nose nose.runmodule(argv=['-s','--with-doctest'], exit=False) diff --git a/src/_path.h b/src/_path.h index 4eaed05245ed..fcd3e4f585eb 100644 --- a/src/_path.h +++ b/src/_path.h @@ -687,7 +687,7 @@ clip_path_to_rect(PathIterator &path, agg::rect_d &rect, bool inside, std::vecto } template -void affine_transform(VerticesArray &vertices, agg::trans_affine &trans, ResultArray &result) +void affine_transform_2d(VerticesArray &vertices, agg::trans_affine &trans, ResultArray &result) { if (vertices.dim(0) != 0 && vertices.dim(1) != 2) { throw "Invalid vertices array."; @@ -716,6 +716,33 @@ void affine_transform(VerticesArray &vertices, agg::trans_affine &trans, ResultA } } +template +void affine_transform_1d(VerticesArray &vertices, agg::trans_affine &trans, ResultArray &result) +{ + if (vertices.dim(0) != 2) { + throw "Invalid vertices array."; + } + + double x; + double y; + double t0; + double t1; + double t; + + x = vertices(0); + y = vertices(1); + + t0 = trans.sx * x; + t1 = trans.shx * y; + t = t0 + t1 + trans.tx; + result(0) = t; + + t0 = trans.shy * x; + t1 = trans.sy * y; + t = t0 + t1 + trans.ty; + result(1) = t; +} + template int count_bboxes_overlapping_bbox(agg::rect_d &a, BBoxArray &bboxes) { diff --git a/src/_path_wrapper.cpp b/src/_path_wrapper.cpp index e11adc1d3b13..c38403ef6a86 100644 --- a/src/_path_wrapper.cpp +++ b/src/_path_wrapper.cpp @@ -419,24 +419,30 @@ const char *Py_affine_transform__doc__ = "affine_transform(points, trans)"; static PyObject *Py_affine_transform(PyObject *self, PyObject *args, PyObject *kwds) { - numpy::array_view vertices; + PyObject *vertices_obj; agg::trans_affine trans; if (!PyArg_ParseTuple(args, - "O&O&:affine_transform", - &vertices.converter, - &vertices, + "OO&:affine_transform", + &vertices_obj, &convert_trans_affine, &trans)) { return NULL; } - npy_intp dims[] = { vertices.dim(0), 2 }; - numpy::array_view result(dims); - - CALL_CPP("affine_transform", (affine_transform(vertices, trans, result))); - - return result.pyobj(); + try { + numpy::array_view vertices(vertices_obj); + npy_intp dims[] = { vertices.dim(0), 2 }; + numpy::array_view result(dims); + CALL_CPP("affine_transform", (affine_transform_2d(vertices, trans, result))); + return result.pyobj(); + } catch (py::exception) { + numpy::array_view vertices(vertices_obj); + npy_intp dims[] = { vertices.dim(0) }; + numpy::array_view result(dims); + CALL_CPP("affine_transform", (affine_transform_1d(vertices, trans, result))); + return result.pyobj(); + } } const char *Py_count_bboxes_overlapping_bbox__doc__ = "count_bboxes_overlapping_bbox(bbox, bboxes)";