opengl里的对球形的建模:首先要把球形表式由点组成的模型。现在的问题是:怎么把这个球用点集进行表示。
代码如下:
final int UNIT_SIZE=10000; ArrayList<Integer> alVertix=new ArrayList<Integer>();//存放顶点坐标的ArrayList final int angleSpan=18;//将球进行单位切分的角度 for(int vAngle=-90;vAngle<=90;vAngle=vAngle+angleSpan){//垂直方向angleSpan度一份 for(int hAngle=0;hAngle<360;hAngle=hAngle+angleSpan)//水平方向angleSpan度一份 {//纵向横向各到一个角度后计算对应的此点在球面上的坐标 double xozLength=scale*UNIT_SIZE*Math.cos(Math.toRadians(vAngle)); int x=(int)(xozLength*Math.cos(Math.toRadians(hAngle))); int z=(int)(xozLength*Math.sin(Math.toRadians(hAngle))); int y=(int)(scale*UNIT_SIZE*Math.sin(Math.toRadians(vAngle))); //将计算出来的XYZ坐标加入存放顶点坐标的ArrayList alVertix.add(x);alVertix.add(y);alVertix.add(z); } }
讲解:
1. 首先把球想成由很多的半径不一样的圆所组成的。把球想像成由很多平形于x,z平面的圆所组成的。
2. x,z轴的圆的角度是由0-360,y轴的变动由-90到90。
3. 在java里,三角函数要用弧度计算,而我们平实一般都是角度来计算。其实不管三角函数用的是角度和弧度,其都是度量的是角的大小,所以对于同一个角,其三角函数的值都是一样的(不管是用角度计算,还是用弧度计算)。所以sin(x)就不要注重其x是角度还是弧度,只要关心,其是由对边/斜边(前题是直角三角形)。
4. 如果对于计算球上每个点的坐标,不太理解,可以在笛卡尔级坐标系里,画一个点,再把这个点进行映射到三个坐标轴上去,就可以了。
注:角度和弧度的理解:http://hi.baidu.com/kent_edwin/blog/item/9425f0029e06967e3812bb28.html
From: http://www.cocoachina.com/newbie/basic/2012/0201/3926.html
以下为两张图片。如下:
适当的代码段添加如下annotation. MapAnnotation是实现了MKAnnotation的NSObject类:
CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);
MapAnnotation *annotation = [[MapAnnotation alloc] initWithcoordiante: coordinate];
[map_view addAnnotations: annotation];
[annotation release];
兄弟们,大家的程序框架都怎么样的啊?
我的是这样的:
BusinessController
BusinessService
BusinessListener
主要就这三个, 供其它的service和controller 继承。
BusinessController实现BusinessListener这个协议
BusinessService是BusinessController的成员变量,初始化的时候需要一个BusinessListener,一般传self
BusinessController主要就是发起网络异步请求 ,回来的时候通知初始化的时候需要一个BusinessListener
缺点:
1. 发起请求后,假如controller 立即释放 比如马上返回,这样回调的时候程序会爆掉。 需要在BusinessController 的dealloc方法里 把BusinessService 的 BusinessListener 设成nil
-(void) dealloc { if([self.service isKindOfClass:[BusinessService class]]) ((NDKBusinessService *)self.service).businessListener = nil; 。。。 。。。 }
2. 由于发出网络请求后,都会回到同一个回调方法。。。所以会有一堆的判断,以区别不同的请求, 比如
-(void) recentItems { actionType = ACTION_RECENT_ITEMS; //send request } - (void)requestFinished:(ASIHTTPRequest *)request { [super requestFinished:request]; switch (actionType) { case ACTION_RECENT_ITEMS: [self parseRecentItems:dict]; break; case ACTION_RECENT_ITEMS_AWAKE_FROM_BACK: [self parseRecentItems:dict]; break; 。。。 。。。 }
3. 同时发起多个异步请求不方便。 需要线性发送。 这个是这个框架的最大的问题。
举例说明:
self.service = [SerciceA alloc] initWithLisener:self]; [self.server invokeA]; //1 self.service = [SerciceB alloc] initWithLisener:self];//2 [self.service invokeB]; //3
用NSURLConnection没问题,用ASIHTTPRequest 会爆掉的,不信你可以试试,哈哈。。
原因是执行//3 的时候 SerciceA貌似会被release掉,没有被某个thread retain 住
替换方案:
1. 专门弄个thread, 开一个runloop, 专门用来发送请求和回调给controller.
这样做的好处有二
1). 省去了一堆的 actionType,因为是同步方法了
2). 可以同时发送多个请求。。。让runloop 来retain 那个service
缺点:
让runloop 发送请求的时候,传参数太麻烦了。。。
一般是这样的: 【self performSelector: onThread: withObject:waitUntilDone:] 看到withObject , 我表示很不淡定
2. 把异步请求全部改成同步请求