| 5733 | */ |
| 5734 | |
| 5735 | var ToPolar = function(src,dst,opt){ |
| 5736 | |
| 5737 | var srcPixels = src.data, |
| 5738 | dstPixels = dst.data, |
| 5739 | xSize = src.width, |
| 5740 | ySize = src.height, |
| 5741 | xMid = opt.polarCenterX || xSize/2, |
| 5742 | yMid = opt.polarCenterY || ySize/2, |
| 5743 | i, x, y, r=0,g=0,b=0,a=0; |
| 5744 | |
| 5745 | // Find the largest radius |
| 5746 | var rad, rMax = Math.sqrt( xMid*xMid + yMid*yMid ); |
| 5747 | x = xSize - xMid; |
| 5748 | y = ySize - yMid; |
| 5749 | rad = Math.sqrt( x*x + y*y ); |
| 5750 | rMax = (rad > rMax)?rad:rMax; |
| 5751 | |
| 5752 | // We'll be uisng y as the radius, and x as the angle (theta=t) |
| 5753 | var rSize = ySize, |
| 5754 | tSize = xSize, |
| 5755 | radius, theta; |
| 5756 | |
| 5757 | // We want to cover all angles (0-360) and we need to convert to |
| 5758 | // radians (*PI/180) |
| 5759 | var conversion = 360/tSize*Math.PI/180, sin, cos; |
| 5760 | |
| 5761 | // var x1, x2, x1i, x2i, y1, y2, y1i, y2i, scale; |
| 5762 | |
| 5763 | for( theta=0; theta<tSize; theta+=1 ){ |
| 5764 | sin = Math.sin(theta*conversion); |
| 5765 | cos = Math.cos(theta*conversion); |
| 5766 | for( radius=0; radius<rSize; radius+=1 ){ |
| 5767 | x = Math.floor(xMid+rMax*radius/rSize*cos); |
| 5768 | y = Math.floor(yMid+rMax*radius/rSize*sin); |
| 5769 | i = (y*xSize + x)*4; |
| 5770 | r = srcPixels[i+0]; |
| 5771 | g = srcPixels[i+1]; |
| 5772 | b = srcPixels[i+2]; |
| 5773 | a = srcPixels[i+3]; |
| 5774 | |
| 5775 | // Store it |
| 5776 | //i = (theta * xSize + radius) * 4; |
| 5777 | i = (theta + radius*xSize) * 4; |
| 5778 | dstPixels[i+0] = r; |
| 5779 | dstPixels[i+1] = g; |
| 5780 | dstPixels[i+2] = b; |
| 5781 | dstPixels[i+3] = a; |
| 5782 | |
| 5783 | } |
| 5784 | } |
| 5785 | }; |
| 5786 | |
| 5787 | /* |
| 5788 | * FromPolar Filter. Converts image data from polar coordinates back to rectangular. |