Created
July 30, 2011 22:21
-
-
Save soney/1116072 to your computer and use it in GitHub Desktop.
Gets a rounded shape in the form of an SVG Path
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var get_rounded_rectangular_shape = function(points, r) { | |
var sb; | |
if(r === 0) { | |
sb = new Array(3*(points.length+1)); | |
//Set up a move to and a line to the initial point | |
sb[0] = "M"; | |
sb[3*points.length] = "L"; | |
sb[1] = sb[3*points.length + 1] = points[0][0]; | |
sb[2] = sb[3*points.length + 2] = points[0][1]; | |
for(var i = 1, len = points.length; i<len; i++) { | |
var p = points[i]; var px = p[0]; var py = p[1]; | |
sb[3*i] = "L"; | |
sb[3*i+1] = px; | |
sb[3*i+2] = py; | |
} | |
} else { | |
var sb = []; | |
var r_2_squared = 4*r*r; | |
for(var i = 0, len = points.length; i<len; i++) { | |
var before_i = i === 0 ? len - 1 : i-1; | |
var after_i = i === len - 1 ? 0 : i+1; | |
var p1 = points[before_i]; var p1x = p1[0]; var p1y = p1[1]; | |
var p2 = points[i]; var p2x = p2[0]; var p2y = p2[1]; | |
var p3 = points[after_i]; var p3x = p3[0]; var p3y = p3[1]; | |
var t1 = Math.atan2(p1y-p2y,p1x-p2x); | |
var t2 = Math.atan2(p3y-p2y,p3x-p2x); | |
var p1p2dx = p2x - p1x; var p1p2dy = p2y - p1y; var p1_p2_dist_squared = p1p2dx*p1p2dx + p1p2dy*p1p2dy; | |
var p1p2r = p1_p2_dist_squared > r_2_squared ? r : Math.sqrt(p1_p2_dist_squared) / 2.0; | |
var dx_before_p2 = p1p2r * Math.cos(t1); | |
var dy_before_p2 = p1p2r * Math.sin(t1); | |
var p2p3dx = p3x - p2x; var p2p3dy = p3y - p2y; var p2_p3_dist_squared = p2p3dx*p2p3dx + p2p3dy*p2p3dy; | |
var p2p3r = p2_p3_dist_squared > r_2_squared ? r : Math.sqrt(p2_p3_dist_squared) / 2.0; | |
var dx_after_p2 = p2p3r * Math.cos(t2); | |
var dy_after_p2 = p2p3r * Math.sin(t2); | |
var dx_after_p1 = -dx_before_p2; | |
var dy_after_p1 = -dy_before_p2; | |
var p1_p3_dy = p1y-p3y; | |
var p1_p3_dx = p1x-p3x; | |
var p1_p3_dist_squared = p1_p3_dy * p1_p3_dy + p1_p3_dx * p1_p3_dx; | |
if(i === 0) { | |
var move_command = ["M", p1x + dx_after_p1, p1y + dy_after_p1]; | |
sb.push.apply(sb, move_command); | |
} | |
var line_command = ["L", p2x + dx_before_p2, p2y + dy_before_p2]; | |
var curve_command = ["S", p2x, p2y, p2x + dx_after_p2, p2y + dy_after_p2]; | |
sb.push.apply(sb, line_command); | |
sb.push.apply(sb, curve_command); | |
} | |
} | |
return sb; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment