我不认为你已经完全理解了我在关于“倾斜”角度的评论中提出的问题。所以我会给出一个一般的案例解决方案,其中你有一个明确的切向量曲线的结尾。 (您可以在此使用的倾斜角度计算;如果我们澄清你的意思是什么话,我会很乐意与一个公式编辑来计算,如果必要的切向量)
让我们画的是如何在一个图设置可以看看:
(不是100%准确)
A
和B
是你的固定点。 T
是单位切向量。 r
和C
是我们需要计算的圆弧的半径和中心。
角度θ
由BA
和T
减去π/2
弧度(90度)之间的角给出。我们可以用点积计算的话:
从AB
到C
中心的(签订)距离由下式给出:
注意,这是消极的在右边的情况下,左边是积极的。半径由下式给出:
(您可以通过替代,使用余弦加法法则简化,但我更喜欢保持事情的变量而言图中)。为了获得点C
,我们所需要的垂直矢量AB
(称之为n
):
现在我们有半径和圆弧的中心,我们仍需要确定其中方向我们正在,即,是否我们从A
要B
当移动顺时针或逆时针。这是一个简单的测试,使用跨产品:
如果是否定的,那么T
是在图中,我们需要顺时针,运动,反之亦然。圆弧l
的长度和角位移γ
当我们的距离x
移动沿弧:
快到了!最后一个步骤 - 我们需要解决如何通过角度γ
各地点C
旋转点A
,得到我们想要的点(称之为D
):
(从这个Wikipedia page改编)
现在对于一些代码,如果上述混淆了(它可能是!):
public Vector2 getPointOnArc(Vector2 A, Vector2 B, Vector2 T, double x)
{
// calculate preliminaries
Vector2 BA = B - A;
double d = BA.Length();
double theta = Math.Acos(Vector2.DotProduct(BA, T)/d) - Math.PI * 0.5;
// calculate radius
double r = d/(2.0 * Math.Cos(theta));
// calculate center
Vector2 n = new Vector2(BA.y, -BA.x);
Vector2 C = 0.5 * (A + B + n * Math.Tan(theta));
// calculate displacement angle from point A
double l = (Math.PI - 2.0 * theta) * r;
double gamma = (2.0 * Math.PI * x)/l;
// sign change as discussed
double cross = T.x * BA.y - T.y * BA.x;
if (cross < 0.0) gamma = -gamma;
// finally return the point we want
Vector2 disp = A - C;
double c_g = Math.Cos(gamma), s_g = Math.Sin(gamma);
return new Vector2(disp.X * c_g + disp.Y * s_g + C.X,
disp.Y * c_g - disp.X * s_g + C.Y);
}
你的解释可能会让你自己和其他人感到困惑。有没有什么办法可以用最简单的词汇来重新塑造你想要创造的形状?即。从(0,0) –
开始,半径为9的四分之一圆感谢乔希,按照建议编辑。 – Garlik
我已经有了。如所提供的图像所示。我需要的是一条不同的曲线(如果我没有弄错的话)不是一个圆圈的一部分。从(0,0)开始,以(45°倾斜)结束于(6,-3)。 – Garlik