找回密码
 欢迎注册
楼主: 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-11-23 20:38 , Processed in 0.019955 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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