说明
存在空间(世界)坐标系和矩形(物体)坐标系
坐标系:纵轴y向下递增,横轴x向右递增
矩形坐标系中,纵轴称为重力线(Gravity line),横轴称为大地线(Ground)
本部分涉及矩形中两个很重要的点,一个是几何重心G,另一个定位点A(任意一个顶点)
重心决定平移,定位点决定旋转
思路
先计算位移(平移变化),再计算转角(旋转变化)。平移部分暂且不谈,这个实现起来不是什么难事。重要的是转角:
![](https://img.haomeiwen.com/i7967893/979054af882868fc.png)
如图,A到y轴距离为w,A到x轴距离为h
则w = abs(A.x - G.x),h = abs(A.y - G.y) //考虑到A的位置不同,所以做绝对值运算
deg = arctan(h/w) // 用反正切求出初始角α。
这里我们只考虑顺时针旋转,先判断A的位置,分九种情况,在一,二,三,四象限,在x正,负半轴,在y正,负半轴,在原点。
若A与原点重合则不存在矩形,由于正切函数的特性,这里只分四种情况:
第一象限+x正半轴:算出w和h的比值,带入一个方程就能求出长宽,这里讲下圆的直线系方程xx+yy=rr(当然这不是标准形式),其实就是著名的勾股定理,好好想想就能明白了,r确定了圆的大小,然后因为平方,解出来有两个点......
那么我想你明白我的意思,A.x = G.x + w, A.y = G.y + h(不同象限里,这里的加减是不同的)然后,当deg = 90 时,将A放在下一个情况下讨论(第二象限+y正半轴),因为tan90,不存在嘛,这时deg = 0。以下同理,四次转一圈为一个周期,具体deg每次加多少根据转速来定,这里先不考虑。
当确定了A后,便可以确定其它三个顶点坐标:
a = abs(A.x - G.x), b = abs(A.y - G.y)
如B点,B.x = G.x + a, B.y + b ......
值得注意的是:最好给四个顶点规定一个顺序,确定了定位点的象限后,以便于确定另三个顶点的位置。
最后将四点相连便得到了我们要的矩形,例如Javascript中用Canvas:
context.moveTo(x1,y1) //起点位置
context.lineTo(x2,y2) //终点位置
context.stroke() //连接两点
最后
至此,最核心的部分就写完了。其实这是我做刚体模拟的一部分,可能会有更好的实现,但这只是我的个人思路。另外你还可以读一下我的《矩形相交判定》,这些大概花了我一个星期,基本都是晚自习研究的。本篇不提供任何程序上的完整实现,只讲思路,如有错误,欢迎指出!
网友评论