【问题标题】:How do I do graphics easily in a modern linux? [closed]如何在现代 linux 中轻松绘制图形? [关闭]
【发布时间】:2014-05-06 21:37:07
【问题描述】:

这是一个过去可以编写的 C 程序示例:

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

void main()
{
    int gd=DETECT, gm;

    initgraph(&gd, &gm, "c:\\turboc\\bgi");
    circle(200,100,150);

    getch();
    closegraph();
}

我认为这是 MSDOS 下的 turbo C。它为您提供在屏幕上的绘图,并且可以轻松扩展以制作快速动画图形,例如在 xscreensaver hacks 中发现的图形。

我将如何在 ubuntu 上的 gcc 中编写等效项?可以用Java实现吗?

【问题讨论】:

  • gcc 中的等价物是什么意思?
  • 我的意思是,我可以简单地画一些东西,还是我必须花三页代码与 X 协商许可?
  • @JohnLawrenceAspden 从您对 Linux 上的graphics.h 的研究中发现了什么?
  • 这里是JavaFX的演示。您必须先安装 JavaFX,但一旦它运行,您就可以查看并使用演示代码。 oracle.com/technetwork/java/javase/overview/…
  • 只是一个评论:BGI 图形不是很快。对于低分辨率图形来说没问题,但即便如此,它也比用汇编编写的相同图形例程慢得多。

标签: java c linux graphics turbo-c++


【解决方案1】:
#include<X11/Xlib.h>
#include<stdlib.h>

/* gcc -std=gnu99 -o circle circle.c -lX11 */

int main (int argc, char *argv[])
{

  /* connect to the X server and make a window */
  Display *dpy = XOpenDisplay (getenv ("DISPLAY"));
  Window w = XCreateSimpleWindow (dpy, DefaultRootWindow (dpy),
                                  100, 100, 640, 480, 1,
                                  BlackPixel (dpy, DefaultScreen (dpy)),
                                  WhitePixel (dpy, DefaultScreen (dpy)));

  /* raise it and wait */
  XSelectInput (dpy, w, StructureNotifyMask);
  XMapRaised (dpy, w);
  for(XEvent e; ( e.type != MapNotify );
      XWindowEvent (dpy, w, StructureNotifyMask, &e));

  /* create a graphics context for drawing in the window */
  GC g = XCreateGC (dpy, w, 0, NULL);

  /* draw a circle */
  XDrawArc(dpy,w,g,200,100,150,150,0,360*64);
  XFlush(dpy);

  /*wait for key press*/
  XSelectInput (dpy, w, KeyReleaseMask);
  for(XEvent e; ( e.type != KeyRelease ); 
      XWindowEvent (dpy, w, KeyReleaseMask, &e));

  /*clean up*/
  XDestroyWindow( dpy, w );
  XCloseDisplay (dpy);
}

【讨论】:

    【解决方案2】:

    好的,关于基础的几句话:

    1. 您提供的示例使用名为 BGI 的库 - Borland 图形接口 - MS DOS 时代的非常古老的东西
    2. GCC 本身只是一个编译器 - 你必须搜索支持绘图的库
    3. 在 Linux 上,我们使用多个 GUI 工具包,但目前只有 Gtk 和 Qt 相关。
    4. 如果您想要低级图形库,您可以查看 Allegro (http://alleg.sourceforge.net/) 或 SDL (http://www.libsdl.org/)

    但说真的,我认为你的方向是错误的。您应该专注于使用现代工具包(Gtk、Qt)、现代语言(C++、C#、Java、Python 等)和用于“特殊效果”的 OpenGL 的现代事件驱动 GUI 编程。

    【讨论】:

      【解决方案3】:

      您需要了解,Linux 上的图形通常是通过X11 完成的(也许Wayland 将来可能会成为竞争对手)。

      那么你应该使用一些 X11 工具包。如果您想在 C 中使用它,请考虑 GTKlibSDL。但如果你了解 C++,我会推荐 Qt(了解它的 graphics 能力)。

      你可以找到一些简短的 Qt 或 Gtk 或 SDL 示例程序,大约一百行。

      Java 至少有 Swing

      请注意,Linux 本质上是一个多任务系统。所以你想运行几个图形程序。换句话说,您需要多个窗口(以及一个窗口或桌面管理器)。因此,您需要一个事件循环,并且您需要处理调整大小和/或重叠的窗口。因此,复杂性比上个世纪的 TurboC 时代要大得多!

      或者,考虑让您的应用程序成为一个专门的 HTTP 服务器(并用 HTML5 编码图形),例如使用 libonion 作为 C HTTP 服务器库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-03
        • 1970-01-01
        • 1970-01-01
        • 2011-03-05
        • 2021-12-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多