Преглед изворни кода

x_axis_rotation is in degree, adding step 3, and correction for relative coords

Nicolas Debeissat пре 7 година
родитељ
комит
06cc500c2a
1 измењених фајлова са 18 додато и 3 уклоњено
  1. 18 3
      examples/js/loaders/SVGLoader.js

+ 18 - 3
examples/js/loaders/SVGLoader.js

@@ -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 );