2017-08-30 52 views
0

我想编写一个游戏,我正在特定的曲线上进行特定的旋转。我不是一个伟大的数学家...完全...试图寻找解决方案几个小时,但我很害怕我找不到任何解决方案。用特定的旋转计算一个特定的曲线,c#

所以,小图片第一说明:

enter image description here

这是一个圆的八分之一的9半径,beggining是(0,0)

现在的端部在约6.364,-2.636。但是我需要这条曲线,最后是45°的方向,但最终的结果恰恰是6.0,-3.0。

难道你们能告诉我怎么做吗?我需要能够精确计算这条曲线上的任何一点,其准确长度为&。我会假设使用某种椭圆数学可能是一种解决方案?我承认我的数学课是reaaaly远远现在有现在现在好了线索......

感谢任何可能的帮助

+0

你的解释可能会让你自己和其他人感到困惑。有没有什么办法可以用最简单的词汇来重新塑造你想要创造的形状?即。从(0,0) –

+0

开始,半径为9的四分之一圆感谢乔希,按照建议编辑。 – Garlik

+0

我已经有了。如所提供的图像所示。我需要的是一条不同的曲线(如果我没有弄错的话)不是一个圆圈的一部分。从(0,0)开始,以(45°倾斜)结束于(6,-3)。 – Garlik

回答

1

我想我发现了sastisfies您的要求二次曲线:

f(x) = -1/12 x^2 + 9 

复制以下成https://www.desmos.com/calculator看到它:

-\frac{1}{12}x^2+9 

F'(x)的将是-1/6X,所以当x = 6,该衍生物将是-1,这对应于-45°inclin通货膨胀。有可能无限的曲线满足您的要求,但如果我的微积分不是太生锈,这是其中之一。

我试图以配合焦点的椭圆开始y=6herey=9here你点开始,但坡度并不像45°。 也可以从任意高度k开始,here似乎不起作用。

+0

确实!非常感谢您的时间。 我一直希望有更多'圆润'的东西,但我认为这会做现在。 我想我应该多读一些贝塞尔曲线如果我想要别的东西:) 再次感谢 – Garlik

+0

我试着用一个椭圆,但斜率不起作用..检查编辑答案上的链接。 – AlexDev

+0

无论如何,如果你想要一些圆的我想你应该看看https://stackoverflow.com/questions/34973466/creating-a-curve-between-two-points-each-with-normalized-vectors – AlexDev

0

我不认为你已经完全理解了我在关于“倾斜”角度的评论中提出的问题。所以我会给出一个一般的案例解决方案,其中你有一个明确的切向量曲线的结尾。 (您可以在此使用的倾斜角度计算;如果我们澄清你的意思是什么话,我会很乐意与一个公式编辑来计算,如果必要的切向量)


让我们画的是如何在一个图设置可以看看:

enter image description here

(不是100%准确)

AB是你的固定点。 T单位切向量。 rC是我们需要计算的圆弧的半径和中心。

角度θBAT减去π/2弧度(90度)之间的角给出。我们可以用点积计算的话:

enter image description here

ABC中心的(签订)距离由下式给出:

enter image description here

注意,这是消极的在右边的情况下,左边是积极的。半径由下式给出:

enter image description here

(您可以通过替代,使用余弦加法法则简化,但我更喜欢保持事情的变量而言图中)。为了获得点C,我们所需要的垂直矢量AB(称之为n):

enter image description here

现在我们有半径和圆弧的中心,我们仍需要确定其中方向我们正在,即,是否我们从AB当移动顺时针逆时针。这是一个简单的测试,使用跨产品

enter image description here

如果是否定的,那么T是在图中,我们需要顺时针,运动,反之亦然。圆弧l的长度和角位移γ当我们的距离x移动沿弧:

enter image description here

快到了!最后一个步骤 - 我们需要解决如何通过角度γ各地点C旋转点A,得到我们想要的点(称之为D):

enter image description here

(从这个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°,所以虽然这是相当惊人的东西,我不认为它回答OP的问题。 – AlexDev

+0

@AlexDev嗯是的,我认为不可能(一般)修复两个端点*和*两个切线方向(如果曲线是圆形的)。我会等待看到OP认为 – meowgoesthedog

+0

非常感谢您的详细解释。事实上,正如AlexDev所说,这并不能解决我确切的问题。我所寻找的曲线不能是圆形的。最接近的圆形曲线是附加在OP屏幕截图中的曲线,但与我的终点标准(6,-3)不符,尽管它具有正确的倾向。 – Garlik