C ++,2D中的点和线位置对圆角误差和位置具有鲁棒性

时间:2011-06-05 21:54:11

标签: c++ algorithm position rounding

线由两个端点P1 [x1,y1],P2 [x2,y2]定义。设Q [xq,yq]为测试点。两个坐标都是双倍的。

Differencies:

dx1 = x2 - x1
dy1 = y2 - y1
dx2 = xq - x1
dy2 = yq - y1

规范

double n1_sq = sqrt(dx1 * dx1 + dy1 * dy1);
double n2_sq = sqrt(dx2 * dx2 + dy2 * dy2);

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

double test = (dx1 / n1_sq  )  * (dy2 / n2_sq) - ( dx2 / n2_sq ) * ( dy1 / n1_sq );

大于

double test = dx1 * dy2 - dx2 * dy1;

在以下情况下出现问题:

A)测试点是Q在线

Q = [0.5(x1 + x2), 0.5(y1 + y2)]

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

test >> 0

B)线/测试点的配置不当

案例1)长段:

让我们将测试点移动到起点,dist(Q,| p1,p2 |)= 7e-4

P1 = [0, 0]
P2 = [1000000000.00001, 1000000000.00001]
Q = [0.0,0.001] 

标准化测试:0.7 非标准化测试:1.0e + 6

案例2)长段:

让我们将测试点移动到终点dist(Q,| p1,p2 |)= 7e-4

P1 = [0, 0]
P2 = [1000000000.00001, 1000000000.00001]
Q = [1000000000.0, 1000000000.001] 

标准化测试:5.0e-13 非标准化的testt:1.1 e + 6

案例3)短段:

让我们将测试点移动到起点,dist(Q,| p1,p2 |)= 7e-4

P1 = [0, 0]
P2 = [0.00001, 0.00001]
Q = [0.0,0.001] 

标准化测试:0.7 非标准化测试:1.0e-8

结果:

A)长段的标准化测试不太可靠。案例2可以被视为机器零,具有以下决定:Q在| p1,p2 | ...

B)对于短段,情况相反,非标准化测试给机械零点。

但是两个测试的结果都不是恒定的,并且结果值不会从点| p1,p2 |带来关于点Q的实际距离的任何信息。在两个测试中使用阈值都不会带来正确的结果......并且在之前无法确定阈值。

我该怎么办?

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

dist (Q,|P1,P2|) < eps,  (for example 1e-10) 

将被放置在P1,P2行...测试结果不依赖于点的配置(即如果我们沿着段P1,P2移动测试点Q)

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

2 个答案:

答案 0 :(得分:0)

我不明白你的考试。它似乎根本不涉及Q的坐标。此外,对于两个值uv,规范的最小舍入为M * sqrt(1 + m / M),其中M = max(|u|, |v|)m = min(|u|, |v|)。至于dist函数,这是最好的方法,尽管您可能希望使阈值成为线段长度的函数。这实际上取决于你的申请。

答案 1 :(得分:0)

您正在使用楔形产品(在2d中是决定因素)来找到您的距离。我想问题是你可能会减去相似的数量,以便通过截断错误克服你的结果。请尝试使用点积。 d = d1.d2 / | d1 |。