You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.7 KiB
54 lines
1.7 KiB
#pragma once
|
|
#include <vector>
|
|
|
|
namespace algoim::organizer
|
|
{
|
|
// bitfield
|
|
struct Blob {
|
|
unsigned int isPrimitive : 1; // 1 for leaf
|
|
unsigned int nodeOp : 5; // 0 for intersection, 1 for union, 2 for difference
|
|
// unsigned int ignoreMod : 2; // 目前用不到
|
|
unsigned int inOut : 2; // 0 for unknown, 1 for in, 2 for out
|
|
unsigned int isLeft : 1;
|
|
unsigned int ancestor : 23;
|
|
};
|
|
|
|
bool isPrimitive(Blob b) { return b.isPrimitive == 1; }
|
|
|
|
unsigned int type(Blob b) { return 0; }
|
|
|
|
bool isLeft(Blob b) { return b.isLeft == 1; }
|
|
|
|
struct BlobTree {
|
|
std::vector<Blob> structure;
|
|
};
|
|
|
|
void propagate(BlobTree &tree, unsigned int nodeIdx, bool in)
|
|
{
|
|
const std::size_t rootIdx = tree.structure.size() - 1;
|
|
for (unsigned int nowIdx = nodeIdx; nowIdx != rootIdx; ++nodeIdx) {
|
|
unsigned int nextIdx = isLeft(tree.structure[nowIdx]) ? tree.structure[nowIdx].ancestor : nodeIdx + 1;
|
|
if (tree.structure[nowIdx].inOut == 2) {
|
|
// out
|
|
if (tree.structure[nextIdx].nodeOp == 0) {
|
|
// intersection
|
|
tree.structure[nextIdx].inOut = 2;
|
|
nextIdx = nowIdx;
|
|
continue;
|
|
} else if (tree.structure[nextIdx].nodeOp == 2 && isLeft(tree.structure[nowIdx])) {
|
|
// difference
|
|
tree.structure[nextIdx].inOut = 2;
|
|
nextIdx = nowIdx;
|
|
// continue;
|
|
} else {
|
|
return;
|
|
}
|
|
} else if (tree.structure[nowIdx].inOut == 1) {
|
|
// in
|
|
// TODO:
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
}; // namespace algoim::organizer
|
|
|