如何遍历任意三角形和任意四边形内的点
……
……
想要遍历任意三角形和任意四边形内的点,按照常理来说其实一件比较复杂的事情。
但好在有一个比较不错的办法,可以轻松的遍历任意三角形和任意四边形内的点。
先说三角形。
假如三角形的三个点的坐标为A(x1,y1),B(x2,y2),C(x3,y3)。
其实。
任意三角形内的点,都可以这样表示:
P(x,y)=α*A+β*B+γ*C
其中,α+β+γ=1。
没错。
三角形内的任何一个点P,都可以表示成上面的样子。
然后呢。
我们就可以开始来遍历了。
下面是遍历的伪代码。
for(α=0;α<1;α+=0.01){
for(β=0;β<1-α;β+=0.01){
γ=1-α-β;
P(x,y)=α*A+β*B+γ*C;
}
}
用这个方法,就可以对三角形遍历了。
而若是想要遍历更多的点,那么可以把0.01这个参数调小,反之调大。
如果想要遍历任意的四边形呢?
有一个简单的思路。
可以很直观的想象到。
任意一个四边形,都可以轻松的拆成两个三角形。
而这个时候,我们已经知道怎么遍历一个任意三角形内的点了,那么遍历两个三角形自然也不成问题。
不过。
我得在这里提一点。
如果将一个四边形拆分成两个三角形的话,那么这两个三角形的面积往往也是不同的,比如说有一个四边形可以拆分成面积为1和面积为3的两个三角形,而如果使用相同的参数0.01去遍历的话,面积为1的三角形会遍历n个点,而面积为3的三角形也会遍历n个点,也就是说,虽然面积大小不同,但是会遍历一样多的点。
或许你并不在意。
但是想象一个极端的情况。
假设。
一个四边形,可以拆分成面积为1的三角形和面积为10000的三角形。
如果你想要遍历这个四边形,并且把四边形拆分成两个三角形来遍历。
试想一下。
如果你把面积为1的点遍历了十万次,而面积为10000的三角形也遍历了十万次。
这是不是莫名有一种荒谬的感觉呢?
而这也是这个遍历方法的一个弊端所在。
所以在遍历任意四边形的时候,在将四边形拆分成两个三角形来遍历后,就需要对这两个三角形的遍历中的0.01的那个参数来进行合理的调整。