我希望执行本主题中描述的操作:
http://www.allegro.cc/forums/print-thread/283220
我尝试了这里提到的各种方法。
首先,我尝试使用Carrus85描述的方法:
只需取两个三角形斜边的比率即可(与另一个三角形无关),我建议将点1和点2作为计算的距离。这将为您提供从较大三角形到角落的三角形的长宽比百分比。然后,您只需将deltax乘以该值即可得到x坐标偏移,然后将deltay乘以该值即可得到y坐标偏移。
但是我找不到一种方法来计算对象离屏幕边缘的距离。
然后,我尝试使用23yrold3yrold建议的射线投射(以前从未做过):
从屏幕中心向屏幕外对象发射光线。计算射线在矩形上的相交位置。有你的座标。
我首先计算了由两点的x和y位置差异形成的三角形的斜边。我用它沿着那条线创建了一个单位向量。我遍历该向量,直到x坐标或y坐标不在屏幕上。然后,两个当前的x和y值形成箭头的x和y。
这是我的光线投射方法的代码(用C ++和Allegro 5编写)
void renderArrows(Object* i)
{
float x1 = i->getX() + (i->getWidth() / 2);
float y1 = i->getY() + (i->getHeight() / 2);
float x2 = screenCentreX;
float y2 = ScreenCentreY;
float dx = x2 - x1;
float dy = y2 - y1;
float hypotSquared = (dx * dx) + (dy * dy);
float hypot = sqrt(hypotSquared);
float unitX = dx / hypot;
float unitY = dy / hypot;
float rayX = x2 - view->getViewportX();
float rayY = y2 - view->getViewportY();
float arrowX = 0;
float arrowY = 0;
bool posFound = false;
while(posFound == false)
{
rayX += unitX;
rayY += unitY;
if(rayX <= 0 ||
rayX >= screenWidth ||
rayY <= 0 ||
rayY >= screenHeight)
{
arrowX = rayX;
arrowY = rayY;
posFound = true;
}
}
al_draw_bitmap(sprite, arrowX - spriteWidth, arrowY - spriteHeight, 0);
}
这是相对成功的。当对象位于屏幕的上方和左侧时,箭头会显示在屏幕的右下部分,就像绘制箭头的位置已围绕屏幕中心旋转了180度一样。
我认为这是由于以下事实:当我计算三角形的斜边时,无论x或y的差是否为负,它始终为正。
考虑一下,光线投射似乎不是解决问题的好方法(因为它涉及使用sqrt()和较大的for循环)。