GDI 中的数值精度限制?

Numerical accuracy limitation in GDI?

提问人: 提问时间:11/7/2015 更新时间:11/10/2015 访问量:183

问:

我正在使用 Windows GDI 函数 Arc 绘制圆弧。它采用圆的边界框和两个分隔起始角和结束角(而不是角度本身)的点作为参数。

当我传递如下参数时,我得到一个异常的结果。我得到的输出不是大半径的圆的准平弧(大约13069,边界框是正方形),而是如图所示(旋转;第二个版本显示了两个端点的位置;第三个是预期的输出)。

Arc(hDC, -25660, -12837, 477, 13300, 475, 462, 476, 66);

enter image description here

我怀疑异常是由于弧的半径/平坦度大,尽管坐标不是那么大。你有什么解释吗?我主要关心的是找到出现这些明显特征的条件,以便解决它们。


下面是产生问题的简单控制台应用程序:

#include <Windows.h>

int main(int argc, char* argv[])
{
    HDC hDC= GetDC(GetForegroundWindow());
    SelectObject(hDC, GetStockObject(WHITE_PEN));

    // Right
    Arc(hDC, -16, 37, 457, 510, 475, 462, 476, 66);

    // Wrong
    Arc(hDC, -25660, -12837, 477, 13300, 475, 462, 476, 66);

    return 0;
}
Windows GDI 精度

评论

0赞 Simon Mourier 11/10/2015
您确定没有定义转换吗?msdn.microsoft.com/en-us/library/dd183475(v=vs.85).aspx否则你有复制代码吗?
0赞 11/10/2015
@SimonMourier:是的,很确定。其他圆弧绘制正确。我添加了示例代码。
0赞 Simon Mourier 11/10/2015
使用地图模式(wvware.sourceforge.net/caolan/mapmode.html)应该可以解决问题 - 我很难用你巨大的坐标进行测试:-)。默认值为MM_TEXT,它使用像素作为单位。我建议您使用 LO 或 HI mm (msdn.microsoft.com/en-us/library/dd162980.aspx 之一)
0赞 11/10/2015
@SimonMourier:对不起,我不相信这会有所帮助。最后,GDI 将所有内容转回像素坐标,这将返回到相同的像素值(在来回转换过程中可能会损失准确性)。我知道我的值很大,这可能会导致内部溢出。无论如何,我在某处读到支持至少 24 位的范围(而我低于 15 位)。
0赞 Simon Mourier 11/10/2015
您是否尝试过添加SetMapMode(MM_LOENGLISH),例如在GetDC之后(并且可能更改了坐标)?

答: 暂无答案