首页 > 解决方案 > 如何将 2DPoints 列表挤出到网格中并在 C# 中减去这些挤出?[构造立体几何]

问题描述

我已经为有关Constructive Solid Geometry的问题苦苦挣扎了几天。实际上,我从必须在 3D 空间中拉伸的 2DLines(带有 2DPoints)列表开始。这是我设法用三角测量算法做的事情,我可以用 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)));

您会看到我得到的三角形并不完全正确,这有点令人沮丧。

我已经尝试了多个库(例如这个库:来自 Sebastian Loncar aka 'arakis' 的 Net3dBool)并尝试了实体多边形的顶点,多种算法来确定它是逆时针还是顺时针......没有解决方案。

是否有人做过类似的事情并想分享他是如何解决问题的?您使用了哪个库,您是如何挤出 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]}   

标签: c#.nethelix-3d-toolkitcsg

解决方案


c++中有几个库,你可以使用c++库并从c#调用来处理网格,然后使用helix工具包进行演示。通常出于性能和跨平台的原因,这些库是用 C++ 编写的。


推荐阅读