|
@@ -224,9 +224,13 @@ THREE.SVGLoader.prototype = {
|
|
|
var numbers = parseFloats( data );
|
|
|
for ( var j = 0, jl = numbers.length; j < jl; j += 7 ) {
|
|
|
|
|
|
+ point.x = numbers[ j + 5 ];
|
|
|
+ point.y = numbers[ j + 6 ];
|
|
|
var radius = { x: numbers[ j ], y: numbers[ j + 1 ] };
|
|
|
- var end = { x: numbers[ j + 5 ], y: numbers[ j + 6 ] };
|
|
|
- svgEllipsisToThreeEllipsis( path, control, radius, numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], end );
|
|
|
+ var x_axis_rotation = numbers[ j + 2 ] * Math.PI / 180;
|
|
|
+ svgEllipsisToThreeEllipsis( path, control, radius, x_axis_rotation, numbers[ j + 3 ], numbers[ j + 4 ], point );
|
|
|
+ control.x = point.x;
|
|
|
+ control.y = point.y;
|
|
|
|
|
|
}
|
|
|
break;
|
|
@@ -386,7 +390,6 @@ THREE.SVGLoader.prototype = {
|
|
|
//Step 2: Ensure radii are positive
|
|
|
var rX = Math.abs( radius.x );
|
|
|
var rY = Math.abs( radius.y );
|
|
|
- //Step 3: Ensure radii are large enough looks like over engineering
|
|
|
|
|
|
// Step 1: Compute (x1′, y1′)
|
|
|
var midDist = new THREE.Vector2().subVectors( start, end ).multiplyScalar( 0.5 );
|
|
@@ -398,6 +401,18 @@ THREE.SVGLoader.prototype = {
|
|
|
var rys = rY * rY;
|
|
|
var x1ps = x1p * x1p;
|
|
|
var y1ps = y1p * y1p;
|
|
|
+
|
|
|
+ //Step 3: Ensure radii are large enough
|
|
|
+ var cr = x1ps / rxs + y1ps / rys;
|
|
|
+ if (cr > 1) {
|
|
|
+ //scale up rX,rY equally so cr == 1
|
|
|
+ var s = Math.sqrt(cr);
|
|
|
+ rX = s * rX;
|
|
|
+ rY = s * rY;
|
|
|
+ rxs = rX * rX;
|
|
|
+ rys = rY * rY;
|
|
|
+ }
|
|
|
+
|
|
|
var dq = ( rxs * y1ps + rys * x1ps );
|
|
|
var pq = ( rxs * rys - dq ) / dq;
|
|
|
var q = Math.sqrt( pq );
|