如何从椭圆上的两个点在画布上绘制椭圆,其中长轴(rx)和短轴(ry)长度的斜率未知

问题描述 投票:0回答:1

这可能更多是数学问题,但也许我缺少一个简单的javascript解决方案。

我想通过用户输入的中心点,长(最长)轴的半径和2个点落在椭圆上在html画布上绘制一个椭圆。

这可能会创建2个可能的椭圆路径,这两个椭圆路径都将围绕中心点居中并穿过2个点。

例如,如果center = [2, 1]长轴半径a = 10,点1 u = [4, 2]和点2 v = [5, 6],短轴半径b和旋转角度theta是什么?

enter image description here

到目前为止,我已经尝试实现从https://math.stackexchange.com/questions/3210414/find-the-angle-of-rotation-and-minor-axis-length-of-ellipse-from-major-axis-leng中找到的方程,但它不会返回有效值。我的JavaScript代码如下所示:


function getEllipseFrom2Points(center, u, v, a) {
  function getSlope(plusOrMinus) {
      return Math.sqrt(((uy * vx - ux * vy) ** 2) / (-ux * uy * (a * (v2x + v2y) - 1) + vx * vy * (a * (u2x + u2y) - 1) - plusOrMinus * (uy * vx - ux * vy) * q) / (u2x * (1 - a * v2y) + v2x * (a * u2y - 1)));
  }
  function getMinorAxis(plusOrMinus) {
      return (u2x + u2y + v2x + v2y - a * (2 * u2x * v2x + 2 * u2y * v2y + 2 * ux * uy * vx * vy + u2y * v2x + u2x * v2y) + plusOrMinus * 2 * (ux * vx + uy * vy) * q);
  }
  var vx = v[0],
      vy = v[1],
      ux = u[0],
      uy = u[1],
      v2x = vx ** 2,
      v2y = vy ** 2,
      u2x = ux ** 2,
      u2y = uy ** 2,
      q = Math.sqrt((1 - a * (u2x + u2y)) * (1 - a * (v2x + v2y))),
      ellipse1 = { rx: a, ry: getMinorAxis(1), origin: center, rotation: getSlope(1) },
      ellipse2 = { rx: a, ry: getMinorAxis(-1), origin: center, rotation: getSlope(-1) };
}

或者我遵循的方程式是错误的,或者我实现了它是错误的

javascript html5-canvas trigonometry ellipse
1个回答
0
投票

[如果有人感兴趣,这是我对问题的解决方案,它并不是真正的“解决方案”。如果有人能解决这个问题,我仍然很高兴知道。

由于无法同时求解长轴的斜率和短轴的长度,所以我只是猜测一下斜率,然后测试它的接近程度,然后通过在越来越小的区域中尝试来完善结果。由于绘制的最终椭圆实际上是根据贝塞尔曲线构建的估计,因此我可以在合理的时间内得到足够的接近。

© www.soinside.com 2019 - 2024. All rights reserved.