所以我有4个矩形,我正尝试应用排序算法(画家算法)来确定我需要先绘制哪些3D形状,然后再绘制哪些形状。
注意:相机位于右下角。
正确的顺序是:紫色、红色、蓝色、绿色(当然是反向绘制的顺序)。
所以我实现了一个算法,创建了类似于这样的东西: 每个对象都列出了它的正确的后继和前驱。
我该如何根据上面的信息对项目进行排序以获得正确的顺序?非常感谢您的帮助。
注意:相机位于右下角。
正确的顺序是:紫色、红色、蓝色、绿色(当然是反向绘制的顺序)。
所以我实现了一个算法,创建了类似于这样的东西: 每个对象都列出了它的正确的后继和前驱。
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"},
]
let tile_entities = [ {x: 8, y: 0, w: 1, h: 5, id: "red"}, {x: 5, y: 0, w: 2, h: 1, id: "green"}, {x: 7, y: 0, w: 1, h: 1, id: "blue"}, {x: 4, y: 5, w: 4, h: 2, id: "purple"}, ]
- user3596335