1.OpenGL自带拾取功能。glSelectBuffer等函数完成。
大每一本OpenGL入门的书都会讲到OpenGL的Select模式,它采用一种方法使得可以获取当前鼠标点选的几何图形。简单的来说这种方式就是首先调 整Projection矩阵,使得你透过从鼠标点选附近的一个正方形(大小可设置)看到的世界。然后开始绘制,当每一次绘制的时候都会判断你会不会看到。 如果看到,那么,你就是选择了这个几何图形了。更为具体的过程可以参见相关的书籍。
http://hi.baidu.com/sishenfuhuo/blog/item/e98b852ef94013371e30892a.html2.在OpenGL红宝书中介绍了一种简便易行的办法:在后缓冲中 使用不同的颜色重绘所有对象,每个对象用一个单色来标示其颜色,这样画好之后我们读取鼠标所在点的颜色,就能够确定我们拣选了哪个物体。这种方法有一个缺 陷,当场景中需要选择的对象的数目超出一定限度时,可能会出现标识数的溢出。对于这个问题,红宝书给出的解决办法就是多次扫描。实践证明这种方法的确简便 易行,但仍有不少局限性,而且做起来并不比第一种机制方便多少。限于篇幅,不再赘述。
3.还有一种方法是射线相交检测法。
http://www.ophonesdn.com/article/show/164
4.关于相交性检测的文章如下
http://www.cnblogs.com/graphics/archive/2010/08/09/1795348.html
1.先用参数法求交点 ,然后 用叉乘公式可以求得面积,用面积法判断是否在之内。
2.或者用上面的参数法。直接定义一个三角形内的点。然后用u,v参数表示。求得参数后,根据范围来判断。
线性地址(Linear Address) 是逻辑地址到物理地址变换之间的中间层。程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机 制,那么线性地址可以再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。Intel 80386的线性地址空间容量为4G(2的32次方即32根地址总线寻址)。
物理地址(Physical Address) 是指出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。如果没有启用分页机制,那么线性地址就直接成为物理地址了。
虚拟内存(Virtual Memory) 是指计算机呈现出要比实际拥有的内存大得多的内存量。因此它允许程序员编制并运行比实际系统拥有的内存大得多的程序。这使得许多大型项目也能够在具有有限 内存资源的系统上实现。一个很恰当的比喻是:你不需要很长的轨道就可以让一列火车从上海开到北京。你只需要足够长的铁轨(比如说3公里)就可以完成这个任 务。采取的方法是把后面的铁轨立刻铺到火车的前面,只要你的操作足够快并能满足要求,列车就能象在一条完整的轨道上运行。这也就是虚拟内存管理需要完成的 任务。在Linux 0.11内核中,给每个程序(进程)都划分了总容量为64MB的虚拟内存空间。因此程序的逻辑地址范围是0x0000000到0x4000000。
有时我们也把逻辑地址称为虚拟地址。因为与虚拟内存空间的概念类似,逻辑地址也是与实际物理内存容量无关的。
逻辑地址与物理地址的“差距”是0xC0000000,是由于虚拟地址->线性地址->物理地址映射正好差这个值。这个值是由操作系统指定的。
http://www.mtime.com/my/1085324/blog/1499099/
最近用到了tableCell ,但右方始终会有一个小箭头,这并不是我想要的的,用下面的方法可以去掉:
_cell.accessoryType=UITableViewCellAccessoryNone;
这里要标记一下,希望遇到相同问题的朋友可以用到。
Class对象是用来创建类的常规对象的,当我们编译一个Java类就会同时产生一个与该类相对应的Class对象(保存在.class文件中)。
Class对象是用来创建类的常规对象的,当我们编译一个Java类就会同时产生一个与该类相对应的Class对象(保存在.class文件中)。该Class对象中保存了创建对象所需的所有信息。
共有三种产生Class对象的方法下面分别说明之:
1.public static Class Class.forName("完整的类名") throws ClassNotFoundException;
public static Class forName(String name, boolean initialize,
ClassLoader loader) throws ClassNotFoundException
假若我们用Class.forName("");的方式获取Class对象,其实就相当于Class.forName("完整类名", true, this.getClass().getClassLoader())也就是说在默认情况下在产生Class对象的同时会对该Class对象进行初始化(若以前没有初始化过)。
2.public final Class getClass()
可以通过任何实例对象来引用该方法来获取相应的Class对象。使用此种方式的前提是我们需要产生相应的实例对象。
3.类名.class 此种方式产生Class对象较前两种简单,无需第一种还要进行异常处理(在编译期就进行错误的检查了)。此种方式不会自动初始化该Class对象。初始化被延迟到对静态方法(包括构造方法)或非常数静态域进行首次引用时才进行。
import java.util.*;
class Initable{
static final int staticFinal = 47;
static final int staticFinal2 = ClassInitialization.rand.nextInt(100);
static{
System.out.println("Initialization Initable");
}
}
class Initable2{
static int staticNoFinal = 147;
static{
System.out.println("Initialization Initable2");
}
}
class Initable3{
static int staticNoFinal = 74;
static{
System.out.println("Initialization Initable3");
}
}
public class ClassInitialization
{
public static Random rand = new Randdom(47);
public static void main(String[] args){
Class initable = Initable.class; //不会引起初始化
System.out.println("after creating Initable reference");
System.out.println(Initable.staticFinal); //引用编译器常量不会引起初始化
System.out.println(Initable.staticFinal2); //引起初始化
System.out.println(Initable2.staticNoFinal); //引用非编译期常量会引起初始化
Class initable3 = Class.forName("Initable3"); //默认会引起初始化
System.out.println("after creating Initable3 reference");
System.out.println(Initable3.staticNoFinal);//前面已经初始化此处不用再初始化
}
}