循环通过矩形上两点之间的矩形边界?

时间:2011-05-02 10:03:16

标签: c# loops line intersection

哇,这是一个很大的问题 Diagram
是的,所以我有两个点,在矩形的边界上,也在两条线上,从原点投射。为简单起见,P1 / P2的排列是任意的。

我的问题是,如何循环遍历矩形的绿色区域(基本上是最小的区域)?

实施:我想在我正在创建的游戏中创建视野效果。原点是玩家,可以在当前视口(矩形)的任何位置。线条的方向偏离了玩家所面对的方向。我打算从原点追踪绿色区域的所有位置,检查障碍物。

我更喜欢代码示例答案,任何语言,但最好是C#

3 个答案:

答案 0 :(得分:1)

我想,你想要的是这样的:

具有以下标准的所有坐标C都位于绿色线上,该绿线是矩形R的一部分:

(P1.y == P2.y)
?
(
    C.x >= P1.x && C.x <= P2.x
)
:
(
  (C.x >= P2.x && C.x <= R.right && C.y == P2.y) || 
  (C.x >= P1.x && C.x <= R.right && C.y == P1.y) || 
  (C.x == R.x && C.y <= P1.y && C.y >= P2.y)
)

这假设如果P1不在同一条线上,P1将低于P2,如果P1在同一条线上,P1将在P2之前。

答案 1 :(得分:1)

如果你想找出哪些物品在“绿色区域”......

假设您知道矩形的大小,您可以计算您感兴趣的多边形的顶点(原点,P1,P2和可见的矩形角),然后您可以遍历您的对象以找到使用点的内部在多边形检测中。

例如,伦道夫·弗兰克林(Randolph Franklyn)。内部点返回1,外部点返回0 ......

int pnpoly(int npol, float *xp, float *yp, float x, float y)
{
  int i, j, c = 0;
  for (i = 0, j = npol-1; i < npol; j = i++) {
    if ((((yp[i] <= y) && (y < yp[j])) ||
         ((yp[j] <= y) && (y < yp[i]))) &&
        (x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i]))
      c = !c;
  }
  return c;
}

答案 2 :(得分:0)

我认为做你想要的最简单的方法(视野)就是首先把所有东西都绘制成屏幕,然后在你不希望看到东西的地方画出黑色。

所以基本上把黑暗画在没有战争的画面上。