キャンバス上の一連のビットマップを特定の点を中心に回転させています。次の関数を使用して回転しています:
private void rotateGroupdAtPoint(ArrayList<MyBitmap> group, int degrees) {
// TODO Auto-generated method stub
float minx=100000,miny=100000,maxx=-100000,maxy=-100000;
for(int i = 0; i < group.size(); i++) {
MyBitmap m = group.get(i);
if(minx > m.getX()) {
minx = m.getX();
}
if(miny > m.getY()) {
miny = m.getY();
}
if(maxx < m.getX() + m.getBmp().getWidth()) {
maxx = m.getX() + m.getBmp().getWidth();
}
if(maxy < m.getY() + m.getBmp().getHeight()) {
maxy = m.getY() + m.getBmp().getHeight();
}
}
float x = (minx+maxx)/2;
float y = (miny+maxy)/2;
Log.d("minmax","min:"+minx+","+maxx+" max:"+miny+","+maxy);
for(int i = 0; i < group.size(); i++) {
Log.d("position before","x:" + group.get(i).getX() + ", y:" + group.get(i).getY());
float newx = (float)(((group.get(i).getX() - x) * Math.cos(Math.toRadians(degrees))) + ((group.get(i).getY() - y) * Math.sin(Math.toRadians(degrees)))) + x;
float newy = (float)(((group.get(i).getX() - x) * Math.sin(Math.toRadians(degrees))) - ((group.get(i).getY() - y) * Math.cos(Math.toRadians(degrees)))) + y;
group.get(i).setX(newx);
group.get(i).setY(newy);
group.get(i).setBmp(rotateBitmap(group.get(i).getBmp(), -90));
Log.d("position","x:" + group.get(i).getX() + ", y:" + group.get(i).getY());
}
}
private Bitmap rotateBitmap(Bitmap bmp, int degrees) {
if (degrees != 0 && bmp != null) {
Matrix matrix = new Matrix();
matrix.setRotate(degrees, (float) bmp.getWidth() / 2, (float) bmp.getHeight() / 2);
try {
Bitmap rotatedBmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
if (bmp != rotatedBmp) {
bmp.recycle();
bmp = rotatedBmp;
}
} catch (OutOfMemoryError ex) {
return null;
}
}
return bmp;
}
まず、すべてのビットマップに共通する中間点を見つけて、その点を中心に回転します。現在、オリエンテーションに問題はありません。それを行うためのコードも追加します。しかし、私の問題は、ビットマップが中心点を中心に目的の角度で適切に回転していないことです。誰かが私が間違っている場所を教えてくれますか?