我希望你是我独家记忆

一段永远封存的记忆,随风而去
posts - 263, comments - 31, trackbacks - 0, articles - 3
   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理

google map api 编码折线算法

Posted on 2009-08-13 17:21 Hero 阅读(710) 评论(0)  编辑 收藏 引用

今天用C#写了google map api 编码折线算法,C#用的很不习惯,感觉还是C++的好用,中文的翻译让我很难读懂,如果有错误,请指正

http://code.google.com/intl/zh-CN/apis/maps/documentation/polylinealgorithm.html

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 
  5 namespace ConsoleApplication1
  6 {
  7     class Program
  8     {
  9         static string trans( double source )
 10         {
 11             //获得绝对值
 12             int absSource ;
 13             if ( source >= 0 )
 14             {
 15                 absSource = (int)( source * 100000 + 0.5 );
 16             }
 17             else
 18             {
 19                 absSource = (int)( source * 100000 - 0.5 ) ;
 20             }
 21             absSource = Math.Abs( absSource );
 22             //Console.WriteLine( absSource );
 23 
 24             //获得二进制
 25             StringBuilder binstring1 = new StringBuilder();
 26             binstring1.Append( Convert.ToString( absSource, 2 ) );
 27             //Console.WriteLine( binstring1 );
 28 
 29             StringBuilder binstring2 = new StringBuilder();
 30             for ( int i = 0; i < 32-binstring1.Length; i++ )
 31             {
 32                 binstring2.Append( "0" );
 33             }
 34             binstring2.Append( binstring1 ) ;
 35             //Console.WriteLine( binstring2 ) ;
 36 
 37             //如果是负数 -- 取反加1
 38             if ( source < 0 )
 39             {
 40                 //Console.WriteLine( "负数 -- 取反加一" );
 41                 for ( int i = 0; i < binstring2.Length; i++ )
 42                 {
 43                     if ( '0' == binstring2[i] ) binstring2[i] = '1';
 44                     else binstring2[i] = '0';
 45                 }
 46                 //Console.WriteLine( binstring2 ) ;
 47                 int carry = 1
 48                 //binstring2[binstring2.Length - 1]++;
 49                 for ( int i = binstring2.Length - 1 ; i >= 0; i-- )
 50                 {
 51                     while( carry > 0 )
 52                     {
 53                         carry = carry - 1 ;
 54                         binstring2[i] ++ ;
 55                     }
 56 
 57                     if ( '2' == binstring2[i] )
 58                     {
 59                         carry = 1;
 60                         binstring2[i] = '0';
 61                     }
 62                     else
 63                     {
 64                         carry = 0;
 65                     }
 66                 }
 67                 if( carry > 0 )
 68                 {
 69                     binstring2.Insert( 0'1' ) ;
 70                 }
 71                 //Console.WriteLine( binstring2 ) ;
 72             }//取反加一
 73 
 74             //变换二进制值
 75             binstring2.Append( "0" ) ;
 76             //Console.WriteLine( binstring2 ) ;
 77 
 78             //如果原来是负数 -- 对编码求反
 79             if( source < 0 )
 80             {
 81                 forint i=0; i<binstring2.Length; i++ )
 82                 {
 83                     if'0' == binstring2[i] ) binstring2[i] = '1' ;
 84                     else binstring2[i] = '0' ;
 85                 }
 86 
 87                 //Console.WriteLine( "负数 -- 对编码求反" ) ;
 88                 //Console.WriteLine( binstring2 ) ;
 89             }
 90 
 91             //从右侧开始五五分组
 92             int[] num = new int[10] ; int cnum = 0 ;
 93             string[] strnum = new string[10] ;
 94 
 95             string binstr = binstring2.ToString();
 96             forint i=binstring2.Length, count=0; i>=0; i--, count++ )
 97             {
 98                 if5 == count || 0 == i )
 99                 {                    
100                     //strnum[cnum++] = binstring1.ToString() ;
101                     binstring1.Remove( 0, binstring1.Length ) ;
102                     binstring1.Append( binstr, i, count );
103                     strnum[cnum++= binstring1.ToString();
104                     //Console.WriteLine( strnum[cnum-1] ) ;
105                     count = 0;
106                 }
107             }
108 
109             //去除最后的 0 块
110             forint i=cnum-1; i>0; i-- )
111             {
112                 bool del = true ;
113                 foreach ( char var in strnum[i] )
114                 {
115                     if( var != '0' ) del = false ;
116                 }
117 
118                 if( del ) cnum-- ;
119                 else break ;
120             }
121             //Console.WriteLine( cnum ) ;
122             
123 
124             //与0x20或
125             forint i=0; i<cnum; i++ )
126             {
127                 if( i != cnum - 1 )
128                 {
129                     num[i] = Convert.ToInt32( strnum[i], 2 ) ;
130                     num[i] = num[i] | 0x20 ;
131                 }
132                 else
133                 {
134                     num[i] = Convert.ToInt32( strnum[i], 2 ) ;
135                 }
136                 
137                 num[i] += 63 ;
138                 //Console.WriteLine( num[i] ) ;
139             }
140 
141             StringBuilder restring = new StringBuilder() ;
142             for ( int i = 0; i < cnum; i++ )
143             {
144                 restring.Append( Convert.ToChar( num[i] ) );
145             }
146 
147             return restring.ToString();           
148         }
149        
150 
151         static void Main( string[] args )
152         {            
153             //string input = null ;
154             //while ( (input = Console.ReadLine().Trim().ToUpper() ) != "Q" )
155             //{
156             //    double x = Convert.ToDouble( input.Trim() );
157             //   Console.WriteLine( trans( x ) );
158             //}
159 
160             Console.WriteLine( trans(38.5) );
161             Console.WriteLine( trans(-120.2) );
162             Console.WriteLine( trans( 40.7-38.5 ) );
163             Console.WriteLine( trans( -120.95 - (-120.2) ) );
164             Console.WriteLine( trans( 43.252-40.7 ) );
165             Console.WriteLine( trans( -126.453-(-120.95) ) );
166         }
167     }
168 }

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理