【C#-Helixtoolkit】HelixViewport3D绘制曲线

这篇具有很好参考价值的文章主要介绍了【C#-Helixtoolkit】HelixViewport3D绘制曲线。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

helixtoolkit,.net,winform,wpf,angularjs,webview

WPF-Helixtoolkit绘制螺旋路径

helixtoolkit,.net,winform,wpf,angularjs,webviewWPF-helixtoolkit绘制3D曲线路径

helixtoolkit,.net,winform,wpf,angularjs,webviewWinForm加载helixtoolkit

视频演示

部分代码:

一、绘制螺旋线

private void GatherData(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                //Thread.Sleep(5);  // 50ms数据采样周期


                // Generate a test trace: an upward spiral with square corners
                //生成一个测试轨迹:一个带有方角的向上螺旋线
                double t = stopwatch.Elapsed.TotalSeconds * 1;//* 0.25;
                double sint = Math.Sin(t);
                double cost = Math.Cos(t);
                double x, y, z = t * 0.5;
                Color color;


                if (sint > 0.0 && cost > 0.0)
                {
                    if (sint > cost)
                    {
                        x = 100.0;
                        y = 70.71 * cost + 50.0;
                    }
                    else
                    {
                        x = 70.71 * sint + 50.0;
                        y = 100.0;
                    }
                    color = Colors.Red;//红色
                }
                else if (sint < 0.0 && cost < 0.0)
                {
                    if (sint < cost)
                    {
                        x = 0.0;
                        y = 70.71 * cost + 50.0;
                    }
                    else
                    {
                        x = 70.71 * sint + 50.0;
                        y = 0.0;
                    }
                    color = Colors.Red;//红色
                }
                else
                {
                    x = 50.0 * sint + 50.0;
                    y = 50.0 * cost + 50.0;
                    color = Colors.Blue;//蓝色
                }


                var point = new Point3DPlus(new Point3D(x, y, z), color, 1.5);//创建新的自定义点
                bool invoke = false;
                lock (points)//锁定点集
                {
                    points.Add(point);//添加到点集
                    invoke = (points.Count == 1);//每新增一个点就开始回调绘制数据函数
                }


                if (invoke)//在System.Windows.Threading.Dispatcher关联的线程上以指定的优先级异步执行指定的委托。
                    Dispatcher.BeginInvoke(DispatcherPriority.Background, (Action)PlotData);
            }
        }
        //绘制数据
        private void PlotData()
        {
            if (points.Count == 1)
            {
                Point3DPlus point;
                lock (points)
                {
                    point = points[0];
                    points.Clear();
                }


                plot.AddPoint(point.point, point.color, point.thickness);//绘制单个点
            }
            else
            {
                Point3DPlus[] pointsArray;//点数组
                lock (points)//锁定点集
                {
                    pointsArray = points.ToArray();
                    points.Clear();
                }


                foreach (Point3DPlus point in pointsArray)
                    plot.AddPoint(point.point, point.color, point.thickness);//绘制轨迹
            }
        }

二、绘制3D曲线路径

private void GatherData(object sender, DoWorkEventArgs e)
        {
            var readDataStream = new System.IO.StreamReader(filePath, Encoding.UTF8);


            while (true)
            {
                Thread.Sleep(200);  // can use to change the poltting rat
                List<Point3DPlus> points = new List<Point3DPlus>();


                Color color = Colors.Black;
                double x = 0, y = 0, z = 0;


                const int addPointSum = 50; //can use to change the poltting rate


                for (int i = 0; i < addPointSum; i++)
                {
                    if (readDataStream.EndOfStream)
                    {
                        break;
                    }


                    var readDataLine = readDataStream.ReadLine();


                    var readDataNumbers = readDataLine.Split(' ');
                    //if (readDataNumbers.Count()==3)
                    {                   
                        try
                        {
                            x = Convert.ToDouble(readDataNumbers[0]);
                            y = Convert.ToDouble(readDataNumbers[1]);


                            if (readDataNumbers.Length >= 3)
                            {
                                z = Convert.ToDouble(readDataNumbers[2]);
                            }
                            else
                            {
                                z = 0;
                            }
                        }
                        catch
                        {
                            System.Windows.MessageBox.Show("Data format is error. The format is 'x y z'.", "Error", MessageBoxButton.OK,
                                MessageBoxImage.Error);
                            Environment.Exit(-1);
                        }
                    }
                    var point = new Point3DPlus(new Point3D(x, y, z), color, 1.5);


                    points.Add(point);
                }


                bool invoke = false;
                if (points.Count > 0)
                {
                    pointsList.Enqueue(points);//点集队列
                    invoke = true;
                }


                if (invoke)//执行更新显示
                {
                    Dispatcher.BeginInvoke(DispatcherPriority.Background, (Action)PlotData);
                }
            }
        }


        private void PlotData()
        {
            if (pointsList.Count > 0)
            {
                bool resultPop = pointsList.TryDequeue(out var points);//取出点集
                if (resultPop)
                {
                    var pointsArray = points.ToArray();


                    foreach (Point3DPlus point in pointsArray)
                        plot.AddPoint(point.point, point.color, point.thickness);//绘制
                }
            }
        }

三、WinForm加载Helixtoolkit控件

将WPF中上面示例的主窗体封装成WPF自定义控件public partial class MyControl : UserControl,之后引用并添加到winform窗体。缺点是不能实时刷新。等完全绘制完毕再更新显示。以下是自定义控件的HelixPlot数据显示方法。

public void GatherData()
        {
            List<Point3DPlus> points = new List<Point3DPlus>();
            for(int tick=0;tick<3660;tick++)
            {
               // Thread.Sleep(50);
                double t = (double)tick/60.0;
               // tick++;
                double sint = Math.Sin(t);
                double cost = Math.Cos(t);
                double x, y, z = t;
                Color color;


                x = 50.0 * sint + 50.0;
                y = 50.0 * cost + 50.0;
                if (flag)
                {
                    color = _graphcolor;
                    flag = false;
                }
                else
                {
                    flag = true;
                    color = _pausecolor;
                }


                var point = new Point3DPlus(new Point3D(x, y, z), color, 1.5);
                bool invoke = false;
                lock (points)
                {
                    points.Add(point);
                    invoke = (points.Count == 1);
                }


                if (invoke)
                {
                    Dispatcher.BeginInvoke(DispatcherPriority.Background, (Action)delegate () {
                        if (points.Count == 1)
                        {
                            Point3DPlus p;
                            lock (points)
                            {
                                p = points[0];
                                points.Clear();
                            }


                            plot.AddPoint(p.point, p.color, p.thickness);


                        }
                        else
                        {
                            Point3DPlus[] pointsArray;
                            lock (points)
                            {
                                pointsArray = points.ToArray();
                                points.Clear();
                            }


                            foreach (Point3DPlus pt in pointsArray)
                                plot.AddPoint(pt.point, pt.color, pt.thickness);


                        }
                    });
                }       
            }
        }

在winform中单击按钮绘制螺旋线:

private void btnDraw_Click(object sender, EventArgs e)
        {
            myControl1.BackgroundBrush = System.Windows.Media.Brushes.Black;
            myControl1.AxisBrush = System.Windows.Media.Brushes.White;
            myControl1.MarkerBrush = System.Windows.Media.Brushes.Yellow;
            myControl1.GraphColor = Colors.LightGreen;
            myControl1.PauseColor = Colors.Black;
            myControl1.Satellite = "USI";




            initBackground = myControl1.Background;
            initAxisBrush = myControl1.AxisBrush;
            initMarkerBrush = myControl1.MarkerBrush;
            initGraphColor = myControl1.GraphColor;
            initPauseColor = myControl1.PauseColor;
            initSatellite = myControl1.Satellite;
            myControl1.GatherData();
        }

参考:

https://www.codeproject.com/Articles/1246255/Plotting-a-Real-time-D-Toolpath-with-Helix-Toolkit

https://gitee.com/mirrors/Helix-Toolkit

https://github.com/helix-toolkit/helix-toolkit/issues/1341

The End文章来源地址https://www.toymoban.com/news/detail-542574.html

到了这里,关于【C#-Helixtoolkit】HelixViewport3D绘制曲线的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WinUI(WASDK)使用HelixToolkit加载机器人3D模型并进行项目实践

    本人之前开发了一个叫电子脑壳的上位机应用,给稚晖君ElectronBot开源机器人提供一些功能,但是由于是结合硬件才能使用的软件,如果拥有硬件的人员太少,就会导致我的软件没什么人用,于是我就想着能不能将机器人硬件的模型加载到软件里,这样用户就可以不使用硬件

    2024年02月08日
    浏览(119)
  • HelixToolkit使用教程

    HelixToolkit使用总结: 问题点:         3d光源         相机         网格信息 1、配置HelixViewPort3d基本参数 2、配置相机参数和相机位置:HelixViewPort3D.DefaultCamera         设置相机的放置方向和观看位置 3、配置光线:hv:SunLight 4、配置坐标网格 hv:GridLinesVisual3D 5、配置模型的属

    2024年02月10日
    浏览(65)
  • 3D简单壳体CAD绘制

    1.初始设置 1.有的可能软件打开时没有显示上面一层的菜单栏,在小箭头那里打开下面的显示菜单栏。 2. 画的是三维图,修改视图,改为西南等轴测 3.不同视角观看三维体, shift+alt+按住鼠标中键移动 ,即可更改角度。 1.画长方体 1.选择矩形,指定第一个角点,随意指定就行

    2024年02月09日
    浏览(36)
  • Python绘制3D曲面图

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在数据可视化的世界中,3D曲面图是一种强大的工具,能够将复杂的数据模式以清晰直观的方式展现出来。Python提供了多种库和工具,使得创

    2024年04月28日
    浏览(36)
  • python绘制3D条形图

    python条形图系列: 带有误差棒的条形图💎 分组条形图💎 3D条形图 尽管在matplotlib支持在一个坐标系中绘制多组条形图,效果如下 其中,蓝色表示中国,橘色表示美国,绿色表示欧盟。从这个图就可以非常直观地看出,三者自2018到2022年的GDP变化情况。但相比之下,通过增加

    2024年02月15日
    浏览(39)
  • echarts绘制3D地图

    echarts绘制3D地图实现平移、缩放 所需依赖  准备工作:main.js中引入依赖   先上图 代码直接复制粘贴就可以使用了,根据自己需求稍作修改就可以使用了  html代码部分 js代码部分 绘制3D地图可能会引起地图上标注点,跟所需点有偏差的情况,这样需要去修改引用的json文件

    2024年02月11日
    浏览(38)
  • Qt使用qwtplot3d绘制3D曲面

    qwtplot3d 是一个基于 Qt/OpenGL 的 C++ 程序库,为开发者提供了一些3D组件。其核心通过调用 openGL 库来完成,可以实现三维曲面绘制,三维状态下折线,散点等图形的绘制。最新的版本为 qwtplot3d-0.2.7,更新于 2007-06-25,已经有十几年没更新了。   用 Qt 打开工程之后,需要先在

    2024年02月07日
    浏览(49)
  • pycharm中绘制一个3D曲线

    运行后结果如下:

    2024年02月04日
    浏览(44)
  • vue+Highcharts绘制3D饼图

     

    2024年02月13日
    浏览(38)
  • VUE+echart绘制地图(3D)

    上一篇分享了一个伪3D的地图,这次我们搞一个真实的3D地图。 效果图如下: 要实现这种效果,首先得引入两个不同的依赖: echarts-liquidfill和echarts-gl,引入很简单: 引入后开始我们的编码工作: template 部分: js部分: 按照步骤来就可以实现和效果图相同的效果,同理,也

    2024年02月11日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包