找回密码
 欢迎注册
楼主: gxqcn

[讨论] 图像原地旋转 -90°算法

[复制链接]
 楼主| 发表于 2009-5-2 09:08:16 | 显示全部楼层

更优化的版本

  1. /* 对应帖号:http://bbs.emath.ac.cn/viewthread.php?tid=1437&page=2&fromuid=8#pid18832 */
  2. /* 算法功能:矩阵原地逆时针旋转90度(矩阵原地转置、顺时针旋转90度等均可参考) */
  3. /* 算法优化:郭先强 */
  4. /* 修订日期:2009-05-02 */

  5. #include <stdio.h>
  6. #include <stdlib.h>

  7. void output( int *a, int w, int h )
  8. {
  9.     int i, j;
  10.     for ( i=0; i<h; ++i )
  11.     {
  12.         for( j=0; j<w; ++j )
  13.         {
  14.             printf( "%d ", a[i*w+j] );
  15.         }
  16.         printf( "\n" );
  17.     }
  18.     printf( "\n" );
  19. }

  20. void transf( int *a, int w, int h )
  21. {
  22.     int k, pos, t, c=w*h;
  23.     div_t xy;

  24. #define TRANSF(pos,w,h)     xy = div( pos, w ); pos = (w-1-xy.rem)*h + xy.quot;

  25.     for( k=0; ; ++k )
  26.     {
  27.         pos = k;
  28.         do
  29.         {
  30.             TRANSF( pos, w, h );
  31.         } while( pos > k );

  32.         if( pos == k )
  33.         {
  34.             t = a[k];
  35.             do
  36.             {
  37.                 TRANSF( pos, w, h );

  38.                 a[pos] ^= t ^= a[pos] ^= t;
  39.                 --c;
  40.             } while( pos != k );

  41.             if ( c <= 1 )
  42.                 break;
  43.         }
  44.     }

  45. #undef TRANSF
  46. }

  47. int main()
  48. {
  49.     int w=12, h=16, i, j;
  50.     int *a = malloc( w*h*sizeof(int) );

  51.     for( i=0; i<h; ++i )
  52.     {
  53.         for( j=0; j<w; ++j )
  54.         {
  55.             a[i*w+j]=i*w+j+1;
  56.         }
  57.     }

  58.     output( a, w, h );
  59.     transf( a, w, h );//旋转
  60.     output( a, h, w );

  61.     free( a );

  62.     return 0;
  63. }
复制代码
此算法相对于 6#,最大的改进是可以提前结束循环。

如果用一个数组标记矩阵各元素是否被置换,则可以更快地判断某些位置上的元素是否已置换,但需多耗元素总数1/8字节的空间;
当然,如果空间充裕,可以另开一个等大的空间,则不存在读写有overlap的问题,算法设计更容易,效率也更高。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-5-4 08:44:59 | 显示全部楼层
一圈圈转吧
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-5-5 07:48:35 | 显示全部楼层
不是简单意义上的转圈圈,

它要考虑二维变换的几何意义,
又要考虑数据存储的一维特征,
一般人很容易绕晕的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-5-5 17:59:10 | 显示全部楼层
设计好了就行
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-7 11:05 , Processed in 0.055658 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表