将点限制为圆周上的弧
Restricting a point to an arc on a circle's circumference
这个问题有点具体。为简单起见,假设我有一个单位圆,即以原点 (0,0) 为中心、半径为 1 的圆。在这个圆上我有三个点:A、B 和 C。假设 B 和 C 是固定的,并且A可以沿着圆的圆周移动。
问题:我可以有效地检查什么条件来确保A不被移动到B和C之间原来包含它的圆弧之外?
澄清一点:我不只是想检测点是否在这条弧上(即,得到一个布尔值),而是要有一个可量化的度量(例如,距离)所以我可以防止它被移到外面。你可以想象我的设置是这样的,将 A 点限制在红色圆弧内:
以下是我目前考虑过的一些想法,但 none 成功了:
- 将 A = [cos(alpha),sin(alpha)] 的角度 alpha 限制为 B=[cos(beta),sin(beta)] 和 C=[ 的角度 beta 和 gamma 之间的原点cos(gamma),sin(gamma)],其中 alpha、beta 和 gamma 是以弧度为单位的角度。不幸的是,这种天真的案例只适用于上面的场景 (a)。如果 A 被限制到的弧线从 +pi/-pi 穿过(在我的例子中是西方的)不连续点,一个朴素的上限和下限是行不通的。
- 计算 A 到 B 和 A 到 C 之间的弧长,然后确保随着 A 的移动,这个总和不会改变。不幸的是,我只找到 this solution 来计算两点之间的弧,而且它总是计算较短的弧。然而,在场景 (c) 中,正确的弧线 A 到 B 是较大的弧线。
给定圆上的任意两个点,在您的例子中 B
和 C
,当然有两条可能的弧。我们在两个选项之间使用 A
到 select。你说你想阻止一个点,比如 D
,移动到这个弧线之外。我将其解释为我们想要一个函数,如果 D
位于 BC
和 A
、returns D
定义的弧上,否则它 returns B
或 C
,取决于哪个更接近 D
。
我们可以定义如下函数来实现这个方案:
def contstrainPoint(A, B, C, D)
M = midpoint(B, C)
If dot(MA, MD) >= 0
return D
else if(dot(MB, MD) >= 0
return B
else
return C
其中M
是和弦的中点BC
,dot
是点积函数。
取叉积(A-B)x(A-C)。这将有一个非零分量,垂直于平面。该分量将平滑变化,当 A 在一个弧上时为正,在另一弧上时为负,当它穿过 B 或 C.
这个问题有点具体。为简单起见,假设我有一个单位圆,即以原点 (0,0) 为中心、半径为 1 的圆。在这个圆上我有三个点:A、B 和 C。假设 B 和 C 是固定的,并且A可以沿着圆的圆周移动。
问题:我可以有效地检查什么条件来确保A不被移动到B和C之间原来包含它的圆弧之外?
澄清一点:我不只是想检测点是否在这条弧上(即,得到一个布尔值),而是要有一个可量化的度量(例如,距离)所以我可以防止它被移到外面。你可以想象我的设置是这样的,将 A 点限制在红色圆弧内:
以下是我目前考虑过的一些想法,但 none 成功了:
- 将 A = [cos(alpha),sin(alpha)] 的角度 alpha 限制为 B=[cos(beta),sin(beta)] 和 C=[ 的角度 beta 和 gamma 之间的原点cos(gamma),sin(gamma)],其中 alpha、beta 和 gamma 是以弧度为单位的角度。不幸的是,这种天真的案例只适用于上面的场景 (a)。如果 A 被限制到的弧线从 +pi/-pi 穿过(在我的例子中是西方的)不连续点,一个朴素的上限和下限是行不通的。
- 计算 A 到 B 和 A 到 C 之间的弧长,然后确保随着 A 的移动,这个总和不会改变。不幸的是,我只找到 this solution 来计算两点之间的弧,而且它总是计算较短的弧。然而,在场景 (c) 中,正确的弧线 A 到 B 是较大的弧线。
给定圆上的任意两个点,在您的例子中 B
和 C
,当然有两条可能的弧。我们在两个选项之间使用 A
到 select。你说你想阻止一个点,比如 D
,移动到这个弧线之外。我将其解释为我们想要一个函数,如果 D
位于 BC
和 A
、returns D
定义的弧上,否则它 returns B
或 C
,取决于哪个更接近 D
。
我们可以定义如下函数来实现这个方案:
def contstrainPoint(A, B, C, D)
M = midpoint(B, C)
If dot(MA, MD) >= 0
return D
else if(dot(MB, MD) >= 0
return B
else
return C
其中M
是和弦的中点BC
,dot
是点积函数。
取叉积(A-B)x(A-C)。这将有一个非零分量,垂直于平面。该分量将平滑变化,当 A 在一个弧上时为正,在另一弧上时为负,当它穿过 B 或 C.