2015-02-05 3 views
0

im пытается повернуть растровое изображение в соответствии с направлением движения на моем событии движения, скажем, у меня есть изображение автомобиля с высоты, я хочу, чтобы автомобиль столкнулся в направлении моего движения , если им двигаться влево он должен повернуть на 180 град, и до он должен обратиться к 90 и так далее, пожалуйста excuss мой плохой английский, IV удалось лишь повернуть изображение acording до 0 является центромПоверните растровое изображение в направлении движения

//this is how i rotate 
double ComputeAngle(float x, float y){ 
    final double RADS_TO_DEGREES = 360/(Math.PI * 2); 
    double result = Math.atan2(y,x) * RADS_TO_DEGREES; 

    if (result < 0){ 
     result = 360 + result; 
    } 
    return result; 
} 

//bitmap to rotate pretend its a car from top view 
Bitmap bitmap; 
//draws bitmap 
private final RectF tmpRF = new RectF(); 
final void drawStrokePoint(Canvas c, float x, float y, float r) { 
    tmpRF.set(x-r,y-r,x+r,y+r); 

    //compute rotation 
    float rotation = (float)ComputeAngle(x, y); 

    Matrix matrix = new Matrix(); 
    matrix.postTranslate(-bitmap.getWidth()/2, -bitmap.getHeight()/2); 
    matrix.postRotate(rotation); 
    matrix.postTranslate(x, y); 

    //draw bitmap 
    c.drawBitmap(mAirbrushBits, matrix, null); 
} 

//get x y cords and draw at x y position 
@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    float x = event.getX(); 
    float y = event.getY(); 

    switch (event.getAction() & MotionEvent.ACTION_MASK) 
    { 
     case MotionEvent.ACTION_DOWN: 

      strokeX = x; 
      strokeY = y; 

      break; 
     case MotionEvent.ACTION_POINTER_DOWN: 

      break; 
     case MotionEvent.ACTION_MOVE: 

      drawStrokePoint(drawCanvas, x, y, currentWidth); 

      break; 
     case MotionEvent.ACTION_UP: 

      break; 
     case MotionEvent.ACTION_POINTER_UP: 

      break; 
    } 

    return true; 
} 

ответ

0

в методе ComputeAngle вы не вычисляете правильный угол движения. Для этого вам понадобятся старые значения x и y. Метод будет выглядеть следующим образом:

double ComputeAngle(double x, double y, double oldX, double oldY){ 
    // calculates the direction vector 
    double directionX = x - oldX; 
    double directionY = y - oldY; 

    double vectorLenght = Math.sqrt(directionX * directionX + directionY * directionY); 

    // normalize the direction vector (coordinate/|v|) 
    double normalizedX = directionX/vectorLenght; 
    double normalizedY = directionY/vectorLenght; 

    //Obtains the angle relative to the vector over the axis X (1,0) 
    // The formula is the angle = scalar(v1, v2)/|v1||v2| 
    double angleRadians = (normalizedX)/Math.sqrt(normalizedX*normalizedX + normalizedY*normalizedY); 

    // This formula will give you a angle between 0 and 180, to obtain the other half you must check the direction 
    if (directionY < 0) 
     angleRadians += Math.PI; 

    return angleRadians * RADS_TO_DEGREES; 
} 
+0

Спасибо за переигрывая так быстро, я немного запутался с oldx, старый у, где я могу получить, что, плз простите мой английский, спасибо –

Смежные вопросы