在给定区域的情况下找到直角三角形的边界

时间:2016-02-29 11:22:02

标签: c# geometry binary-search

我试图找到点p1, p2,因为虚线(黄色)沿红色箭头的方向移动。点p1, p2, p3, p4将绑定用户输入区A。我想要的是"第一个"当黄线从右向左扫过时,出现给定区域。

已知点p3, p4Aangle

我最初尝试过像(psudeocode)这样的东西:

from right to left of the triangle:
    Move p1 to the left on the x-axis by epsilon
    Calculate p2 and the area bounded by (p1,p2,p3,p4)
    if(area < error): return the result
    else: continue

然而,这个解决方案可能不会收敛,因为epsilon值可能会跳过&#34;跳跃&#34;过度。 (例如,如果我试图通过每次将数字0增加0.3来找到数字4,它将永远不会达到4)。

因此,我尝试了二分搜索方法,但失败了,因为我意识到有界区域不是单调增加的(例如,由绿线限定的区域和三角形的最左端也是可能的解决方案二进制搜索返回)。

我的问题是有一种算法可以解决这类问题吗?并且保证收敛?

enter image description here

1 个答案:

答案 0 :(得分:0)

让我们的三角形(p3-p4)的右边缘长度为R

p1-p3距离为x。然后是梯形区域

A = 1/2 * x * (R + R - x * ctg(angle))
2*A = 2*x*R - x^2*ctg(angle)
x^2 * ctg(angle) - 2 * x * R + 2 * A = 0

求解未知x的二次方程,找出是否存在正确的根(范围0..R*tg(angle)