我有一个“射线”数组,需要测量其与下方的矩形框之间的成本关系。外部红色框始终比深绿色框大1m,浅绿色框比深绿色框小10cm。如果一条射线
- 通过深绿色方框,则令成本为c
- 停留在深绿色方框上则令成本为d
- 停留在红色区域,则令成本为e
- 既不与深绿色方框相交也不停留在红色框中,成本为f
- 并且
d < f < c < e
我目前拥有以下数据结构和函数来计算成本。我需要计算给定矩形(由4个xy坐标表示)的成本,同时找到近似/局部最佳长度/宽度的深绿色矩形(即通过保持矩形最接近的角固定来缩小或增大该维度),使得成本最小化。
以下是屏幕截图的具体示例。较小的矩形对应于图中的深绿色框。绿线是成本d的射线,黄线是成本f的射线,而青色线是成本c的射线。如果我固定内部矩形的左上角并减小宽度,则可以将青色射线从成本c降至成本f。
我的问题是,我卡在了如何修改我的代码或更改我的数据结构上,以便我只需重新计算受影响的射线即可找到最佳维度(即无需再次循环遍历所有射线)。
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);
}