Итак, я получил 4 прямоугольных фигуры и пытаюсь применить алгоритм сортировки ( алгоритм рисования ), чтобы узнать, какие фигуры (в 3d) мне нужно нарисовать первыми, а какие - после.
Примечание : Камера находится в правом нижнем углу:
Правильный порядок будет: фиолетовый, красный, синий, зеленый (для рисования, конечно, в обратном порядке).
Итак, я реализовал алгоритм, который создает что-то вроде этого: Theres каждый объектв списке указаны правильные преемники и предшественники .
ITEM: red
predecessor: -
successor: -
ITEM: green
predecessor: -
successor: red
ITEM: blue
predecessor: green
successor: red
ITEM: purple
predecessor: blue, green
successor: blue, red
Как можно отсортировать элементы на основе приведенной выше информации, чтобы получить правильный заказ?Любая помощь будет очень признательна.
let digraph = {
red: {
predecessor: [],
successor: []
},
green: {
predecessor: [],
successor: ["red"]
},
blue: {
predecessor: ["green"],
successor: ["red"]
},
purple: {
predecessor: ["blue", "green"],
successor: ["blue", "red"]
}
}
let itinerary = {}
for (let e of Object.keys(digraph)) {
if (digraph[e].successor.length != 0) itinerary[e] = digraph[e]
}
//console.log(itinerary)
let sorted_pile = []
let overflow = 0;
while (Object.keys(itinerary).length) {
overflow++;
if (overflow > 40) {
console.error("OVERFLOW");
break;
}
let key = Object.keys(itinerary)[0],
entity = itinerary[key];
delete itinerary[key];
sorted_pile.push(key)
let successors = digraph[key].successor
for (succ of successors) {
digraph[succ].predecessor = digraph[succ].predecessor.filter(function(item) {
return item !== key;
})
if (digraph[succ].predecessor.length === 0) itinerary[key] = digraph[succ]
}
}
console.log(sorted_pile)
Редактировать :
let tile_entities = [
{x: 8, y: 0, w: 1, h: 5, id: "rot"},
{x: 5, y: 0, w: 2, h: 1, id: "gruen"},
{x: 7, y: 0, w: 1, h: 1, id: "blau"},
{x: 4, y: 5, w: 4, h: 2, id: "lila"},
]