1.网上有很多求投影矩阵的方法,大都粗略的很,没有一个系统的概念。也许用高中的三角形相似来求这个矩阵,仅仅拥有高中知识的人可以接受,但是,其理论基础很差:
OB/OD = BA/DC.由此推导出A的y坐标.A的X坐标的推导方法类似。这种方法比较原始。y‘ = y*near/z;
x' = x*near/z;
简单吧。但是为什么那个透视投影矩阵那么复杂呢:
2.
现在有一种需求,就是求任意一个点,沿着任意一个方向,到任意一个平面的投影!
这个是非常重要的需求。特别是再碰撞检测中。
用向量法和点积求交点。
所求的点=直线上得点+t*直线方向向量
(所求的点-平面已知点)点乘 (平面法线) = 0
求得t。然后求得所求的点。
UIScrollView,点击、滑动翻页事件的区分
http://blog.csdn.net/gavinming/article/details/6552565
最近看到有人问这个问题:在UIScrollView上添加了一个View,View上面有图片等元素,需要对单击和滑动事件进行区分。这样的问题有以下几个经常会用到的地方:
(1)点击UIScrollView上的图片,跳转到其他页面;同时不影响UIScrollView的滑动操作。
(2)在阅读浏览类产品会经常用到,点击屏幕的中间区域,隐藏/显示状态栏或导航条;同时不影响UIScrollView的滑动翻页操作。
有解决方法事在点击区域添加一个透明的Button,但个人感觉比较复杂,而且效果并不好。以下是我个人的解决方法:
首先了解下UIScrollView对于touch事件的接收处理原理:UIScrollView重载hitTest 方法,并总会返回itself 。所以所有的touch 事件都会进入到它自己里面去了。内部的touch事件检测到这个事件是不是和自己相关的,或者处理或者除递给内部的view。
为了检测touch是处理还是传递,UIScrollView当touch产生一个timer。
(1)如果150ms内touch未产生移动,它就把这个事件传递给内部view;
(2)如果150ms内touch产生移动,开始scrolling,不会传递给内部的view。(如当你touch一个table时候,直接scrolling,你touch的那行永远不会highlight。)
(3)如果150ms内touch未产生移动并且UIScrollView开始传递内部的view事件,但是移动足够远的话,且canCancelContentTouches = YES,UIScrollView会调用touchesCancelled方法,cancel掉内部view的事件响应,并开始scrolling。(如当你touch一个table, 停止了一会,然后开始scrolling,那一行就首先被highlight,但是随后就不在高亮了)
先前提到的在UIScrollView内部的view点击区域添加透明Button的解决方法,就是需要设置canCancelContentTouches = YES,而且还需重写UIScrollView的touchesShouldCancelInContentView:(UIView *)view方法,在view为UIButton的时候,返回YES。不然点击到button上的事件已经被button接收了,无法cancle掉。另外针对阅读浏览页面,一般手指都会停留在UIScrollView滚动,如果需要隐藏/显示状态栏或导航条,则会出现每点击一次就出现隐藏/显示问题。
解决方法:该问题主要的难题要判断单击事件。由于150ms很小,因此基本上手指一接触到UIScrollView就会传递到内部的view上,此时内部的view需对这个touch进行时间节点的判断,判断它是一个单击事件,然后执行单击操作。
1、TestView是ScrollView的subview,也可也是继承UIScrollView
TestView.h
TestView.m
package mars.http;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class HttpActivity extends Activity {
private Button requestButton = null;
HttpResponse httpResponse = null;
HttpEntity httpEntity = null;
InputStream inputStream = null;
BufferedReader bufferedReader = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
requestButton = (Button) findViewById(R.id.requestButton);
requestButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String url = "http://www.baidu.com";
HttpGet httpGet = new HttpGet(url);
HttpClient httpClient = new DefaultHttpClient();
try {
httpResponse = httpClient.execute(httpGet);
httpEntity = httpResponse.getEntity();
inputStream = httpEntity.getContent();
bufferedReader = new BufferedReader(new InputStreamReader(
inputStream));
StringBuffer result = new StringBuffer();
String temp = "";
while ((temp = bufferedReader.readLine()) != null) {
result.append(temp);
}
System.out.println(result.toString());
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
}
}
如果ActivityManifest中的minSDK
<uses-sdk android:minSdkVersion="14" />
配置如果写成 14 就会报异常。改为14一下就正常。不知道是不是bug