Как я могу выдавить список 2DPoints в сетку и вычесть эти выдавливания в С#? [Конструктивная твердотельная геометрия]

Я уже несколько дней борюсь с проблемой, связанной с Constructive Solid Geometry. На самом деле я начинаю со списка 2D-линий (с 2D-точками), которые мне нужно выдавить в 3D-пространстве. Это то, что мне удается сделать с помощью алгоритма триангуляции, и я могу визуализировать это с помощью Helix Toolkit. Затем я попробовал несколько библиотек с открытым исходным кодом для выполнения логической операции вычитания, и у меня есть лучшие результаты с этой библиотекой (но я, конечно, открыт для других библиотек). Пример, который я приведу, относится к пунктам ниже в этом вопросе.

Код, который я использую для вычитания, представляет собой экструзию, в которой я уже много раз пытался изменить направление вершин против часовой стрелки, чтобы получить правильные нормали, но он все еще не работает.

CSCSG_Solid lovToolSolid = Extrude_Element_List_To_Solid(ElementList, 0, 70);
CSCSG_Matrix4x4 lovTransform = CSCSG_Matrix4x4.RotationY(270) * CSCSG_Matrix4x4.Translation(new CSCSG_Vector3D(0.01, 0.01, -0.01));
var lovHornSolid = Extrude_Element_List_To_Solid(HornList, -200, 200);
var lovHorn_Transformed = lovHornSolid.Transform(lovTransform);
modelGroup.Children.Add(Convert_Solid_To_GeometryModel3D(Colors.Gray, lovToolSolid.Substract(lovHorn_Transformed)));

Вы видите, что треугольники, которые у меня получаются в результате, не совсем правильные и это немного расстраивает.

Я уже экспериментировал с несколькими библиотеками (например, этой: Net3dBool от Sebastian Loncar aka 'arakis') и пробовал с вершинами многоугольников твердых тел несколько алгоритмов, чтобы определить, против часовой стрелки или по часовой стрелке ... Нет решения.

Есть ли кто-то, кто сделал что-то подобное и хочет поделиться, как он решил проблему? Какую библиотеку вы использовали, как вы выдавливали список 2DPoints?

С уважением из Бельгии, Йоахим

HornList
Count = 26
    [0]: {[X=-10][Y=37] [X=0][Y=37]}
    [1]: {[X=0][Y=37] [X=0][Y=14,000000000089]}
    [2]: {[X=0][Y=14,000000000089] [X=0,01][Y=13,997320508164]}
    [3]: {[X=0,01][Y=13,997320508164] [X=15,82][Y=9,761043775828]}
    [4]: {[X=15,82][Y=9,761043775828] [X=15,84][Y=9,75568479198]}
    [5]: {[X=15,84][Y=9,75568479198] [X=15,97][Y=9,720851396963]}
    [6]: {[X=15,97][Y=9,720851396963] [X=15,99][Y=9,715492413115]}
    [7]: {[X=15,99][Y=9,715492413115] [X=19,25][Y=8,841978045789]}
    [8]: {[X=19,25][Y=8,841978045789] [X=19,27][Y=8,836619061941]}
    [9]: {[X=19,27][Y=8,836619061941] [X=27,04][Y=6,754653836751]}
    [10]: {[X=27,04][Y=6,754653836751] [X=27,06][Y=6,749294852902]}
    [11]: {[X=27,06][Y=6,749294852902] [X=34,99][Y=4,624457756924]}
    [12]: {[X=34,99][Y=4,624457756924] [X=34,99][Y=-163,798514080966]}
    [13]: {[X=34,99][Y=-163,798514080966] [X=27,06][Y=-168,37690171564]}
    [14]: {[X=27,06][Y=-168,37690171564] [X=27,04][Y=-168,388448721024]}
    [15]: {[X=27,04][Y=-168,388448721024] [X=19,27][Y=-172,874460312627]}
    [16]: {[X=19,27][Y=-172,874460312627] [X=19,25][Y=-172,886007318011]}
    [17]: {[X=19,25][Y=-172,886007318011] [X=15,99][Y=-174,768169195569]}
    [18]: {[X=15,99][Y=-174,768169195569] [X=15,97][Y=-174,779716200953]}
    [19]: {[X=15,97][Y=-174,779716200953] [X=15,84][Y=-174,854771735948]}
    [20]: {[X=15,84][Y=-174,854771735948] [X=15,82][Y=-174,866318741332]}
    [21]: {[X=15,82][Y=-174,866318741332] [X=0,01][Y=-183,99422649722]}
    [22]: {[X=0,01][Y=-183,99422649722] [X=0][Y=-183,999999999911]}
    [23]: {[X=0][Y=-183,999999999911] [X=0][Y=-193,999999999911]}
    [24]: {[X=0][Y=-193,999999999911] [X=-10][Y=-193,999999999911]}
    [25]: {[X=-10][Y=-193,999999999911] [X=-10][Y=37]}
    
ElementList
Count = 26
    [0]: {[X=3,48943396645][Y=-185,7764239243] [X=1,94874012955][Y=-192,4499021086]}
    [1]: {[X=1,94874012955][Y=-192,4499021086] [X=-0][Y=-193,999999999911] [X=-1,94874012955][Y=-192,4499021086] [X=-0][Y=-191,999999999937]}
    [2]: {[X=-1,94874012955][Y=-192,4499021086] [X=-6,00939006965][Y=-174,8612948592]}
    [3]: {[X=-6,00939006965][Y=-174,8612948592] [X=-5,61964204375][Y=-174,7713144375]}
    [4]: {[X=-5,61964204375][Y=-174,7713144375] [X=-14,00000000005][Y=-138,4719961321]}
    [5]: {[X=-14,00000000005][Y=-138,4719961321] [X=-14,00000000005][Y=-3]}
    [6]: {[X=-14,00000000005][Y=-3] [X=-13,00000000005][Y=-2]}
    [7]: {[X=-13,00000000005][Y=-2] [X=-10,00000000005][Y=-2]}
    [8]: {[X=-10,00000000005][Y=-2] [X=-10,00000000005][Y=16,5]}
    [9]: {[X=-10,00000000005][Y=16,5] [X=-6,50000000005][Y=20]}
    [10]: {[X=-6,50000000005][Y=20] [X=-6,50000000005][Y=21,5]}
    [11]: {[X=-6,50000000005][Y=21,5] [X=-10,00000000005][Y=25]}
    [12]: {[X=-10,00000000005][Y=25] [X=-10,00000000005][Y=36]}
    [13]: {[X=-10,00000000005][Y=36] [X=-9,00000000005][Y=37]}
    [14]: {[X=-9,00000000005][Y=37] [X=8,99999999995][Y=37]}
    [15]: {[X=8,99999999995][Y=37] [X=9,99999999995][Y=36]}
    [16]: {[X=9,99999999995][Y=36] [X=9,99999999995][Y=25]}
    [17]: {[X=9,99999999995][Y=25] [X=6,49999999995][Y=21,5]}
    [18]: {[X=6,49999999995][Y=21,5] [X=6,49999999995][Y=20]}
    [19]: {[X=6,49999999995][Y=20] [X=9,99999999995][Y=16,5]}
    [20]: {[X=9,99999999995][Y=16,5] [X=9,99999999995][Y=-18]}
    [21]: {[X=9,99999999995][Y=-18] [X=5,85786437625][Y=-22,1421356237]}
    [22]: {[X=5,85786437625][Y=-22,1421356237] [X=1,522409349763][Y=-28,630602600119] [X=-5E-11][Y=-36,2842712474] [X=20,000000000194][Y=-36,284271247563]}
    [23]: {[X=-5E-11][Y=-36,2842712474] [X=-5E-11][Y=-168,3833127175]}
    [24]: {[X=-5E-11][Y=-168,3833127175] [X=0,12856288642][Y=-170,64737699287] [X=0,51259870425][Y=-172,8823338044] [X=20][Y=-168,383312717497]}
    [25]: {[X=0,51259870425][Y=-172,8823338044] [X=3,48943396645][Y=-185,7764239243]}   

person JoachimAlly    schedule 15.03.2021    source источник


Ответы (1)


В С++ есть несколько библиотек, вы можете использовать библиотеку С++ и вызывать из С# для обработки сетки, а затем использовать инструментарий спирали для представления. Обычно эти библиотеки написаны на С++ из соображений производительности и кроссплатформенности.

person Lance H    schedule 16.03.2021
comment
Привет, Ланс, спасибо за быстрый ответ. Есть ли конкретный (с открытым исходным кодом), который вы бы порекомендовали? В идеальном мире я начинаю с двух 2D-полигонов, делаю эти два вытягивания, поворачиваю один из них и выполняю вычитание. Я изучил API Blender, движок GODOT... но с этими библиотеками это казалось невозможным. - person JoachimAlly; 16.03.2021
comment
opencsg.org - person Lance H; 17.03.2021
comment
Спасибо за совет! - person JoachimAlly; 17.03.2021