【问题标题】:How to draw functions in C++如何在 C++ 中绘制函数
【发布时间】:2013-04-13 06:49:18
【问题描述】:

我想用 C++ 创建函数图表。任何人都可以帮助我开始吗? 假设我要绘制函数 y=x (它是一条通过点 (0,0) (1,1) (2,2) ..... (20,20) 等的直线) 我该怎么做? (如果您还建议如何绘制 y 和 x 轴,那就更好了) 抱歉,书上没有(顺便说一句,欢迎推荐好的文本 :-) C++),而在网上,主要是对游戏图形的引用。 我能找到的对我的问题的唯一认真参考是: somewhat related question asked in this very forum(上帝保佑,我们有stackoverflow!)

【问题讨论】:

  • 如果你想在你的程序中绘制图形,你必须创建一个GUI程序。而C++标准库没有提供任何绘制图形的函数。但是你可以使用你的操作系统提供的函数来绘制图形。画。
  • 只是想补充一点,你没有有一个 GUI 来创建图形输出 - 没有理由命令行应用程序不能使用 libgd 生成图形输出或类似。

标签: c++


【解决方案1】:

我会考虑两种选择:

  • 如果你想用 C++ 做所有事情,你可能需要一个外部库。 OpenGL是一个解决方案,还有Qt,可能更容易学习,更大(也更强大)。
  • 如果您有能力输出一个文件并用另一个程序读取它,最简单的方法是简单地编写一个带有点坐标的 ASCII 文件,并使用Octave(免费)绘制。

【讨论】:

  • 挑剔:QT GUI 需要使用 MOC,它将您的代码呈现为 C++ 以外的其他东西。
  • @KitsuneYMG 是的,但实际上这不是问题。
【解决方案2】:

您还可以使用Gnuplot,这是一个交互式绘图程序:您的 C++ 代码处理和计算您的数据,然后它可以将结果导出到 Gnuplot 可以处理的文件或标准输出。例如,您可以执行以下操作:

my_program | gnuplot

它将使用您的程序的结果调用 Gnuplot。

Gnuplot非常强大,可以查看examples available here


(来源:sourceforge.net

您可以在此处找到有关 C/C++ 中 Gnuplot 的更多信息:

How to plot graphs in Gnuplot in Real time in C++?

更新

另一种可能性是使用R。这种语言在统计学家中非常有名。你可能想看看some examples

相关问题:How to run plot of R into C/C++?

【讨论】:

  • 感谢您的提示。我想按照书中的示例进行操作,但这看起来是未来的绝佳解决方案。
  • @BenC 是的,与 ROOT 一起,它是最好的选择,所以我决定开始探索两者并使用最适合我需要的每项任务的方法。我该如何开始?怎么能安装呢?有什么简单的教程吗?
  • 您可以查看this tutorial。在那之后,这真的取决于你想要绘制什么。安装很简单。如果您使用的是 Windows,this 可能会对您有所帮助(我只在 Linux 上使用过)。
  • @BenC Ben,别误会我,但我会吻你! :-)
【解决方案3】:

我不知道一种有效的快速简单的方法来执行您在 c++ 中描述的操作。 您要么将文本输出到控制台以显示您希望显示的“线条”的效果。或使用 directx 或 opengl 设置适当的 GUI 界面。 许多库确实存在,它们简化了设置 GUI 的任务。但有初始开销。

我建议制作一个 c# 表单应用程序并查看其中的绘图线。它还可以让您轻松地在运行时输入方程式,而不是对它们进行硬编码。

【讨论】:

  • ASCII 艺术的替代方法是简单地输出图像文件(例如 BMP、PCX、GIF 等)。
  • 确实如此,但您仍需要设置某种 GUI 来呈现图像。而 ascii 艺术可以在控制台中实现。
  • 一个网络浏览器应该足以查看常见的图像格式。
【解决方案4】:

大约三个月前,我也有同样的问题。我发现为我的应用程序绘制的最佳方法是利用 Qt 框架(因为它已经为您创建了一个 GUI,然后利用这个工具:

Qt plotting widget

此小部件在编译并与您的项目链接后,可让您直接从界面绘制 2d 图形。这样就省去了写入文件、用matlab加载等的麻烦。

目前,它只处理二维图,但将其扩展到三维或曲面图并不难。

祝你好运!

【讨论】:

    【解决方案5】:

    我使用 ROOT。这是大多数粒子物理学家使用的方法,尤其是在 CERN 和费米实验室。免费。它们有适用于 Linux、Mac 和 Windows 的版本。 http://root.cern.ch/drupal/

    制作图表、直方图和生成适合出版的输出很容易。

    编辑:它基于 C++ 构建,但也具有 python 绑定。

    编辑:如果在 linux 上安装 root 以使用带有 GCC 的 ROOT 编译代码,例如:

    g++ foo.C -o foo `root-config --cflags --libs` -O3  
    

    【讨论】:

    • @raxman 哇!我有科学背景,我喜欢这些东西!谢谢你的信息!!
    • @raxman 真的很棒!!!不幸的是,我不是一个非常高级的程序员。你能告诉我(或提供一个页面)我如何开始使用它吗?安装等...
    • 尝试谷歌搜索“ROOT cern 教程”。你可以从这个开始root.cern.ch/root/html/tutorials/hist/hsum.C.html 安装应该很容易。除了 Cygwin,我从未在 Windows 上使用过 ROOT。
    【解决方案6】:

    这几天我发现了几件事: 1. 《C++编程与图形导论》一书C.Pozrikidis 2.Visual Studio C++ 2010 express and OpenGL (请参阅该页面中的最后一条评论) 谁能提出更好的解决方案? (教科书、免费 dll 等)

    【讨论】:

    • 我建议使用 Qt(特别是,子类化 QWidget 并重新实现 paintEvent(QPaintEvent*) 方法。QPainter 类具有您想要使用的所有绘图命令,例如 drawLine() ) Qt 的优点是它比大多数图形 API 更易于使用,并且一旦您编写了程序,它就可以在几乎任何操作系统上编译和运行。 Qt 在 LGPL 下免费提供。
    • 顺便说一下,在上面提到的书中作者使用了freeglut库。我访问了他们的网站,谁能教我如何安装它?实际上有一个专门的页面,但我什么都不懂。这是他们的网站:freeglut.sourceforge.net
    • VOGLE 库(书中使用的更简单的图形库;Unix):home.comcast.net/~urbanjost/CLONE/LIBS/LIBRARY/libvogle/html/…
    • @JeremyFriesner。十分感谢。如果 freeglut 没有按预期工作,我会试试 Qt。目前我更喜欢按照书中的例子来学习。
    【解决方案7】:

    您可以使用 Windows.h 中的一些功能。从控制台功能开始。它们是一个很好的起点,使我们能够像在笛卡尔平面上一样在控制台上工作。

    虽然我从来没有尝试过和他们一起画画。我已经能够为文本演示创建漂亮的表格和布局。就像联系人的姓名和电话号码作为联系人应用程序中的表格一样。

    这些函数可以将光标移动到特定坐标。并在那里写一些东西。总体而言,它们非常像笛卡尔平面一样工作。但只有坐标系不是我们使用的正常坐标系(4 个象限),它更像是一种计算机类型系统,只有一个象限,在 x 轴上从左到右标记,在 y 轴上从上到下标记。您可能必须构建一些功能以优化此系统或我们使用的正常系统。

    但总而言之,它很有用,你可以试试。

    【讨论】:

      【解决方案8】:

      我安装了 gnuplot(非常简单:在硬盘中创建一个文件夹,解压缩并从 wgnuplot.exe 发送到 destop 的链接),现在我将要从 Visual Studio (C++) 绘制的数据导出为 .txt 文件然后我从 gnuplot 窗口调用这些文件。只是为了向其他人节省我经历过的同样的时间浪费和头痛:-)

      我也安装了ROOT,很简单,cern页面里有正规的微软安装程序。链接在这里: http://root.cern.ch/drupal/content/production-version-534 并滚动到页面底部,然后选择与您的 Visual Studio 兼容的 MSI 版本。无论如何,我仍然必须学习如何在 Visual Studio 中使用 ROOT。帮助将不胜感激。 这个页面也有助于在 Visual Studio 中使用 ROOT 创建项目:http://root.cern.ch/phpBB3/viewtopic.php?f=3&t=11641

      以上所有内容均适用于 WINDOWS 用户。

      【讨论】:

        【解决方案9】:
        i was just plotting a simmilar function y=x²
        in windows, or any library based on windows you will probably intercept message WM_PAINT
        
             case WM_PAINT:
             HDC hdc = beginpaint();
        
        // change device contexts      hdc y      axys orientation
        // change logical coordinates of point (0,0) to half of width and half of //eight of your client area
        
        // u might want to change from pixels to mm
        // for each x from -10 to 10 y = x²
        // draw a little line for each point in this range
        
        // end painting, this will release     hcd
        

        【讨论】:

        • 请解释一下你的答案
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多