小编Tho*_*s O的帖子

寻找快速多边形渲染算法

我正在使用Microchip dsPIC33FJ128GP802.它是一个基于DSP的小型微控制器,它没有太多的功率(每秒4000万条指令).我正在寻找一种渲染凸(即简单)多边形的方法.我只处理2D形状,整数数学,以及设置或清除像素(即每像素1位).我已经有用于绘制快速水平和垂直线的例程(在88个周期内写入多达16个像素),所以我想使用扫描线算法.

但是,我发现的所有算法似乎都依赖于除法(在这个处理器上需要18个周期)和浮点数学(在软件中模拟,因此非常慢;它也占用了大量的ROM),或者假设我有大量的记忆.我只剩下2K,~14K用于我16K的图形RAM.那么有没有人知道任何好的嵌入式机器算法他们可以用简单的C或伪代码实现指向我,我可以在汇编中实现它?最好是在网上,我不住在附近有很多编程书籍的好书店附近.

谢谢.:)

编辑:澄清,这是我正在寻找的多边形填充算法.我可以使用Bresenham的线条绘制算法实现多边形轮廓算法(正如Marc B建议的那样).

编辑#2:我想让每个人都知道我在Python中得到了一个基本的算法.这是代码的链接.公共域代码.

http://dl.dropbox.com/u/1134084/bresenham_demos.py

embedded graphics assembly polygon

8
推荐指数
1
解决办法
5609
查看次数

Delphi中网络驱动器上的可用磁盘空间

我正在制作一个A2计算程序,它可以输出大量数据.我在本地网络上的硬盘分配大约是50 MB,因此它是测试"无磁盘空间"错误的好选择.

目前,当程序空间不足时,它会在I/O错误112的情况下崩溃.如果文件可能超出可用空间,我想提前警告.我知道文件有多大(平均每条记录24.8字节),所以我需要做的就是找出多少空间是免费的.

当我在网络驱动器上工作时,如果有文件路径\\qmcsan1\Cxxxxx$\filename.csv,我该如何使用函数DiskFree来计算可用空间?任何这样的功能也需要处理本地驱动器C:/.

任何想法都非常感激.

delphi diskspace

8
推荐指数
1
解决办法
4845
查看次数

有人可以解释在存储散列密码时盐的帮助吗?

我很难理解当密码数据库或其他重要信息被泄露时,附加到散列的salt如何帮助提高安全性.

如果盐是,例如,"你好",并附加到密码"密码",那么盐和密码一起存储,"hellopassword"并散列产生:

94e66f94517d606d5ad6d9191b980408952f2ed2 (sha1) 
Run Code Online (Sandbox Code Playgroud)

然后附上盐:

hello$94e66f94517d606d5ad6d9191b980408952f2ed2
Run Code Online (Sandbox Code Playgroud)

这怎么更安全?攻击者知道盐,所以现在可以用很少的额外难度计算密码......对吧?还是我从根本上误解了什么?

hash sha1 salt

7
推荐指数
2
解决办法
827
查看次数

重新排列点列表以达到它们之间的最短距离

我有一个2D点列表,例如:

1,1 2,2 1,3 4,5 2,1
Run Code Online (Sandbox Code Playgroud)

这些点之间的距离是已知的(例如,使用math.hypot.)我想对列表进行排序,以便它们之间有最小距离.我可以使用任何可能的解决方案订单,只要这些点是最短的顺序.

实现这一目标的最pythonic方法是什么?

我正在考虑计算任何项目和任何其他项目之间的距离,并且每次都选择最小的项目,但这对我正在处理的列表来说是一个缓慢的算法(1,000项并不罕见.)

python sorting algorithm list

7
推荐指数
1
解决办法
3223
查看次数

数字溢出时如何进行hypot2(x,y)计算

我想在16位处理器上进行hypot2计算.

标准配方是c = sqrt((a * a) + (b * b)).这个问题是它输出的大量输入.例如200和250,乘以200*200得到90,000,高于最大有符号值32,767,所以它溢出,如b,数字被加上,结果也可能没用; 由于负的sqrt,它甚至可能发出错误信号.

在我的情况下,我正在处理32位数字,但我的处理器上的32位乘法非常快,大约4个周期.我正在使用dsPIC微控制器.我宁愿不必使用64位数字,因为这会浪费宝贵的内存,毫无疑问会更慢.另外,我只有32位数的sqrt,所以64位数字需要另一个函数.那么当值可能很大时,我如何计算一个hypot?

请注意我只能使用整数数学.使用像浮点数学这样的东西会引起速度,我宁愿避免.我的处理器有一个快速整数/固定点atan2例程,大约130个周期; 我可以用它来计算斜边长度吗?

math

6
推荐指数
1
解决办法
547
查看次数

在我的超采样模拟中导致负偏差的原因是什么?

我正在开发一个小测试程序,看看是否可以向ADC添加噪声以获得过采样位.在我们开始之前,有点理论.奈奎斯特的采样定理表明,一位分辨率的增加需要四个额外的样本,并且通常,n个以上的位需要2 ^(n + 1)个样本.我正在模拟一个完美的10位ADC,它从0..1023单调返回一个值,对于0-2V的输入没有噪声.

为了获得更多的位,就必须添加随机分布的噪声(它并没有确实是随机的,但它确实有出现随机的,像白噪声).我遇到的问题是虽然分辨率在不断增加,实际读数被一些小的负数抵消.这是输入1伏的一个示例输出(参考电压为2伏,因此对于单调ADC,计数应该恰好是一半):

10 bits:  512         volts:  1.0
11 bits:  1024        volts:  1.0
12 bits:  2046        volts:  0.9990234375
13 bits:  4093        volts:  0.999267578125
14 bits:  8189        volts:  0.999633789062
15 bits:  16375       volts:  0.999450683594
16 bits:  32753       volts:  0.999542236328
17 bits:  65509       volts:  0.999588012695
18 bits:  131013      volts:  0.999549865723
24 bits:  8384565     volts:  0.999518036842
28 bits:  134152551   volts:  0.999514393508
Run Code Online (Sandbox Code Playgroud)

事实上,无论我运行模拟多少次,我总是以〜0.9995左右结束,而不是1; 并且最后一个值应该是134,217,728,而不是134,152,551,大约是65,771 - 或大约是额外18位分辨率的1/4(巧合?我潜水4.)我怀疑我的PRNG在某种程度上有偏见,但是我正在使用Python附带的默认Mersenne Twister.

#!/usr/bin/python
# 
#  Demonstrates how oversampling/supersampling with noise can be used
#  to …
Run Code Online (Sandbox Code Playgroud)

python algorithm statistics

6
推荐指数
1
解决办法
351
查看次数

calloc():各个值对性能有影响吗?

我目前正在C中编写嵌入式应用程序,其中性能至关重要.

目前,我正在分配大量的空内存,如下所示:calloc(1, num_bytes)- 但是,我只是计算num_bytes了许多项目的产品和代码中较早的每个项目的大小,因为它是以前调用的代码malloc.

calloc看起来很独特,因为它是-alloc系列的唯一内存分配函数,它为大小提供了两个参数.有这么好的理由吗?是否存在对指定不同参数的性能影响?选择这种参数布局的理由是什么?

c memory malloc calloc

5
推荐指数
1
解决办法
339
查看次数

将浮点数与零进行比较

我想检查一个IEEE754 32位数字是否具有正好0.0f的值(它偶尔会被设置为它.)累积误差将为零,因为数据将经常从传感器更新.我的处理器没有硬件FPU,因此操作在相当快的软件库中完成.但是,对于诸如加,减和比较之类的事情,它仍然有数百个周期.

所以我想知道为什么我的编译器这样做:

240:                 if(p_viewer->roll != 0.0f)
 03FBC  B81160     mul.uu w2,#0,w2
 03FBE  900A2E     mov.w [w14+20],w4
 03FC0  900064     mov.w [w4+12],w0
 03FC2  9000F4     mov.w [w4+14],w1
 03FC4  07E91F     rcall __nesf2
 03FC6  E00000     cp0.w w0
 03FC8  320054     bra z, 0x004072
Run Code Online (Sandbox Code Playgroud)

__nesf2显然比较了两个浮点数.为什么不对整数形式的0.0f进行比较,即0x00000000?有什么理由不这样做,还是只是错过了优化机会?

我的编译器是MPLAB C30,GCC v3.23的一个版本.

c floating-point

4
推荐指数
1
解决办法
2486
查看次数

在C中跨文件共享变量

我有两个文件:

hudwidgets.c

#include "osd.h"
#include "osdadd.h"
#include <stdio.h>

struct TextSize tsize;
char buff[50];

void hud_draw_lin_compass(int cx, int cy, int tick_maj, int tick_min, int range, int heading)
{
    .. important code that uses buff ..
}
Run Code Online (Sandbox Code Playgroud)

hud.c

#include "hudwidgets.h"
#include "hud.h"
#include "osd.h"
#include "osdadd.h"

.. some code ..

void hud_rc_plane_single_frame()
{
    fill_mem(0x0000);
    if((frame / 50) % 2 == 0)
    {
        get_next_warning(buff);
    }
    .. some more code ..
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当我尝试编译它时,编译器抱怨没有buff定义,但是当我尝试定义它时,链接器会抱怨两个buff变量.第二十二条军规.为此,我问了两个问题:

  1. 如何解决这个问题;

  2. 如果可以使用相同的变量从而节省内存,因为只需要分配一个变量(使用内存受限的微控制器).

c

3
推荐指数
1
解决办法
1203
查看次数

如何旋转单词中的位

我正在使用dsPIC33F和GCC.我想向左或向右旋转一个单词中的位,如下所示:

       MSB             LSB
input: 0101 1101 0101 1101
right: 1010 1110 1010 1110
left : 1011 1010 1011 1010
Run Code Online (Sandbox Code Playgroud)

(如果不清楚,LSB进入MSB的右侧旋转位置,反之亦然.)

我的处理器已经有一个旋转的权利(rrnc,RRC),并向左旋转指令(rlnc,RLC),所以我希望编译器将在优化这一点.如果没有,我可能要使用内联汇编.

bit-manipulation pic dspic

2
推荐指数
1
解决办法
3341
查看次数