我目前在地图中有一个代理,其位置称为myPos=(myX,myY)
,但其方向myOri=(oriX,oriY)
未知。我还在位置lm=(lmX,lmY)
看到了一个地标,我从我的视角到地标都有笛卡尔坐标和极坐标,分别为relLM=(relX,relY)
和polLM=(r,theta)
。
我的目标是找到我的方向向量与X和Y轴的关系,如XX=(xX, xY)
和YY=(yX, yY)
。假设以下示例X向右增长,Y向上增长,0旋转的代理遵循X轴(因此看起来正确的代理具有XX=(1,0)
和YY=(0,1)
。从intuition开始,其中0角度旋转在X轴上,PI / 2旋转在Y上,PI在-X上,3PI / 2在-Y上,2PI是X. < / p>
示例)如果myOri=(1,1)
(座席面向右上方),则XX=(1, -1)
(因为X轴在他右上方)和YY=(1, 1)
( Y轴是左上角)。在下图中,X和Y以红色和绿色显示。我的经纪人是蓝色的,粉红色的地标。因此,我们的初始数据为myPos=(0,-2)
,lm=(0,-1)
,relLM=(~0.7,~0.7)
。
通过了解myPos
和lmPos
以及relLM
,这应该是可能的。但是,我找不到合适的载体。什么是正确的算法?
bool someFunction(Landmark *lm, Vector2f myPos, Vector2f *xx, Vector2f *yy){
// Vector from agent to landmark
Vector2f agentToLandmark(lm->position.x - myPos.x,
lm->position.y - myPos.y);
// Vector from agent to landmark, regarding agent's orientation
Vector2f agentFacingLandmark = lm->relPosition.toCartesian();
// Set the XX and YY values
// how?
}
我的问题实际上是3D,但使用2D会让问题更容易解释。
答案 0 :(得分:0)
由于relLM
相对于lm
为myOri
,lm + relLM
必须位于myPos + µ * myOri
。因此lm + relLM - myPos = myOri * µ
。由于在这种情况下必须提供µ > 0
,并且myOri
只需要指明方向,因此选择任意µ > 0
就足够了。
我认为你对xx
的定义只是一个代表代理POV的x轴的向量。 yy
和y轴也是如此。这很容易实现。 myOri
和x轴之间的角度等于x轴和xx
之间的角度,因此只需在x轴上镜像myOri
并得到{{1} }。所以xx
。 xx = (myOri.x , myOri.y * (-1))
和y轴之间的角度等于myOri
和myOri
之间的角度,因此yy
。
请注意,这只是猜测你的意思 可能是我误解了一些东西。如果是这样的话,请通知我。