python中的以下代码(以及为什么)

时间:2009-12-14 15:21:12

标签: python c

我正在学习python,因为它看起来非常好,我知道一点ruby和perl。

以下是将3D点绘制到屏幕上的C程序。我以此为例,因为它使用数组,结构和函数调用。我遗漏了课程,因为我相信在所有语言中都使用了类似的(OOP)东西(如果我错了,请纠正我)。明白我知道如何在python中编写以下内容(谷歌的一些帮助),但我想知道你会使用什么样的方法以及为什么。

如果您没有时间或者不喜欢这种事情,请不要觉得有必要回答!

#include <stdlib.h>

int screenWidth = 10;
int screenHeight = 10;

char *buf;

inline void draw3dPoint(int *i3dPoint) {
    buf[
        (((i3dPoint[1] / i3dPoint[2]) + (screenHeight/2)) * screenWidth) +
        (i3dPoint[0] / i3dPoint[2]) + (screenWidth/2)] = 1;
}

main() {
    int x, y;
    buf = malloc(sizeof(char)*screenWidth*screenHeight);
    for(x = 0; x < screenWidth * screenHeight; x++)
        buf[x] =0;

    int *i3dPoint = malloc(sizeof(int)*3);

    i3dPoint[0] = 3; i3dPoint[1] = 0; i3dPoint[2] = 5;
    draw3dPoint(i3dPoint);

    i3dPoint[0] = 0; i3dPoint[1] = 4; i3dPoint[2] = 2;
    draw3dPoint(i3dPoint);

    i3dPoint[0] = -3; i3dPoint[1] = -4; i3dPoint[2] = 3;
    draw3dPoint(i3dPoint);

    for(y = 0; y < screenHeight; y++) {
        for(x = 0; x < screenWidth; x++)
            if(buf[(y*screenWidth)+x])
                printf("#");
            else
                printf(" ");
        printf(".\n");
    }

    free(buf);
    free(i3dPoint);

    return 0;
}

3 个答案:

答案 0 :(得分:2)

这是一个直接端口,仅适用于python3,因为打印事物与x-if-a-else-y结合

screenWidth = 10
screenHeight = 10

buf = [False] * screenWidth * screenHeight
def draw3dpoint(x,y,z):
    pt = int((((y / z) + (screenHeight/2)) * screenWidth) + (x / z) + (screenWidth/2))
    buf[pt] = True

draw3dpoint(3,0,5)
draw3dpoint(0,4,2)
draw3dpoint(-3,-4,3)

for y in range(screenHeight):
    for x in range(screenWidth):
        print(('#' if buf[y * screenWidth + x] else ' '), end='')
    print()

如果您希望打印在3.0以下的python中工作,请执行以下操作(请注意,由于奇怪的除法行为导致输出不同,如本答案的第一条评论中所述)。还要感谢第三条评论,我可以稍微改进一下。

for y in range(screenHeight):
    for x in range(screenWidth):
        print (buf[y * screenWidth + x] and '#' or ' '),
    print ''

答案 1 :(得分:1)

  • 如果这是用于绘制(科学)数据,我会使用numpy和matplotlib,结合在scipy包中。可以在SciPy页面及其3D plotting examples
  • 上找到更多信息

为什么:提供简单的数学和绘图功能,类似于matlab。

为什么,因为它不需要您采用额外的框架,而且您可以重用已有的C风格OpenGL的大部分知识。

答案 2 :(得分:0)

好的,我意识到你正在给出一个自定义示例,但我觉得也许学习图形概念可以帮助您轻松地从一种语言翻译成另一种语言。

很简单,从http://pyopengl.sourceforge.net/开始。

OpenGL是一个标准化的图形函数库。它适用于许多游戏,渲染工具包,手机等。它很简单,功能强大,并且已经被移植到几乎所有流行的语言中。

如果您想学习图形工具包 - OpenGL是一个很好的起点。很有用的例子可以很容易地在C和Python或Java或其他任何你喜欢的东西之间移植,并且网上有无数的例子来自喜欢使用它并在其中编码的人。

最好的教程之一是NeHe教程 - 从简单的盒子到烟雾引擎的数十个教程以及更多的OpenGL教程。对于每个示例,它们都包含可下载的项目或用于数十种语言的教程代码 - 包括C和Python,因此这应该是您开始学习的好地方。这是我学习OpenGL的地方,并且可以强烈推荐它。这不仅仅是代码,它也是图形背后的理论和数学!