void Canvas::fill_ellipse(const Pointf ¢er, float radius_x, float radius_y, const Gradient &gradient) { float max_radius = max(radius_x, radius_y); if (max_radius == 0) return; const Mat4f original_transform = get_transform(); mult_transform(Mat4f::translate(center.x, center.y, 0)); mult_transform(Mat4f::scale(radius_x / max_radius, radius_y / max_radius, 1.0f)); fill_circle(Pointf(0, 0), max_radius, gradient); set_transform(original_transform); }
/** * cleanmean_xy_transform: calulcates the cleaned mean of an array * of transforms, considering only x and y * * Parameters: * transforms: array of transforms. * len: length of array * Return value: * A new transform with x and y beeing the cleaned mean * (meaning upper and lower pentile are removed) of * all transforms. alpha and other fields are 0. * Preconditions: * len>0 * Side effects: * None */ Transform cleanmean_xy_transform(const Transform* transforms, int len) { Transform* ts = vs_malloc(sizeof(Transform) * len); Transform t = null_transform(); int i, cut = len / 5; memcpy(ts, transforms, sizeof(Transform) * len); qsort(ts,len, sizeof(Transform), cmp_trans_x); for (i = cut; i < len - cut; i++){ // all but cutted t.x += ts[i].x; } qsort(ts, len, sizeof(Transform), cmp_trans_y); for (i = cut; i < len - cut; i++){ // all but cutted t.y += ts[i].y; } vs_free(ts); return mult_transform(&t, 1.0 / (len - (2.0 * cut))); }
/* like mult_transform but with non-pointer signature */ Transform mult_transform_(const Transform t1, double f) { return mult_transform(&t1,f); }