| 5802 | */ |
| 5803 | |
| 5804 | var FromPolar = function(src,dst,opt){ |
| 5805 | |
| 5806 | var srcPixels = src.data, |
| 5807 | dstPixels = dst.data, |
| 5808 | xSize = src.width, |
| 5809 | ySize = src.height, |
| 5810 | xMid = opt.polarCenterX || xSize/2, |
| 5811 | yMid = opt.polarCenterY || ySize/2, |
| 5812 | i, x, y, dx, dy, r=0,g=0,b=0,a=0; |
| 5813 | |
| 5814 | |
| 5815 | // Find the largest radius |
| 5816 | var rad, rMax = Math.sqrt( xMid*xMid + yMid*yMid ); |
| 5817 | x = xSize - xMid; |
| 5818 | y = ySize - yMid; |
| 5819 | rad = Math.sqrt( x*x + y*y ); |
| 5820 | rMax = (rad > rMax)?rad:rMax; |
| 5821 | |
| 5822 | // We'll be uisng x as the radius, and y as the angle (theta=t) |
| 5823 | var rSize = ySize, |
| 5824 | tSize = xSize, |
| 5825 | radius, theta, |
| 5826 | phaseShift = opt.polarRotation || 0; |
| 5827 | |
| 5828 | // We need to convert to degrees and we need to make sure |
| 5829 | // it's between (0-360) |
| 5830 | // var conversion = tSize/360*180/Math.PI; |
| 5831 | //var conversion = tSize/360*180/Math.PI; |
| 5832 | |
| 5833 | var x1, y1; |
| 5834 | |
| 5835 | for( x=0; x<xSize; x+=1 ){ |
| 5836 | for( y=0; y<ySize; y+=1 ){ |
| 5837 | dx = x - xMid; |
| 5838 | dy = y - yMid; |
| 5839 | radius = Math.sqrt(dx*dx + dy*dy)*rSize/rMax; |
| 5840 | theta = (Math.atan2(dy,dx)*180/Math.PI + 360 + phaseShift)%360; |
| 5841 | theta = theta*tSize/360; |
| 5842 | x1 = Math.floor(theta); |
| 5843 | y1 = Math.floor(radius); |
| 5844 | i = (y1*xSize + x1)*4; |
| 5845 | r = srcPixels[i+0]; |
| 5846 | g = srcPixels[i+1]; |
| 5847 | b = srcPixels[i+2]; |
| 5848 | a = srcPixels[i+3]; |
| 5849 | |
| 5850 | // Store it |
| 5851 | i = (y*xSize + x)*4; |
| 5852 | dstPixels[i+0] = r; |
| 5853 | dstPixels[i+1] = g; |
| 5854 | dstPixels[i+2] = b; |
| 5855 | dstPixels[i+3] = a; |
| 5856 | } |
| 5857 | } |
| 5858 | |
| 5859 | }; |
| 5860 | |
| 5861 | //Kinetic.Filters.ToPolar = Kinetic.Util._FilterWrapDoubleBuffer(ToPolar); |