我试图在代表弹丸路径的两点之间绘制一条弧线。弹丸离开 A 点的角度是已知的,并且两个点的 X/Y 坐标都是已知的。

c# - 根据已知的抛射角在两点之间绘制抛物线弧-LMLPHP

我试图弄清楚这背后的数学原理,以及如何在 c# 中绘制它。

这是我失败的尝试,基于我发现的一些路径示例

var g = new StreamGeometry();
var xDistance = Math.Abs(pointA.X - pointB.X);
var yDistance = Math.Abs(pointA.Y - pointB.Y);
var angle = 60;
var radiusX = xDistance / angle;
var radiusY = yDistance / angle;

using (var gc = g.Open())
{
    gc.BeginFigure(
        startPoint: pointA,
        isFilled: false,
        isClosed: false);

    gc.ArcTo(
        point: pointB,
        size: new Size(radiusX, radiusY),
        rotationAngle: 0d,
        isLargeArc: false,
        sweepDirection: SweepDirection.Clockwise,
        isStroked: true,
        isSmoothJoin: false);
}

任何帮助将不胜感激!

编辑 #2(增加清晰度):对于这个问题,假设物理不起作用(没有重力、速度或任何外力)。弹丸保证降落在 B 点并沿抛物线路径移动。顶点将位于水平轴上点 A 和点 B 的中间。它发射的角度是从地面向上的角度(水平)。

所以A点(Ax,Ay)是已知的。
点 B (Bx, By) 是已知的。
出发角是已知的。
顶点的 X 半已知 (Vx = Abs(Ax - Bx))。

这真的归结为需要找出顶点的 Y 坐标吗?

最佳答案

根据评论,我们需要一个二次贝塞尔曲线。这由 3 个点定义,起点、终点和一个控制点:

c# - 根据已知的抛射角在两点之间绘制抛物线弧-LMLPHP

它由以下等式定义:

c# - 根据已知的抛射角在两点之间绘制抛物线弧-LMLPHP

因此我们需要使用给定的条件找到 P1(注意重力强度是隐式确定的)。对于二维坐标,我们需要两个约束/边界条件。它们由:

  • P0 处的切向量:

    c# - 根据已知的抛射角在两点之间绘制抛物线弧-LMLPHP

    我们需要将角度与水平线相匹配:

    c# - 根据已知的抛射角在两点之间绘制抛物线弧-LMLPHP
  • 曲线的顶点必须在控制点 P1 的正下方:

    c# - 根据已知的抛射角在两点之间绘制抛物线弧-LMLPHP

  • 因此,垂直坐标由下式给出:

    c# - 根据已知的抛射角在两点之间绘制抛物线弧-LMLPHP

    [请让我知道您是否需要上述的一些示例代码]

    现在了解如何添加二次贝塞尔曲线;谢天谢地,一旦你完成了上述操作,它就是 not too difficult

    以下方法为简单对称情况创建抛物线几何。该角度是从水平方向逆时针测量的度数。
    public Geometry CreateParabola(double x1, double x2, double y, double angle)
    {
        var startPoint = new Point(x1, y);
        var endPoint = new Point(x2, y);
    
        var controlPoint = new Point(
            0.5 * (x1 + x2),
            y - 0.5 * (x2 - x1) * Math.Tan(angle * Math.PI / 180));
    
        var geometry = new StreamGeometry();
    
        using (var context = geometry.Open())
        {
            context.BeginFigure(startPoint, false, false);
            context.QuadraticBezierTo(controlPoint, endPoint, true, false);
        }
    
        return geometry;
    }
    

    关于c# - 根据已知的抛射角在两点之间绘制抛物线弧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48602141/

    10-10 10:24