如何从线创建3D平面

时间:2017-01-11 17:01:55

标签: c# wpf 3d helix-3d-toolkit

我正在使用Helix Toolkit和WPF,我想把一堆线条转换成表面。为了澄清,我有一组三维曲线,我想得到所有这些线条所产生的弯曲刀片。 (这些线表示通过刀片的线条。)

在某种程度上,我想做与this question所要求的相反的事情(将线条用作线框将其转换为模型)。

到目前为止,我有这个XAML:

<Window x:Class="_3D_Geometry_Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:helix="clr-namespace:HelixToolkit.Wpf;assembly=HelixToolkit.Wpf"
    xmlns:local="clr-namespace:_3D_Geometry_Test">
    <Grid>
        <helix:HelixViewport3D x:Name="view1">
            <helix:DefaultLights/>               
            <helix:MeshGeometryVisual3D x:Name="bladesMeshGeo" />    
        </helix:HelixViewport3D>
    </Grid>
</Window>

代码隐藏的相关部分(我不包括GetSplines()GetSpars()的内容,因为它们完全由我添加了大量Point3D个对象列表):

using HelixToolkit.Wpf;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Media3D;
namespace _3D_Geometry_Test
{
    public partial class MainWindow : Window
    {
        const int NUM_SPLINES = 11;
        const int NUM_SPARS = 10;
        public MainWindow()
        {
            InitializeComponent();

            List<Point3D>[] splines = GetSplines();
            List<Point3D>[] spars = GetSpars();

            for (int i = 0; i < NUM_SPLINES; i++)
            {
                bladesMeshGeo.Children.Add(new LinesVisual3D
                {
                    Points = new Point3DCollection(splines[i]),
                    Color = Colors.Red
                });
            }

            for (int i = 0; i < NUM_SPARS; i++)
            {
                bladesMeshGeo.Children.Add(new LinesVisual3D
                {
                    Points = new Point3DCollection(spars[i]),
                    Color = Colors.Blue
                });
            }
        }
    }
}

结果如下:

curves

但我想要这样的事情:

blades

编辑:我并不喜欢Helix Toolkit,所以如果有人知道另一个可以实现这一目标的图书馆,我会很高兴听到它!

1 个答案:

答案 0 :(得分:0)

好的,所以我提出的最好的方法是制作很多很多连接所有点的小三角形,就像这样(XAML保持不变):

[Fact]
public async void UpdateMerchantSuccessPushesMerchantEntityToDataStore()
{
    //Arrange
    var originalMerchantConfig = ModelFactory.GetMerchant();
    var merchants = new List<MerchantConfigurationEntity>();

    var dataAccess = new Mock<IRepository<MerchantConfigurationEntity>>();

    dataAccess.Setup(m => m.UpdateOneAsync(It.IsAny<MerchantConfigurationEntity>()))
        .Callback((MerchantConfigurationEntity m) => merchants.Add(m))
        .Returns(Task.FromResult(1));

    var merchantRepo = new MerchantConfigurationRepository((MongoDBRepository<MerchantConfigurationEntity>)dataAccess.Object);

    //Act
    var result = await merchantRepo.UpdateMerchant(originalMerchantConfig);

    //Assert
    result.ShouldNotBeNull();
    result.Sucess.ShouldBeTrue();
    merchants.Count.ShouldBe(1);
    merchants[0].merchantId.ShouldBe(originalMerchantConfig.merchantId);
}

生成的图像如下所示:

Image

这绝对是对线框的改进,但它仍然不是很平滑(不确定是否显示在我发布的图像上),而且我确信必须有更好的解决方案,所以我会离开这暂时没有答案。只需发布我的(临时)解决方案,万一它可以帮助任何人。