首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >二维C++、点和线位置对四舍五入误差和位置的鲁棒性

二维C++、点和线位置对四舍五入误差和位置的鲁棒性
EN

Stack Overflow用户
提问于 2011-06-05 21:54:11
回答 2查看 554关注 0票数 0

一行由两个端点P1x1、y1、P2x2、y2定义。设Q,yq是一个测试点。两个坐标都是双倍的。

差异:

代码语言:javascript
运行
复制
dx1 = x2 - x1
dy1 = y2 - y1
dx2 = xq - x1
dy2 = yq - y1

规范

代码语言:javascript
运行
复制
double n1_sq = sqrt(dx1 * dx1 + dy1 * dy1);
double n2_sq = sqrt(dx2 * dx2 + dy2 * dy2);

我的假设是:用归一化向量进行测试对舍入误差不太敏感。

代码语言:javascript
运行
复制
double test = (dx1 / n1_sq  )  * (dy2 / n2_sq) - ( dx2 / n2_sq ) * ( dy1 / n1_sq );

代码语言:javascript
运行
复制
double test = dx1 * dy2 - dx2 * dy1;

在下列情况下出现了问题:

( A)测试点是Q在线上

代码语言:javascript
运行
复制
Q = [0.5(x1 + x2), 0.5(y1 + y2)]

在许多情况下,结果不是零,而是

代码语言:javascript
运行
复制
test >> 0

( B)线路/测试点配置不当

案例1)长段:

让我们将测试点移到起始点,dist (Q,νp1,p2 x)= 7e-4。

代码语言:javascript
运行
复制
P1 = [0, 0]
P2 = [1000000000.00001, 1000000000.00001]
Q = [0.0,0.001] 

标准化测试: 0.7未归一化测试: 1.0e+6

案例2)长段:

让我们将被测试点移动到端点dist (Q,x-p1,p2 x)= 7e-4。

代码语言:javascript
运行
复制
P1 = [0, 0]
P2 = [1000000000.00001, 1000000000.00001]
Q = [1000000000.0, 1000000000.001] 

标准化测试: 5.0e-13未标准化测试T: 1.1 e+6

案例3)短段:

让我们将测试点移到起始点,dist (Q,νp1,p2 x)= 7e-4。

代码语言:javascript
运行
复制
P1 = [0, 0]
P2 = [0.00001, 0.00001]
Q = [0.0,0.001] 

标准化试验: 0.7未归一化试验: 1.0e-8

结果:

( A)长节段的归一化试验不可靠。案例2可以被认为是机械零,有以下的决定:Q在p1,p2\x.

( B)对于短段,情况发生了逆转,一次不归一化的测试给出了一台机器零。

但是,这两个测试的结果都不是常数,并且得到的值不会带来任何关于点q与线p1,p2的实际距离的信息。在两个测试中使用阈值并不能带来正确的结果.而阈值的值在此之前无法确定。

我该怎么办?

我的解决方案是用新的测试代替这两个测试:测试点Q与线P1、p2的距离,并使用一些阈值eps。Q点

代码语言:javascript
运行
复制
dist (Q,|P1,P2|) < eps,  (for example 1e-10) 

将被放置在P1,P2.测试结果不取决于点的配置(即,如果我们沿着分段P1,P2移动测试点q)。

是否有人使用更好的测试或对此问题有不同的解决方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-05 22:04:49

我不明白你的测试。它似乎一点也不涉及q的坐标。另外,对于两个值uv,范数的最小舍入为M * sqrt(1 + m / M),其中M = max(|u|, |v|)m = min(|u|, |v|)。对于dist函数,这是最好的方法,尽管您可能希望将阈值作为线段长度的函数。这取决于您的应用程序。

票数 0
EN

Stack Overflow用户

发布于 2011-06-05 22:18:39

您正在使用楔形积(在2d中是一个行列式)来确定您的距离。我想问题是,你可能会减去类似的数量,这样你的结果就会被截断误差所克服。试着用点积代替。D=d1.d2/区d1_1_(1)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6246117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档