📄 rotation.java
字号:
package com.midp;
import java.lang.Math;
public class Rotation {
public static int TRANSPARENT = 0;
/**
* 解决坏点的基本实现,没有考虑效率
* @param _pixels
* @param _width
* @param _height
* @param _angle
* @return
*/
public static int[] rotate1(int[] _pixels,int _width,int _height,double _angle)
{
int i,j;
double radius = Math.sqrt(_width*_width + _height*_height);
int r = (int)radius;
int[] newPixels = new int[r*r];
for(i = 0; i < newPixels.length;i++)
{
newPixels[i] = (TRANSPARENT)<<24;
}
double x1,y1;
int x2,y2;
double cos = Math.cos(_angle);
double sin = Math.sin(_angle);
for(i = 0;i < r;i++)
{
for(j = 0;j < r;j++)
{
x1 = j + (- r)/2;
y1 = i + (- r)/2;
x2 = (int)(x1*cos + y1*sin);
y2 = (int)(-x1*sin + y1*cos);
if(x2 >= -_width/2&&x2< _width/2&&y2 >= -_height/2&&y2< _height/2)
{
int k = (y2 + _height/2)*_width+x2+_width/2;
newPixels[i*r + j] = _pixels[k];
}
}
}
return newPixels;
}
/**
* 该算法存在坏点
* @param _pixels
* @param _width
* @param _height
* @param _angle
* @return
*/
public static int[] rotate2(int[] _pixels,int _width,int _height,double _angle)
{
int i,j;
double radius = Math.sqrt(_width*_width + _height*_height);
int r = (int)radius;
int[] newPixels = new int[r*r];
for(i = 0; i < newPixels.length;i++)
{
newPixels[i] = (TRANSPARENT)<<24;
}
double x1,y1;
int x2,y2;
double cos = Math.cos(_angle);
double sin = Math.sin(_angle);
for(i = 0; i < _height;i++)
{
for(j = 0;j < _width;j++)
{
x1 = j + (- _width)/2;
y1 = i + (- _height)/2;
x2 = (int)(x1*cos - y1*sin);
y2 = (int)(x1*sin + y1*cos);
x2 += r/2;
y2 += r/2;
newPixels[y2*r+x2] = _pixels[i*_width+j];
}
}
return newPixels;
}
/**
* 优化以后的算法
* @param _pixels
* @param _width
* @param _height
* @param _angle
* @return
*/
public static int[] rotate3(int[] _pixels,int _width,int _height,double _angle)
{
int i,j;
double radius = Math.sqrt(_width*_width + _height*_height);
int r = (int)radius;
int[] newPixels = new int[r*r];
for(i = 0; i < newPixels.length;i++)
{
newPixels[i] = (TRANSPARENT)<<24;
}
double x2,y2;
int x3,y3;
double cos = Math.cos(_angle);
double sin = Math.sin(_angle);
for(i = 0;i < r;i++)
{
x2 = (-r/2)*cos + (i - r/2)*sin;
y2 = (r/2)*sin + (i - r/2)*cos;
x3 = (int)x2;
y3 = (int)y2;
for(j = 0;j < r;j++)
{
if(x3 >= -_width/2&&x3< _width/2&&y3 >= -_height/2&&y3< _height/2)
{
newPixels[i*r + j] = _pixels[(y3 + _height/2)*_width+x3+_width/2];
}
x2 += cos;
y2 -= sin;
x3 = (int)x2;
y3 = (int)y2;
}
}
return newPixels;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -