【问题标题】:Get all pixels a ray passses through获取光线通过的所有像素
【发布时间】:2014-08-24 12:58:08
【问题描述】:

我有一个二维空间和该空间中的一条射线。

我需要按数字顺序获取红色矩形的坐标。

我的尝试: 我有一个双射线的起点。
我有一个值偏航,它是以弧度表示的方向。
我这样做是为了得到下一个红色方块的坐标。

double tanyaw = Math.tan(yaw);
if ((int) (x + 1/tanyaw) == (int) x) {
    x += 1/tanyaw;
    z += Math.signum(tanyaw);
} else {
    x += Math.signum(tanyaw);
    z += tanyaw;
}

但是:

那是 yaw = 3*pi/8 请注意,这条线是在绘图程序中绘制的,并且只是大致正确。

【问题讨论】:

  • 也许是整数除法而不是浮点数?顺便问一下,这是用于碰撞优化的常规网格吗?
  • @huseyintugrulbuyukisik 射线就像枪声,我正在寻找最先被它击中的实体,我这样做是因为我很快就可以在这些方格中找到实体,所以我不'不必检查世界上所有的实体。
  • 您正在以小时间步长推进光线位置/波前?也许像一个广泛的阶段?
  • 这看起来像一个“像素画线”算法,但在盒子上。 en.wikipedia.org/wiki/Line_drawing_algorithm

标签: algorithm graphics 2d rasterize


【解决方案1】:

直线方程为:

x = x0 + t*xd
y = y0 + t*yd

为简单起见,定义镜头在 t=0 开始离开,最后要测试的位置在 t=1。然后你可以简单地定义步长(假设你可以简单地计算结束位置x1,y1):

xstep = 1/(x1 - x0)
ystep = 1/(y1 - y0)
xpos = x0
ypos = y0

然后简单循环,直到你到达交叉路口或结束使用:

while(!hitsomething()) {
    if (xpos + xstep - x0 < ypos + ystep - y0) {
           xpos += xstep;
           visit(xpos, ypos);
    } else {
           ypos += ystep;
           visit(xpos, ypos);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多