但是置换的规律太难找了,呵呵
这样只需要增加一个像素的临时空间
[此贴子已经被作者于2007-8-9 13:32:53编辑过]
![](/skin/img/sigline.gif)
呵呵,我想明白了。不过这样空间是省了,但实现可能太慢了。
我没有看动JIG的算法。自己想了个,大家看看行不。这个办法理论上非常好,可是我有个地方没解决,内存开销回比较大,但是能满足LZ的要求。
原始图像
a b c d
e f g h
i j k l
int w1 = 4;
int h1=- 3;
BYTE pdata[] = { a, b, c, d, e, f, g, h, i, j, k, l };
旋转后的图像
i e a
j f b
k g c
l h d
int w2 = 3;
int h2 = 4;
BYTE pdata[] = { i, e, a, j, f, b, k, g, c, l, h, d };
JIG也说过了,转换的规律是
X1=y0;
Y1=w2-1-x0;
(x0,y0,x1,y1分别是转换前后的坐标,没有考虑字长),称为公式1
原始图像:
|(0,0),(0,1),(0,2),(0,3)|
|(1,0),(1,1),(1,2),(1,3)|
|(2,0),(2,1),(2,2),(2,3)| int w1 = 4; int h1=- 3;
旋转后的图像:
|(2,0)/ (0,0),(1,0)/ (0,1),(0,0)/ (0,2)|
|(2,1)/ (1,0),(1,1)/ (1,1),(0,1)/ (1,2)|
|(2,2)/ (2,0),(1,2)/ (2,1),(0,2)/(2,2)|
|(23)/ (3,0),(1,3)/ (3,1),(0,3)/(3,2)| int w2 = 3;int h2 = 4;
/前面是转换后的数据在转换前数组中的坐标,/后是在新数组中的坐标;
由于BYTE pdata[] = { a, b, c, d, e, f, g, h, i, j, k, l }一维的形式按行顺序存放,所以位置需要转换一下,
公式为:
x2=(x1*w2+y1)/w1;
y2=(x1*w2+y1)-y2*w1;
称为公式2
(0,0)(原图像中的位子)---公式1---(0,2)(现在图像中的位子)-- 公式2---(0,2) (原来图像中被占用的数据位子,也是第二次原图像中的位子)----公式1--(2,2) (第二次 现在图像中的位子) -- 公式2---(2,0)(依次类推……) ---公式1-(0,0) (依次类推……)
注意现在开始循环了。这是我刚开始时没想到的,我以为它会持续下去直到完成。
0 1 2
0 |(2,0), ,(0,0)|
1 | , , |
2 | , ,(0,2)|
3 | , , |
这是一次循环所填的点,在做几次循环就可以完成整个数组填充。现在麻烦有两个:
1:如何判断已经完成整个数组填充?
2:起始点如何选择?
对于第一个问题可以设置一个变量,在每填充一次计一次数,让它和总数比较,用以判断是否完成。这个应该难度不大。 第二个问题我还没有解答,我试过数组的对角线,边线上的点的坐标作为起始点,但是遗憾没有完全包含整个数组。想到了最笨的办法,就是将每个点都假设为起始点,建立一个数组START[4000000][2] 刚好是LZ剩下的八M空间,元素为(0,0),(0,1),(0,2)……….(1998,1999),(1999,1999),然后进行前面描述的循环,每填充一个点,便在START数组中删掉相应坐标,完成一次循环后在START数组中拿第二个点做起始点开始下一次循环,同时删掉第一个起始点,直到START数组为空。
这是没办法的办法,如果能找到办法提取所有的起始点坐标那就完美了,最多需要几十K的空间,那像这笨办法要那么多的空间。
有不妥的地方请大家明示!!!