Я уже несколько дней борюсь с проблемой, связанной с 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]}