我试图在代表弹丸路径的两点之间绘制一条弧线。弹丸离开 A 点的角度是已知的,并且两个点的 X/Y 坐标都是已知的。
我试图弄清楚这背后的数学原理,以及如何在 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 个点定义,起点、终点和一个控制点:
它由以下等式定义:
因此我们需要使用给定的条件找到 P1
(注意重力强度是隐式确定的)。对于二维坐标,我们需要两个约束/边界条件。它们由:
P0
处的切向量:我们需要将角度与水平线相匹配:
P1
的正下方:因此,垂直坐标由下式给出:
[请让我知道您是否需要上述的一些示例代码]
现在了解如何添加二次贝塞尔曲线;谢天谢地,一旦你完成了上述操作,它就是 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/