large image rotation in corona

503 views Asked by At

i have an image with size 1162 x 16 which i want to rotate on the touch "moved phase" event , the problem is that when the image rotates it gets scrambled "pixelated", although it is not getting scaled , i tried with an image of size 128 x 128 but the image was not pixelated, could it be due to the large size of the image !!

does the rotation affect the image structure??? anyone has an idea why that happens???

or if anyone has a workaround ,, would you please help me with that .

here is the updated code after making it square :

local bck = display.newRect (0,0,display.contentWidth,display.contentHeight)
bck.x = display.contentWidth * 0.5
bck.y = display.contentHeight * 0.5
bck:setFillColor (255,255,255)

local img = display.newImageRect ("laser1.png",1170,1170)
img.x = display.contentWidth * 0.5
img.y = display.contentHeight * 0.5


local  function getRotation(PointX1,PointY1,PointX2,PointY2)
  --display.getCurrentStage():setFocus ( Bug )
  local atan2 = math.atan2
  local pi = 3.14159265358

  local deltax = PointX2 - PointX1
  local deltay = PointY2 - PointY1

  local currentAngle = ((atan2(deltay,deltax) )* 180.0) / pi
  local rotationDigree = currentAngle - img.previousAngle;

  img.previousAngle  = currentAngle

  return rotationDigree;
 end

local function handleTouch ( event )
 img.previousAngle = 1
 if( event.phase == "moved" ) then
    img.rotation = getRotation ( img.x , img.y , event.x , event.y )
 end
end


Runtime:addEventListener ("touch",handleTouch)       
1

There are 1 answers

2
ChrisF On

Your image is not square. This means that when you rotate by 90 degrees (say) you are trying to fit a 16 x 1162 image into a space that's 1162 x 16.

This means that the image is being squashed in one dimension and stretched in the other.

You need to make both the source and target images 1162 x 1162 adding a border, either transparent or some known colour not in the original image so you can remove it once the rotation is complete.

The test image of 128 x 128 works because it's square.