Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 沿椭圆移动点_Javascript_Math_Drawing_Ellipse - Fatal编程技术网

Javascript 沿椭圆移动点

Javascript 沿椭圆移动点,javascript,math,drawing,ellipse,Javascript,Math,Drawing,Ellipse,我已经在画布上创建了一个椭圆,现在我需要从原点绘制三条线。例如,假设第一条线是90度(垂直),因此点是(0,10)。我需要另外两条线在两个方向上都离点x像素 我肯定我描述得不够好,但基本上我想做的是从一个已知椭圆上的点,找到另一个距离x的点,它位于椭圆上 我已经试着寻找一个椭圆的弧,但似乎没有什么适合我所寻找的 对于椭圆: x = a cos(t) y = b sin(t) 因此: 插入a、b和x的值,得到y 看 相当粗略地说: var a=120; var b=70; var c=docu

我已经在画布上创建了一个椭圆,现在我需要从原点绘制三条线。例如,假设第一条线是90度(垂直),因此点是(0,10)。我需要另外两条线在两个方向上都离点x像素

我肯定我描述得不够好,但基本上我想做的是从一个已知椭圆上的点,找到另一个距离x的点,它位于椭圆上

我已经试着寻找一个椭圆的弧,但似乎没有什么适合我所寻找的

对于椭圆:

x = a cos(t)
y = b sin(t)
因此:

插入
a
b
x
的值,得到
y

相当粗略地说:

var a=120;
var b=70;
var c=document.getElementById(“myCanvas”);
var cxt=c.getContext(“2d”);
var xCentre=c.宽度/2;
var yCentre=c.高度/2;
//画轴
cxt.strokeStyle='blue';
cxt.beginPath();
cxt.moveTo(0,yCentre);
cxt.lineTo(xCentre*2,yCentre);
cxt.stroke();
cxt.beginPath();
移动到(xCentre,0);
cxt.lineTo(xCentre,yCentre*2);
cxt.stroke();
//画椭圆
cxt.strokeStyle='black';
cxt.beginPath();
对于(变量i=0*Math.PI;i<2*Math.PI;i+=0.01){
xPos=xCentre-(a*Math.cos(i));
yPos=yCentre+(b*Math.sin(i));
如果(i==0){
cxt.moveTo(XPO、YPO);
}否则{
cxt.lineTo(XPO、YPO);
}
}
cxt.lineWidth=2;
cxt.strokeStyle=“#232323”;
cxt.stroke();
cxt.closePath();
//用x=+/-40画线
增值税=40;
变量y1=b*Math.sin(Math.acos(deltaX/a));
cxt.strokeStyle='red';
cxt.beginPath();
cxt.移动到(xCentre+deltaX,yCentre-y1);
cxt.lineTo(xCentre,yCentre);
cxt.lineTo(xCentre deltaX,yCentre-y1);
cxt.stroke()

椭圆

安德鲁·莫顿的回答是足够的,但您可以用一个平方根代替
sin
acos

假设有一个以原点为中心的椭圆,半径沿a的X轴,半径沿b的Y轴。这个椭圆的方程是

x2/a2+y2/b2=1

为y解决这个问题会得到

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

你可以选择合适的符号。根据您的帖子,您需要正平方根

转换为Javascript:

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

你知道椭圆半径的最小值和最大值吗?是的,我在画椭圆,所以我知道每个点。所以,安德鲁·莫顿比我快,看他的答案。你说“第一条线是90度(垂直),所以点是(10,0)”。从(0,0)到(10,0)的直线是水平的,而不是垂直的。你的意思是第一点是(0,10)?是的,谢谢。天已经晚了:)这给我找到了一个我已经知道的点的y值。从原点正上方的一个点,假设(0,15),我需要找到一个指向“右”x距离的点和一个指向“左”x距离的点。另外两个点必须落在椭圆上。很抱歉,如果你的回答解释了这一点,但我不知道它将如何“沿椭圆移动”。所以弧的长度应该是5。你说你想要椭圆上的一个点,右边是x像素。假设x=10.0,那么y=bsin(acos(10.0/a))。对于左侧的x像素,需要y=bsin(acos(-10.0/a))。你知道a和b的值,因为你用它们画椭圆。我想我当时对数学和逻辑感到困惑。当我说我想要一个向左10像素的点,现在X=10。我的新点应该小于10,因为椭圆的弧不是直线。我应该得到一个略大于0的答案。我可能要求的太多了,但假设点离水平端点更近,那么我不希望x点直接向左/向右10,因为曲线。@AdamDev那么我想你说的是沿着椭圆的弧长:和。说“左”意味着“左”,而不是“左一点,下一点”;)你可以假装椭圆是一个圆,并使用它的弧长,而不是试图通过孔进行精确测量。误差可能不可见/不明显。
function yForEllipse(a, b, x) {
    return b * Math.sqrt(1 - x*x / a * a);
}