Use center and radius in all ellipse code, rather than bounding rect.

Simplifies things.
This commit is contained in:
Jürg Lehni 2013-10-29 18:10:30 +01:00
parent fc9cad009f
commit c3aed5277d
2 changed files with 20 additions and 25 deletions

View file

@ -436,19 +436,17 @@ statics: new function() {
*/ */
Ellipse: function(/* rectangle */) { Ellipse: function(/* rectangle */) {
var center, var center,
size,
radius; radius;
if (Base.hasNamed(arguments, 'center')) { if (Base.hasNamed(arguments, 'center')) {
center = Point.readNamed(arguments, 'center'); center = Point.readNamed(arguments, 'center');
radius = Size.readNamed(arguments, 'radius'); radius = Size.readNamed(arguments, 'radius');
size = radius.multiply(2);
} else { } else {
var rect = Rectangle.readNamed(arguments, 'rectangle'); var rect = Rectangle.readNamed(arguments, 'rectangle');
center = rect.getCenter(true); center = rect.getCenter(true);
size = rect.getSize(true); radius = rect.getSize(true).divide(2);
radius = size.divide(2);
} }
return createShape('ellipse', center, size, radius, arguments); return createShape('ellipse', center, radius.multiply(2), radius,
arguments);
} }
}; };
}}); }});

View file

@ -13,25 +13,22 @@
Path.inject({ statics: new function() { Path.inject({ statics: new function() {
var kappa = Numerical.KAPPA, var kappa = Numerical.KAPPA,
halfKappa = kappa / 2,
ellipseSegments = [ ellipseSegments = [
new Segment([0, 0.5], [0, halfKappa ], [0, -halfKappa]), new Segment([-1, 0], [0, kappa ], [0, -kappa]),
new Segment([0.5, 0], [-halfKappa, 0], [halfKappa, 0 ]), new Segment([0, -1], [-kappa, 0], [kappa, 0 ]),
new Segment([1, 0.5], [0, -halfKappa], [0, halfKappa ]), new Segment([1, 0], [0, -kappa], [0, kappa ]),
new Segment([0.5, 1], [halfKappa, 0 ], [-halfKappa, 0]) new Segment([0, 1], [kappa, 0 ], [-kappa, 0])
]; ];
function createEllipse(rect, args) { function createEllipse(center, radius, args) {
var path = new Path(), var path = new Path(),
point = rect.getPoint(true),
size = rect.getSize(true),
segments = new Array(4); segments = new Array(4);
for (var i = 0; i < 4; i++) { for (var i = 0; i < 4; i++) {
var segment = ellipseSegments[i]; var segment = ellipseSegments[i];
segments[i] = new Segment( segments[i] = new Segment(
segment._point.multiply(size).add(point), segment._point.multiply(radius).add(center),
segment._handleIn.multiply(size), segment._handleIn.multiply(radius),
segment._handleOut.multiply(size) segment._handleOut.multiply(radius)
); );
} }
path._add(segments); path._add(segments);
@ -113,8 +110,7 @@ Path.inject({ statics: new function() {
Circle: function(/* center, radius */) { Circle: function(/* center, radius */) {
var center = Point.readNamed(arguments, 'center'), var center = Point.readNamed(arguments, 'center'),
radius = Base.readNamed(arguments, 'radius'); radius = Base.readNamed(arguments, 'radius');
return createEllipse(new Rectangle(center.subtract(radius), return createEllipse(center, new Size(radius), arguments);
new Size(radius * 2, radius * 2)), arguments);
}, },
/** /**
@ -286,16 +282,17 @@ Path.inject({ statics: new function() {
* }); * });
*/ */
Ellipse: function(/* rectangle */) { Ellipse: function(/* rectangle */) {
var rect; var center,
radius;
if (Base.hasNamed(arguments, 'center')) { if (Base.hasNamed(arguments, 'center')) {
var center = Point.readNamed(arguments, 'center'), center = Point.readNamed(arguments, 'center');
radius = Size.readNamed(arguments, 'radius'); radius = Size.readNamed(arguments, 'radius');
rect = new Rectangle(center.subtract(radius),
center.add(radius));
} else { } else {
rect = Rectangle.readNamed(arguments, 'rectangle'); var rect = Rectangle.readNamed(arguments, 'rectangle');
center = rect.getCenter(true);
radius = rect.getSize(true).divide(2);
} }
return createEllipse(rect, arguments); return createEllipse(center, radius, arguments);
}, },
/** /**