求解两不同斜率直线间正方形对齐的水平与垂直偏移量(基于交点)
求解两不同斜率直线间正方形对齐的水平与垂直偏移量(基于交点)
兄弟我太懂这种卡了好几个小时的感觉了——明明感觉答案就在眼皮子底下,就是绕不出来,太闹心了😂 咱们一步步来拆解这个问题,把h3和v3的代数表达式推出来。
首先先把咱们手里的已知量再理一遍,避免混淆:
(xi, yi):两条斜坡的交点坐标ha:玩家的水平锚点(也就是半宽,玩家中心到左右边缘的水平距离)va:玩家的垂直锚点(半高,中心到上下边缘的垂直距离)h1, v1:玩家完全贴合第一条斜坡时,中心相对于交点的水平/垂直偏移h2, v2:玩家完全贴合第二条斜坡时,中心相对于交点的水平/垂直偏移θ1, θ2:两条斜坡的角度(咱们可以把它转成斜率m = tan(θ * π/180),或者用已知的h1/v1、h2/v2直接推导斜率,更方便)
核心思路
玩家要“卡”在两条斜坡之间,意味着它的两个边缘会分别贴合在两条斜坡上。这里分两种常见的贴合情况,咱们分别推导:
情况1:玩家上下边缘分别贴合两条斜坡
假设玩家的下边缘贴第一条斜坡,上边缘贴第二条斜坡。
首先,从h1, v1推导第一条斜坡的斜率m1:当玩家贴合第一条斜坡时,下边缘的y坐标是yi + v1 - va,这个点同时在第一条斜坡上,代入直线方程(以交点(xi, yi)为原点偏移)可得:v1 - va = m1 * h1 → 所以 m1 = (v1 - va) / h1
同理,从h2, v2推导第二条斜坡的斜率m2:上边缘的y坐标是yi + v2 + va,代入第二条斜坡方程:v2 + va = m2 * h2 → 所以 m2 = (v2 + va) / h2
现在,当玩家卡在两条斜坡之间时,中心坐标是(xi + h3, yi + v3),此时上下边缘分别满足两条斜坡的方程:
- 下边缘:
yi + v3 - va = m1 * h3 + yi→ 化简得v3 - va = m1 * h3 - 上边缘:
yi + v3 + va = m2 * h3 + yi→ 化简得v3 + va = m2 * h3
把这两个方程联立求解,就能得到h3和v3:
h3 = 2 * va * h1 * h2 / [ h1*(v2 + va) - h2*(v1 - va) ]
v3 = va * [ h2*(v1 - va) + h1*(v2 + va) ] / [ h1*(v2 + va) - h2*(v1 - va) ]
情况2:玩家左右边缘分别贴合两条斜坡
如果是玩家的左边缘贴第一条斜坡,右边缘贴第二条斜坡,推导逻辑类似:
先从贴合状态推导斜率:
- 左边缘贴合第一条斜坡时,接触点坐标是
(xi + h1 - ha, yi + v1 + va),代入斜坡方程得:v1 + va = m1*(h1 - ha)→m1 = (v1 + va)/(h1 - ha) - 右边缘贴合第二条斜坡时,接触点坐标是
(xi + h2 + ha, yi + v2 - va),代入斜坡方程得:v2 - va = m2*(h2 + ha)→m2 = (v2 - va)/(h2 + ha)
联立左右边缘贴合两条斜坡的方程:
- 左边缘:
v3 + va = m1*(h3 - ha) - 右边缘:
v3 - va = m2*(h3 + ha)
求解后得到:
h3 = [ ha*(m1 + m2) + 2*va ] / (m1 - m2)
把m1和m2替换成已知变量的表达式:
h3 = [ ha*((v1+va)/(h1-ha) + (v2-va)/(h2+ha)) + 2*va ] / [ (v1+va)/(h1-ha) - (v2-va)/(h2+ha) ]
对应的v3:
v3 = [ 2*m1*m2*ha + va*(m1 + m2) ] / (m1 - m2)
同样替换m1和m2即可得到全已知变量的表达式。
代码里的注意事项
- 记得把角度转成弧度再计算正切(如果直接用角度的话),比如
m1 = tan(θ1 * math.pi / 180) - 要注意分母为0的情况(两条斜坡平行),这种时候玩家没法卡在中间,得加个判断分支
备注:内容来源于stack exchange,提问作者CardinalCoder64
相关产品推荐
相关产品推荐

