一个用来翻转、旋转的矩阵类
2005-03-23 10:52
435 查看
template<typename T>
class LMatrix
{
int m_x;
int m_y;
T *m_data;
public:
// 构造函数,横坐标范围0~(x - 1),纵坐标范围0~(y - 1)
LMatrix(int x, int y) : m_x(x), m_y(y), m_data(new T[x * y]) {}
// 析构函数
~LMatrix()
{
delete[] m_data;
}
// 取值
T GetAt(int x, int y)
{
return m_data[y * m_x + x];
}
// 设置值
void SetAt(int x, int y, T value)
{
m_data[y * m_x + x] = value;
}
// 左转90度
void RolLeft()
{
T *p = new T[m_x * m_y];
int i, j, t;
for (j = 0; j < m_x; j++)
{
for (i = 0; i < m_y; i++)
{
p[j * m_y + i] = m_data[i * m_x + m_y - j];
}
}
t = m_x;
m_x = m_y;
m_y = t;
delete[] m_data;
m_data = p;
}
// 右转90度
void RolRight()
{
T *p = new T[m_x * m_y];
int i, j, t;
for (j = 0; j < m_x; j++)
{
for (i = 0; i < m_y; i++)
{
p[j * m_y + i] = m_data[(m_y - i - 1) * m_x + j];
}
}
t = m_x;
m_x = m_y;
m_y = t;
delete[] m_data;
m_data = p;
}
// 向下旋转
void RolDown()
{
int i, t;
int n = m_x * m_y;
int m = n / 2;
for (i = 0; i < m; i++)
{
t = m_data[i];
m_data[i] = m_data[n - i - 1];
m_data[n - i - 1] = t;
}
}
// 水平翻转
void HorTurn()
{
int i, j, t;
int n = m_x / 2;
for (j = 0; j < m_y; j++)
{
for (i = 0; i < n; i++)
{
t = m_data[j * m_x + i];
m_data[j * m_x + i] = m_data[(j + 1) * m_x - i - 1];
m_data[(j + 1) * m_x - i - 1] = t;
}
}
}
// 垂直翻转
void VerTurn()
{
int i, j, t;
int n = m_y / 2;
for (i = 0; i < m_x; i++)
{
for (j = 0; j < n; j++)
{
t = m_data[j * m_x + i];
m_data[j * m_x + i] = m_data[(m_y - j - 1) * m_x + i];
m_data[(m_y - j - 1) * m_x + i] = t;
}
}
}
};
class LMatrix
{
int m_x;
int m_y;
T *m_data;
public:
// 构造函数,横坐标范围0~(x - 1),纵坐标范围0~(y - 1)
LMatrix(int x, int y) : m_x(x), m_y(y), m_data(new T[x * y]) {}
// 析构函数
~LMatrix()
{
delete[] m_data;
}
// 取值
T GetAt(int x, int y)
{
return m_data[y * m_x + x];
}
// 设置值
void SetAt(int x, int y, T value)
{
m_data[y * m_x + x] = value;
}
// 左转90度
void RolLeft()
{
T *p = new T[m_x * m_y];
int i, j, t;
for (j = 0; j < m_x; j++)
{
for (i = 0; i < m_y; i++)
{
p[j * m_y + i] = m_data[i * m_x + m_y - j];
}
}
t = m_x;
m_x = m_y;
m_y = t;
delete[] m_data;
m_data = p;
}
// 右转90度
void RolRight()
{
T *p = new T[m_x * m_y];
int i, j, t;
for (j = 0; j < m_x; j++)
{
for (i = 0; i < m_y; i++)
{
p[j * m_y + i] = m_data[(m_y - i - 1) * m_x + j];
}
}
t = m_x;
m_x = m_y;
m_y = t;
delete[] m_data;
m_data = p;
}
// 向下旋转
void RolDown()
{
int i, t;
int n = m_x * m_y;
int m = n / 2;
for (i = 0; i < m; i++)
{
t = m_data[i];
m_data[i] = m_data[n - i - 1];
m_data[n - i - 1] = t;
}
}
// 水平翻转
void HorTurn()
{
int i, j, t;
int n = m_x / 2;
for (j = 0; j < m_y; j++)
{
for (i = 0; i < n; i++)
{
t = m_data[j * m_x + i];
m_data[j * m_x + i] = m_data[(j + 1) * m_x - i - 1];
m_data[(j + 1) * m_x - i - 1] = t;
}
}
}
// 垂直翻转
void VerTurn()
{
int i, j, t;
int n = m_y / 2;
for (i = 0; i < m_x; i++)
{
for (j = 0; j < n; j++)
{
t = m_data[j * m_x + i];
m_data[j * m_x + i] = m_data[(m_y - j - 1) * m_x + i];
m_data[(m_y - j - 1) * m_x + i] = t;
}
}
}
};
相关文章推荐
- 一个用来翻转、旋转的矩阵类
- 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。 给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转
- 网上看到的题:用最小空间度将一个M*N的矩阵旋转90度
- java__晓萌最近在做一个翻转图片的应用,你可能也知道,图片其实是由一个个的点组成的。于是,晓萌想先做一个可以翻转矩阵的程序,来解决他问题的核心部分。
- 使用一个额外变量解决”请用最少的额外空间将一个M*N的矩阵旋转90度“
- 输入一个n*n的字符矩阵,把它逆时针旋转90度后输出:
- 旋转一个矩阵
- 翻转子串 假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。
- 1.6 将一个NxN矩阵向右旋转90度
- 以旋转的方式输出一个矩阵中的元素
- Raphaël 是一个小型的 JavaScript 库,用来简化在页面上显示向量图的工作。你可以用它在页面上绘制各种图表、并进行图片的剪切、旋转等操作。
- Nyoj 298 点的变换[利用矩阵求解坐标点的转换,平移,绕原点旋转,沿x,y轴翻转]
- 一个小矩阵的翻转t=1为上下翻转, t=0为左右翻转
- 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中
- 矩阵翻转的一个例子(C++)
- 伸展树的学习(六):伸展树的区间操作(区间翻转,旋转,增加一个数,求最小值)
- 一张图像表示成NxN的矩阵,图像中每个像素是4个字节,写一个函数把图像旋转90度。 你能原地进行操作吗?(即不开辟额外的存储空间)
- 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。
- Matlab与线性代数 -- 矩阵的左右翻转、上下翻转和矩阵的逆时针旋转90操作
- 输入一个n*n的字符矩阵,把它逆时针旋转90度后输出