最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Moving A Point Along Ellipse - Stack Overflow

programmeradmin4浏览0评论

I have created an ellipse on my canvas and now I need to draw three lines stemming from the origin. As an example let's say the first line is 90 degrees (vertical) so the point is (0, 10). I need the other two lines to be x pixels away from the point in both directions.

I'm sure I didn't describe this well enough but basically what I am trying to do is from a point on a known ellipse, find another point x distance away that lies on the ellipse.

I have tried looking for an arc of an ellipse but nothing seems to fit what I am looking for.

I have created an ellipse on my canvas and now I need to draw three lines stemming from the origin. As an example let's say the first line is 90 degrees (vertical) so the point is (0, 10). I need the other two lines to be x pixels away from the point in both directions.

I'm sure I didn't describe this well enough but basically what I am trying to do is from a point on a known ellipse, find another point x distance away that lies on the ellipse.

I have tried looking for an arc of an ellipse but nothing seems to fit what I am looking for.

Share Improve this question edited Feb 14, 2013 at 13:06 AdamDev asked Feb 13, 2013 at 21:09 AdamDevAdamDev 3354 silver badges11 bronze badges 5
  • Do you know the minimum and maximum values for the ellipse's radius? – bfavaretto Commented Feb 13, 2013 at 21:13
  • Yes, I am drawing the ellipse so I know every point. – AdamDev Commented Feb 13, 2013 at 21:15
  • So, Andrew Morton was faster than me, see his answer. – bfavaretto Commented Feb 13, 2013 at 21:19
  • You said “the first line is 90 degrees (vertical) so the point is (10, 0)”. A line from (0,0) to (10,0) is horizontal, not vertical. Did you mean the first point is (0, 10)? – rob mayoff Commented Feb 13, 2013 at 22:26
  • Yes, thank you. It was getting late in the day :) – AdamDev Commented Feb 14, 2013 at 13:06
Add a ment  | 

2 Answers 2

Reset to default 10

For an ellipse:

x = a cos(t)
y = b sin(t)

So:

x/a= cos(t)
t = acos(x/a)
y = b sin(acos(x/a))

Plug in your values of a, b, and x and you get y.

See https://www.mathopenref./coordparamellipse.html

Rather crudely:

var a=120;
var b=70;

var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");

var xCentre=c.width / 2;
var yCentre=c.height / 2;


// draw axes
cxt.strokeStyle='blue';
cxt.beginPath();
cxt.moveTo(0, yCentre);
cxt.lineTo(xCentre*2, yCentre);
cxt.stroke();

cxt.beginPath();
cxt.moveTo(xCentre, 0);
cxt.lineTo(xCentre, yCentre*2);
cxt.stroke();

// draw ellipse
cxt.strokeStyle='black';

cxt.beginPath();

for (var i = 0 * Math.PI; i < 2 * Math.PI; i += 0.01 ) {
    xPos = xCentre - (a * Math.cos(i));
    yPos = yCentre + (b * Math.sin(i));

    if (i == 0) {
        cxt.moveTo(xPos, yPos);
    } else {
        cxt.lineTo(xPos, yPos);
    }
}
cxt.lineWidth = 2;
cxt.strokeStyle = "#232323";
cxt.stroke();
cxt.closePath();

// draw lines with x=+/- 40
var deltaX=40;

var y1=b*Math.sin(Math.acos(deltaX/a));

cxt.strokeStyle='red';
cxt.beginPath();
cxt.moveTo(xCentre+deltaX, yCentre-y1);
cxt.lineTo(xCentre, yCentre);
cxt.lineTo(xCentre-deltaX, yCentre-y1);
cxt.stroke();
<html>
<head><title>Ellipse</title></head>
<body>
    <canvas id="myCanvas" style="position: absolute;" width="400" height="200"></canvas>
</body>
</html>

(Using https://www.scienceprimer./draw-oval-html5-canvas as a basis as I've never used HTML canvas before.)

Andrew Morton's answer is adequate, but you can it with one square root instead of a sin and an acos.

Suppose you have an ellipse centered at the origin, with a radius along the X-axis of a and a radius along the Y-axis of b. The equation of this ellipse is

x2/a2 + y2/b2 = 1.

Solving this for y gives

y = ± b sqrt(1 - x2/a2)

You can choose whichever sign is appropriate. Based on your post, you want the positive square root.

Translating to Javascript:

function yForEllipse(a, b, x) {
    return b * Math.sqrt(1 - x*x / a * a);
}
发布评论

评论列表(0)

  1. 暂无评论