Автор:
Фетисова А.Д., ГБОУ Школа 460, 10 «Н»
Руководитель:
Крысанов В.О., ГБОУ Школа 460,
учитель математики, информатики
Цель работы: разработка программы, которая решает задачу о трёхмерной упаковке.
Задачи работы:
1. Исследование предметной области и составление математической модели.
2. Выбор средств для разработки программы.
3. Реализация алгоритма упаковки.
4. Разработка пользовательского интерфейса.
Алгоритм:
Top - Right - Front
Множество грузов:
Множество контейнеров:
Требования:
1) каждый груз размещен только в одном контейнере:
2) грузы не должны перекрывать друг друга:
3) груз не должны выходить за границы контейнера:
# fit shimpent on a shimpent?
def is_under_fits?(shimpent)
if @shipments.empty?
self.width >= shimpent.width &&
self.depth >= shimpent.depth &&
self.height >= shimpent.height
else
under_shipment = @shipments.last.last.last
under_shipment.width >= shimpent.width &&
under_shipment.depth >= shimpent.depth &&
self.height - (under_shipment.p.z + under_shipment.height) >= shimpent.height
end
end
Условия «непересечения» грузов
{
"solution"=>[{
"airplane_type"=>"tu204",
"cargo_index"=>"1",
"x_on_box"=>[0.0, 0.0, 0.0]
},
{"airplane_type"=>"tu204",
"airplane_index"=>"2",
"x_on_box"=>[0.0, 0.0, 2.0]
}]
}
{"2":[[12,12,12],
{"airplane_type":"tu204",
"airplane_index":"2",
"cargo_type":"cargo_type_name_2",
"cargo_index":"1",
"x_on_box":[0.0,0.0,0.0],
"y_on_box":[2,2,2]
},
{"airplane_type":"tu204",
"airplane_index":"2",
"cargo_type":"cargo_type_name_1",
"cargo_index":"0",
"x_on_box":[0.0,0.0,2.0],
"y_on_box":[1,1,2]
}
]
}
Результат работы алгоритма
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75, window.innerWidth / window.innerHeight, 0.1, 1000
);
const renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
Пример создания пустой сцены без освещения
function aircraft_draw(cnv){
...
...
// отрисовка самих грузов самолета:
// координаты груза можно получить с помощью
// .y_on_box и .x_on_box в solution[i][j], которые вернут массывы [x, y, z]
// точки X и Y груза соответственно
for (j = 1; j < solution[i].length; j++){
var cargoGeometry = new THREE.BoxGeometry( solution[i][j].y_on_box[0],
solution[i][j].y_on_box[1],
solution[i][j].y_on_box[2]
)
var cargoMaterial = new THREE.MeshLambertMaterial(
{ color: Math.random() * lightColor } )
var cargoCube = new THREE.Mesh( cargoGeometry, cargoMaterial )
scene.add( cargoCube );
cargoCube.position.x = solution[i][j].x_on_box[0] + solution[i][j].y_on_box[0]/2
cargoCube.position.y = solution[i][j].x_on_box[1] + solution[i][j].y_on_box[1]/2
cargoCube.position.z = solution[i][j].x_on_box[2] + solution[i][j].y_on_box[2]/2
}
}
render()
}
Форма для создания новых грузов
Форма для создания новых контейнеров
В результате выполнения работы было спроектировано и разработано приложение, полностью удовлетворяющее требованиям поставленных задач.