【问题标题】:The following code in python (and why) [closed]python中的以下代码(以及为什么)[关闭]
【发布时间】:2009-12-14 15:21:12
【问题描述】:

我正在学习 python,因为它看起来很漂亮,而且我知道一点 ruby​​ 和 perl。

以下是在屏幕上绘制 3d 点的 C 程序。我以此为例,因为它使用数组、结构和函数调用。我遗漏了课程,因为我相信这种(OOP)的东西在所有语言中都被同时使用(如果我错了,请纠正我)。了解我确实知道如何在 python 中编写以下内容(在 google 的帮助下),但我想知道您将使用哪种方法以及为什么。

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

#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;
}

【问题讨论】:

  • 我发现您的问题令人困惑(看到我的回答中的 cmets),您想知道其他人将如何在 python 中实现此特定代码,或者其他人会考虑什么样的包/框架练习?
  • 我想看看将使用的数据类型和循环样式等。

标签: python c


【解决方案1】:

这是一个直接端口,由于打印的东西结合了 x-if-a-else-y,所以只能在 python3 中工作

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 ''

【讨论】:

  • 三元语法在 Python 2.5 及更高版本中运行良好。但是 int 除以 int 在 2.x 中的表现会有所不同,因此不仅仅是 print() 语句需要为 2.x 修复:)
  • 如果我想覆盖换行符,我不能将三元语法与 print 一起使用,但我也制作了一个 python 2.x 版本。 :)
  • 在 python 3.x 之前的版本中,您可以使用 (buf[y * screenWidth + x] and '#' or ' ') 进行内联 if-then-else。
  • 也许以过于迂腐为代价:2.5 后,test and test_is_true or test_is_false 非常不鼓励。在这种情况下,它不会做任何意想不到的事情(因为 '#' 评估为 True),但首选三元语法,因为它更具可读性且不易出错。
【解决方案2】:
  • 如果这是为了绘制(科学)数据,我会使用 numpy 和 matplotlib,结合在 scipy 包中。更多信息可在SciPy 页面及其3D plotting examples 上找到。

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

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

【讨论】:

  • 我认为你没有抓住重点。该问题旨在学习python。 3D 示例只是做原始发帖人觉得有趣的事情的借口。
  • @Remo,点了,但要了解可用的第三方软件包,并了解何时认识到必须已经有合适的第三方软件包你应该寻找和使用,是“学习 Python”的重要组成部分,所以这仍然是一个有效的答案。
  • 问题是种类的方法,以及为什么。我给出了两种方法(如软件包中提供的那样),并附有简短说明。我不知道应该得到什么样的答案,但是仅仅给出这个“任意”示例代码的python翻译(我们在这里同意)并不能回答任何一个问题恕我直言。
【解决方案3】:

好的,我知道您正在给出一个自定义示例,但我觉得学习图形概念可能会帮助您轻松地将一种语言翻译成另一种语言。

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

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

如果您想学习图形工具包,OpenGL 是一个很好的起点。许多示例可以轻松地在 C 和 Python 或 Java 或其他任何你喜欢的东西之间移植,这也很有帮助,并且有无数的示例来自喜欢使用它并在其中编写代码的人。

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

【讨论】:

    猜你喜欢
    • 2021-08-27
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    相关资源
    最近更新 更多