Q:

Scale and Draw texture to touch co-ordinates using libgdx

I am trying to draw a texture from the center of the screen to the touch co-ordinates (Clock hand). To illustrate this i  created a ShapeRenderer to create a line from the center  to touching point. Below the code
 if (Gdx.input.isTouched()) {
         camera.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));
         debugRenderer.begin(ShapeType.Line);
         debugRenderer.setColor(Color.ORANGE);
         debugRenderer.line(centerObject.x, centerObject.y, touchPoint.x, touchPoint.y);

         debugRenderer.end()
 } 

This works fine. Now i need to replace the line  with the actual image (which i need to scale based on the touch position). I have tried  drawing the texture from the center point.I thought using
public void draw (TextureRegion region, float x, float y, float originX, float originY, float width, float height,
    float scaleX, float scaleY, float rotation) 

of SpriteBatch help me to draw the texture. But  Its not working. Below the code
 private TextureRegion handRegion; 
private Texture handTexture;

 handTexture = new Texture(
                Gdx.files.internal("hand.png"));
 handRegion = new TextureRegion(handTexture);

 //origin_X,origin_Y are the center of the screen

if (Gdx.input.isTouched()) {
             camera.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));
             game.batch.begin();
             game.batch.draw(handRegion, touchPoint.x, touchPoint.y, origin_X, origin_Y,10,100,1,1,0);               
             game.batch.end();
     } 

I really appreciate any help solving this one.

A:

You need to calculate a rotation in degrees (0..360) for this.

Calculate a Vector from the center to your touch point.
Convert it to polar angle phi via Math.atan2(y,x)
Scale phi from [-PI..PI] to [0..360]
Add 90 because of different point of origins (?)

package com.me.mygdxgame.Screens;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector3;

public class HandScreen implements Screen{
    SpriteBatch batch = new SpriteBatch();
    OrthographicCamera camera;
    TextureRegion handRegion;
    Texture handTexture;
    Vector3 touchPoint = new Vector3(0,0,0);
    double rotation = 0;
    float width,height;
    @Override
    public void render(float delta) {

        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
        if (Gdx.input.isTouched()) {
             camera.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(),0));

             // the center of your hand
             Vector3 center = new Vector3(width/2,height/2,0);
             // you need a vector from the center to your touchpoint
             touchPoint.sub(center); 
             // now convert into polar angle                             
             rotation = Math.atan2(touchPoint.y, touchPoint.x);
             // rotation should now be between -PI and PI
             // so scale to 0..1
             rotation = (rotation + Math.PI)/(Math.PI * 2); 
             // SpriteBatch.draw needs degrees
             rotation *= 360;
             // add Offset because of reasons
             rotation += 90;
        }

        batch.begin();
        batch.draw(handRegion, 
                width/2, // x, center of rotation
                height/2, //y, center of rotation
                0, // origin x in the texture region
                0,// origin y in the texture region
                10, // width
                100, // height
                1, // scale x
                1,// scale y
                (float)rotation); // rotation !          
        batch.end();
     } 

    @Override
    public void show() {
        handTexture = new Texture(Gdx.files.internal("img/coin.png"));
        handRegion = new TextureRegion(handTexture);
        width = Gdx.graphics.getWidth();
        height = Gdx.graphics.getHeight();
        camera = new OrthographicCamera();       
        camera.viewportHeight = height;
        camera.viewportWidth = width;
        camera.position.set(camera.viewportWidth * .5f, camera.viewportHeight * .5f, 0f);  
        camera.update(); 

    }
    // rest of screen interface
    @Override
    public void hide() {

    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void dispose() {

    }
    @Override
    public void resize(int width, int height) {

    }

}

