如何高效地在屏幕上精确绘制N个点?

2024-05-12

这听起来是一个简单的问题,但我发现要获得良好的性能是非常棘手的。

我提出的第一个算法是随机绘制点,从一组中检查是否已绘制,否则绘制。如果我们只绘制几个点,那么这种方法效果很好,但当我们接近填满屏幕时,速度会灾难性地减慢。

我想出的最好的方法是构建像素列表,对其进行洗牌并选择第一个 n (我为此使用了 python 的 random.sample )。它效果更好,但仍然有点慢,因为整个像素列表需要在内存中构建,这在绘制 5 个点时是非常过大的。这是我的Python代码:

#!/usr/bin/env python
""" drawn n random points on the screen """
import pygame
from pygame.locals import *
import sys
import random
from itertools import product

n = int(sys.argv[1])
s = pygame.display.set_mode()
sx, sy = s.get_size()

points = random.sample(list(product(range(sx), range(sy))), n)

for p in points:
    s.fill((255, 255, 255), pygame.Rect(*p, 1, 1))
pygame.display.flip()
while True:
    for event in pygame.event.get():
        if event.type == QUIT or event.type == KEYDOWN:
            sys.exit()

对于更好的算法有什么建议吗?

Edit:刚刚发现这个问题叫“油藏采样”。维基百科有很多很好的算法:https://en.wikipedia.org/wiki/Reservoir_sampling https://en.wikipedia.org/wiki/Reservoir_sampling


来自惰性序列的样本:

points = [(i // sy, i % sy) for i in random.sample(xrange(sx*sy), n)]

random.sample将根据序列和样本的相对大小选择是否具体化序列并执行部分洗牌或选择随机元素并跟踪选定的索引。

请注意,它必须是实际的sequence,而不是迭代器,才能使其工作。与普遍看法相反,xrange(或Python 3range) 是一个实际的序列。发电机在这里不起作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何高效地在屏幕上精确绘制N个点? 的相关文章

随机推荐

  • 是否可以在不使用 if 语句的情况下找出哪个数字更大?

    我正在为初学者编程课程编写一些小程序 在我的程序中我有 2 个保存数字的变量 无论如何 我需要找出哪个数字更大并根据它打印适当的消息 例如我有 int x 5 int y 10 我需要打印 y 确实比 x 大 现在的问题是 我知道我可以使用
  • 在 MSHTML IE8 中修改 DOM 时是否会触发一个事件?

    尝试检测 MSHTML 中的 DOM 中是否添加或删除了新元素 有这样的事件会火吗 http msdn microsoft com en us library aa741877 v VS 85 aspx http msdn microsof
  • 如何使用 Amazon 的 EMR 在 CLI 中使用自定义 jar 指定 mapred 配置和 java 选项?

    我想知道如何指定mapreduce配置 例如mapred task timeout mapred min split size等等 当使用自定义 jar 运行流作业时 当我们使用 ruby 或 python 等外部脚本语言运行时 我们可以使
  • iFrame 中的 Javascript iPhone 滚动效果 / Javascript 鼠标加速

    我正在尝试使用 JavaScript 在窗口中重新创建 iPhone 轻拂 滚动事件 从 JQuery 开始 我使用计时器测量单击 拖动 释放事件期间鼠标的加速度和偏移量 var MouseY init function context v
  • 时间戳相减必须具有相同的时区或没有时区,但它们都是 UTC

    有一些问题解决了相同的错误TypeError Timestamp subtraction must have the same timezones or no timezones但没有一个面临与此相同的问题 我有 2 个 UTC 时间戳 在
  • Android 联系人提取

    是否有可能使用标准 Android API 提取以下某些格式 vCard hCard 或 json xml 的联系人 ContentResolver cr getContentResolver Cursor cur cr query Con
  • 包含带有 android 风味的库

    我之前的应用程序 gradle 文件 compile project path zblelib 但是当我将口味添加到库中时 我的导入不起作用 我的口味 flavorDimensions dim productFlavors nocustom
  • RestKit链接器错误

    我一直遵循 RestKit 安装说明 但现在在尝试构建应用程序时出现错误 这是针对 ios iPad 的 我收到 命令 Developer Platforms iPhoneSimulator platform Developer usr b
  • 使用 ggplot 未完全填充等值线图

    我正在尝试使用以下方法绘制我的第一个填充等高线图ggplot 根据我的数据 我期待类似的结果 但我的结果是 a lt c 1 1 1 1 1 3 1 2 2 2 2 2 2 5 2 1 3 3 3 3 1 3 2 b lt c rep c
  • 在 PHP 中验证约 400MB 的大型 XML 文件

    我有一个很大的 XML 文件 大约 400MB 在开始处理之前我需要确保它的格式正确 我尝试的第一件事是类似于下面的内容 这很棒 因为我可以找出 XML 是否格式不正确以及 XML 的哪些部分 不好 doc simplexml load s
  • WebView 不运行 loadHTMLString 中给出的 JavaScript

    我不明白为什么这不起作用 我的桌面上有一个 test htm 文件 如下所示 This is x 2 我有一个 WebVie
  • 如何追踪手柄泄漏?

    在我的一个应用程序中 我观察到句柄数量不断增加 在不使用应用程序的情况下 该数字大约每秒增加一次 因此后台处理代码的某些部分一定存在句柄泄漏 我如何追踪此类泄漏 有什么工具可以帮助解决这个问题吗 跟踪句柄泄漏时要寻找哪些模式 导致手柄泄漏的
  • 获取 Postgres 数据库中每个表的行数

    获取数据库中所有表的行数的最有效方法是什么 我正在使用 Postgres 数据库 结果示例 table name row count some table 1 234 foobar 5 678 another table 32 如果您想要特
  • git分支和标签如何存储在磁盘中?

    我最近检查了我工作中的一个 git 存储库 其中有 10 000 多个分支和 30000 多个标签 新克隆后 存储库的总大小为 12Gigs 我确信没有理由拥有 10000 个分支机构 所以我相信它们会占用磁盘中相当大的空间 所以 我的问题
  • 调用 LWRP 时的 Cookbook 名称前缀

    Summary 我可以使用外部说明书中的 LWRP 而不添加说明书名称前缀吗 例如 如果mycookbook包含mylwrp资源 我该怎么做 include recipe mycookbook Contains mylwrp mylwrp
  • GetX 解绑流

    我正在使用bindStream 函数与GetX封装在控制器内 class FrediUserController extends GetxController override void onReady super onReady fina
  • SSMS 与 Sybase ASE 的连接

    有没有办法使用 Sql Server Management Studio 2008 连接到 Sybase ASE 数据库实例 我尝试使用其他工具进行连接 但它们非常有限 我想使用 SSMS 您可以使用这个工具 SqlDbx http www
  • 如何使用 Google Sheets onEdit() 触发器运行函数来更新 Google Form

    我有一个 Google 表格工作簿 其中有一个工作表 我想用它来保存工作簿和 Google 表单的设置 我做了一个定制onEdit 触发两个函数的函数 一个用于更新工作簿 另一个用于更新表单 function onEdit e var ra
  • jqgrid editoptions:必需的不起作用

    好吧 不确定我在这里做错了什么 list jqGrid url URL datatype json mtype GET colModel label Index index Index key true hidden true label
  • 如何高效地在屏幕上精确绘制N个点?

    这听起来是一个简单的问题 但我发现要获得良好的性能是非常棘手的 我提出的第一个算法是随机绘制点 从一组中检查是否已绘制 否则绘制 如果我们只绘制几个点 那么这种方法效果很好 但当我们接近填满屏幕时 速度会灾难性地减慢 我想出的最好的方法是构