改变矩形大小时,重新计算光线跟踪/投射成本

10

我有一个“射线”数组,需要测量其与下方的矩形框之间的成本关系。外部红色框始终比深绿色框大1m,浅绿色框比深绿色框小10cm。如果一条射线

  1. 通过深绿色方框,则令成本为c
  2. 停留在深绿色方框上则令成本为d
  3. 停留在红色区域,则令成本为e
  4. 既不与深绿色方框相交也不停留在红色框中,成本为f
  5. 并且 d < f < c < e

enter image description here

我目前拥有以下数据结构和函数来计算成本。我需要计算给定矩形(由4个xy坐标表示)的成本,同时找到近似/局部最佳长度/宽度的深绿色矩形(即通过保持矩形最接近的角固定来缩小或增大该维度),使得成本最小化。

以下是屏幕截图的具体示例。较小的矩形对应于图中的深绿色框。绿线是成本d的射线,黄线是成本f的射线,而青色线是成本c的射线。如果我固定内部矩形的左上角并减小宽度,则可以将青色射线从成本c降至成本f。
enter image description here

我的问题是,我卡在了如何修改我的代码或更改我的数据结构上,以便我只需重新计算受影响的射线即可找到最佳维度(即无需再次循环遍历所有射线)。

struct VRay{
    float range, x, y;
    enum RayType{ PASSTHROUGH, FREE, SURFACE, OCCLUDED, UNIFORM};
    RayType r;
};
struct VScan{
    VRay rays[401];
    int closestIdx;
    int firstIdx;
    int lastIdx;
} vscan;

计算费用的函数:

for (int i = 0; i < 401; i++){
       VRay& r = vscan.rays[i];

       Vector2f cray(r.y, -r.x);
       bool ppBound = false;
       bool ppSurf = false;
       Vector2f vertex =  outBox.row(0);
       Vector2f vertexSurf = surface.row(0);

       float init = cray.dot(vertex);
       float initSurf = cray.dot(vertexSurf);
       //this part finds whether ray intersects rectangle or not 
       for (int j = 1; j < 4; j++){
            Vector2f v2 = outBox.row(j);
            Vector2f vSurf =  surface.row(j);

            float i2 = cray.dot(v2);
            float iSurf = cray.dot(vSurf);

            if (i2 * init < 0){
                ppBound =  true;
            }

            if (iSurf * initSurf < 0){
                ppSurf = true;
            }
       }

       //ray does not intersect all rectangles
       if (!ppBound){
          z += log(1/100.);
          continue;
       }

        //ray is inside red box
        if (inPolygon(outBox, r)){
            //ray inside dark green box 
            if (inPolygon(surface, r)){
                //ray inside light green box
                if (inPolygon(inBox,r))
                    c  = passTCost;
                else
                    c = surfaceCost;
            }
            else{
                c = freeCost; //free space
            }
        }
        else if (ppSurf){
            c = passTCost; //before all boxes
        }
        else { //ray does not intersect dark green box
            z += log(1/100.);
            continue;
        }

        z += -(c * c)/(2 * deviation * deviation);
    }

你的图片为什么没有任何“e”成本的光线?据我所知,有一些光线会照到红色区域。 - Ivan Gritsenko
那我就不明白为什么绿色的光线中会有一堆红色的光线。 - Ivan Gritsenko
@IvanGritsenko,不,如果一条射线与深绿色矩形相交而不是浅绿色矩形,则该射线为绿色。如果射线与浅绿色矩形相交,则该射线为青绿色。有一些红色的射线,因为它们与外部(红色)框相交,但距离内部框稍微有点短。您需要将图片放大一点才能看到。 - goh
忽略白色框内的绿色“点”。它们很令人困惑,但并没有任何意义。 - goh
让我们在聊天中继续这个讨论 - Ivan Gritsenko
显示剩余2条评论
2个回答

2
我理解的是,光线永远不会落在浅绿色的区域内,也就是说当光线到达浅绿色区域时会停止。有没有规则来确定光线是否落在红色区域、深绿色区域或同时穿过它们?
如果这些规则与汽车的大小无关,只取决于光线“终点”的相对位置,例如,如果针对汽车表面前部中心的光线总是落在汽车周围的空闲空间上,则具有成本d、c或e的光线数量与成本的关系是与汽车大小无关的。成本f(标记为黄色)的光线数量仅是其余光线的数量,即没有成本d、c或e的光线。
这意味着首先要计算成本之和的最佳(最小)值,给定d/c/e的成本比的恒定比例,并知道其余光线的成本为f。
例如:您有5%的成本为c的光线(青色线),10%的成本为e的光线(红色线)和40%的成本为d的光线(绿色线),以及45%的成本为f的光线(黄色线)。因此,对于每条成本为c的光线,您有两条成本为e的光线和八条成本为d的光线。所有其余光线都具有成本f。
-> 让x成为成本为c的光线数量,那么总成本就是:1*c*x + 2*e*x + 8*d*x + (totalNumberOfRays - (1+2+8)*x) * f
现在找到此函数的最小值(因为它是线性函数,所以很容易,但您可能对汽车大小有一些限制),并使用得到的x计算汽车的大小:如果一开始有10条成本为c的光线,而结果的x为5,则必须找到仅产生5条成本为c的光线的汽车大小,即汽车的宽度和长度应分别乘以0.5。
现在,我唯一希望的是,我的假设是正确的 :-)
(如果我的假设不正确,我想到的其他选项是以某种方式将光线分组,并仅对每个组进行计算)

不,一条光线可以落在浅绿色的框内。没有任何规则,但是任何不与深绿色框相交且不落在红色框内的光线将始终为f(黄色光线)。理论上,汽车位置/框实际上是粒子滤波器中的单个假设/粒子,因此光线端点的x、y位置固定,但光线产生的成本取决于端点相对于当前粒子/框的位置。 - goh
你说光线端点的x,y位置是固定的。这是否意味着当汽车的大小改变时它们不会改变? - user7291698

2
如果我理解正确的话,您想改变深绿色矩形的大小,以使其与浅绿色矩形保持共同的中心并且两者的边保持平行。在任何时候,深绿色矩形都不会离开红色矩形,并且永远不会比浅绿色矩形小。红色和浅绿色矩形保持不变。您只需要重新计算那些可能因为改变深绿色矩形而导致成本发生变化的射线(以下简称DGR)。

所以我的建议是: 在开始时再有一个空的std::vector<VRay*>,还有第二个sum变量。首先,按照您的方式计算成本。此外,对于每条射线,决定如果改变DGR是否可能会影响它。

如果可能会影响,将其指针添加到上述向量中,否则将其当前成本添加到第二个sum中。从现在开始,您只需要重新计算指针向量中的那些射线,并将其他射线的预计算总和添加到这个新总和中。

如何确定射线是否可能会改变成本?好吧,那些没有穿过红色矩形的肯定不会改变。那些以浅绿色矩形结束的也不会改变,以及那些穿过浅绿色和红色矩形的射线。因此,相关的射线是在红色矩形内结束但不在浅绿色矩形内结束的,以及完全穿过红色矩形但不与浅绿色矩形相交的射线。

如果考虑到最大DGR(如果它不一定与红色矩形平行),还可以进行进一步的优化:那些不与该最大矩形相交或者在其前面结束的线条也永远不会发生变化。


如果我将DGR的长度延长5厘米,保持顶部角固定,那么红色和浅绿色矩形也会延长5厘米。你确定“如何决定光线是否可能改变成本”的假设是正确的吗?比如说,如果我有一条光线刚好在红色框外面,现在长度发生了变化,光线现在在红色框内部。[或者你是指长度变化后的框吗] - goh
顺便说一下,你的昵称很不错。希望有一天能去那里远足。 - goh
嗯,我理解问题是有固定的浅绿色(LGR)和红色(RR)矩形。如果在修改深绿色矩形时,它们也发生变化,我们就不能像以前那样应用我的标准了。然而,我们可以引入两个新矩形来定义LGR的最小尺寸(MLGR)和RR的最大尺寸(MRR)。然后,您可以将上面答案中的LGR和RR替换为MLGR和MRR... - Aconcagua
一般而言:我们需要确定那些不管你如何改变矩形,其值都不会再改变的线条,并因此找到适当的标准。所以问题是:哪些线条将始终落在LGR内?哪些线条永远不会进入RR?哪些线条将始终完全跨越LGR和RR? - Aconcagua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接