У меня есть массив "лучей", которые мне нужно для измерения затрат по отношению к прямоугольным блокам ниже. Внешняя красная рамка всегда на 1 м больше, чем темно-зеленая коробка, а светло-зеленая коробка на 10 см меньше, чем темно-зеленая коробка. Если луч
- проходит через темно-зеленый ящик, я бы назначил стоимость c
- и на темно-зеленой коробке я бы назначил стоимость d
- Приземлится на красную область, которую я бы назначил стоимость e
- не пересекает темно-зеленый ящик и не приземляется в красном поле, стоимость f
- и
d < f < c < e
В настоящее время у меня есть следующие структуры данных и функции для расчета стоимости. Мне нужно рассчитать стоимость для данных прямоугольников (представленных координатами 4 xy), но в то же время найдите приблизительную/локальную оптимальную длину/ширину темно-зеленого прямоугольника (т.е. сжимайте или вырастите размер, удерживая ближайший угол прямоугольника фиксированным), чтобы стоимость была минимальной.
Конкретный пример - снимок экрана ниже. Меньший прямоугольник соответствует темно-зеленой коробке на рисунке. Зеленые линии - это лучи со стоимостью d, желтые линии стоят f, а бирюзовые линии - те, которые стоят c. Если я исправлю верхний левый угол внутреннего прямоугольника и уменьшу ширину, я могу уменьшить лучи turqoise от стоимости 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);
}