【问题标题】:How to calculate the physical area of a polygon in iOS?如何在 iOS 中计算多边形的物理面积?
【发布时间】:2016-07-20 18:29:46
【问题描述】:

作为我正在开发的应用程序的一部分,我试图确定用户在屏幕上绘制的多边形的物理区域。

我正在使用此处详述的方法以点为单位计算多边形的面积:

http://www.mathopenref.com/coordpolygonarea.html

但是,我对如何从以点为单位的区域到物理区域(例如平方英寸)有点卡住了。我相信我正在测试的设备(iPad Pro,9.7")的 DPI 是 264。得到以英寸为单位的面积的公式真的像 pointsArea / (dpi * dpi) 一样简单吗?这似乎不会产生大幅度正确的结果,而不只是将几个幻数混在一起。

我用来计算点面积的代码如下:

- (double)calculatePointsArea {
    double localPointsArea = 0;
    for (int x = 0; x < points.count; x++) {
        if (x + 1 < points.count) {
            localPointsArea += (points[x].imagePoint.x * points[x + 1].imagePoint.y) - (points[x].imagePoint.y * points[x + 1].imagePoint.x);
        }
        else {
            localPointsArea += (points[x].imagePoint.x * points[0].imagePoint.y) - (points[x].imagePoint.y * points[0].imagePoint.x);
        }
    }
    localPointsArea = localPointsArea / 2;
    return fabs(localPointsArea);
}

我用来玩面积计算的代码如下:

pointsArea = [self calculatePointsArea];
long dpi = [TSTDPIManager deviceDPI]; //this is a class to manage the dpi values for various devices. Right now it is set to return 264 for my device, which I believe is correct.

double physicalAreaUsingPoints = ((pointsArea) / (dpi * dpi));
physicalAreaUsingPoints = physicalAreaUsingPoints * (7.2); 7.2 is completely arbitrary, but seems to yield the correct result on my device and the simulator.

任意幻数向我发送了一个非常强烈的信号,表明我在某处计算错误,但我很难弄清楚它是什么。如果事情非常明显,请提前道歉。我已经在谷歌上搜索和戳了几天,我觉得我在这方面没有取得很大进展。

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    很难猜,但我假设你调试了calculatePointsArea?我怀疑你是在点而不是像素上操作。使用[UIScreen scale] 获取 iPad Pro Retina 屏幕的比例因子。

    除此之外,我调试算法的典型方法是使用大量临时变量,然后到处打印出来。然后我提供非常简单的测试数据,并确保算法的所有步骤都能产生预期的结果。所以制作(1,1)--(10,1)--(10,10)--(1,10) 矩形并确保你得到81 作为大小。

    【讨论】:

    • 我已经用几个测试集验证了 calculatePointsArea。我插入了你建议的内容,它确实返回 81 作为大小。你的说法是正确的,我正在使用点而不是像素,我相信我的问题是在试图从点到物理大小时发生。我玩过使用量表,但仍然没有得到预期的结果。您是否建议正确的公式是 (pointsArea * scale) / (dpi^2)?
    • 给自己画一个 3x3 的矩形,并尝试将其缩放 2 倍。想象一下,你操作的是点,你想得到像素。 scale 从点缩放到像素。 示例:3px3p 点矩形 (9p^2) 缩放 x 2 将是 6x6 (36p^2),而不是 3x6 (p^2) 您应该能够从中计算出公式。跨度>
    • 再次感谢。我很感激帮助。我不知道我是怎么忽略那个的。我目前正在使用公式 (pointsArea * scale^2)/(dpi^2),这似乎产生了更一致的结果。我得到的结果似乎始终不足 75-77%。这似乎与纵横比一致,乘以 1.75-1.77 似乎会产生始终如一的准确结果。这对你有意义吗?
    • 这很难说,因为你没有提供任何数据。正如我所说,选择简单的测试数据集(假设 4 个数字;每个 3-4 点)。记下来。运行算法。为localPointsArea 使用临时变量。打印出来并写下来。看看缩放后的结果如何。并在这里公布数字。或者用代码在 GitHub 上做一个 Gist 并传递一个链接。为了提供帮助,我必须能够运行你在我脑海中的想法,但是你呈现它的方式,我做不到——我没有足够的数据。
    • 我在写这篇文章时注意到的一件有趣的事情是,以点为单位的宽度和高度似乎与以英寸为单位的宽度和高度相关联了 100 倍。这导致以点为单位的面积^2近似于该区域的 10,000 倍。 14.76 英寸^2 与我在袖带上测量的值相差约 5%,我认为这是对该区域的准确估计。我从公式中得到的 8.45179 结果比这个值低了约 77%,这是我在多个数据集上一直看到的结果。你知道是什么导致了这种赤字吗? 1/100 系数是巧合吗?
    猜你喜欢
    • 2013-11-13
    • 2012-04-07
    • 2020-01-09
    • 2013-10-24
    • 2010-10-01
    • 2019-02-22
    • 2020-01-24
    • 2013-09-07
    相关资源
    最近更新 更多