用户输入令人费解功能

问题描述:

我试图让一些事情告诉你两个圆的交点。我在哪里放置在圆圈和半径的中心。 (我从*得到交集函数:here。我正在尝试添加用户输入,但是当我将代码内部的静态数字更改为用户输入时(通过提示或html输入),该函数将中断并且警报会向我发送一个未完成的答案和一个Nan。用户输入令人费解功能

这里是编码至今(没有用户输入):

<html> 
    <button onclick="button()">Test</button> 
    <script> 
    var x0 = 3; 
    var y0 = 0; 
    var r0 = 3; 
    var x1 = -1; 
    var y1 = 0; 
    var r1 = 2; 
    function button() { 


    intersection(x0, y0, r0, x1, y1, r1) 

    function intersection(x0, y0, r0, x1, y1, r1) { 
    var a, dx, dy, d, h, rx, ry; 
    var x2, y2; 

    /* dx and dy are the vertical and horizontal distances between 
    * the circle centers. 
    */ 
    dx = x1 - x0; 
    dy = y1 - y0; 

    /* Determine the straight-line distance between the centers. */ 
    d = Math.sqrt((dy*dy) + (dx*dx)); 

    /* Check for solvability. */ 
    if (d > (r0 + r1)) { 
     /* no solution. circles do not intersect. */ 
     return false; 
    } 
    if (d < Math.abs(r0 - r1)) { 
     /* no solution. one circle is contained in the other */ 
     return false; 
    } 

    /* 'point 2' is the point where the line through the circle 
    * intersection points crosses the line between the circle 
    * centers. 
    */ 

    /* Determine the distance from point 0 to point 2. */ 
    a = ((r0*r0) - (r1*r1) + (d*d))/(2.0 * d) ; 

    /* Determine the coordinates of point 2. */ 
    x2 = x0 + (dx * a/d); 
    y2 = y0 + (dy * a/d); 

    /* Determine the distance from point 2 to either of the 
    * intersection points. 
    */ 
    h = Math.sqrt((r0*r0) - (a*a)); 

    /* Now determine the offsets of the intersection points from 
    * point 2. 
    */ 
    rx = -dy * (h/d); 
    ry = dx * (h/d); 

    /* Determine the absolute intersection points. */ 
    var xi = x2 + rx; 
    var xi_prime = x2 - rx; 
    var yi = y2 + ry; 
    var yi_prime = y2 - ry; 

    var list = "(" + xi + ", " + yi + ")" + "(" + xi_prime + ", " + 
    yi_prime + ")" 
    alert(list); 
    } 
    } 

    </script> 
    </html> 

当我改变的变量中的任何一个分开的圆是为用户的输入,如:

var x0 = prompt("X cord of circle 1"); 

警报来(3-2.6250,-1.4523687548277813)(NaN,1.4523687548277813)

并且没有用户输入(显示在大代码块中),它出现为:(0.375,-1.4523687548277813)(0.375,1.45 23687548277813)。这是正确的答案。

任何人都可以告诉我我做错了什么或发生了什么?

提示符会将用户输入视为字符串。要将其转换为数学爵士乐的整数,请使用parseInt

var x0String = prompt("X cord of circle 1"); 
var x0 = parseInt(x0String); 

的JavaScript应该“转换”,如果你因为JS在执行它的计算是弱类型的数字字符串到整数,但它是很好的做法,你可以通过分析从一个字符串自己的整数值避免一些陷阱。

您的提示会返回一个字符串,但您无法对字符串进行数学运算。尝试将其转换为数字:

var x0 = Number(prompt("X cord of circle 1")); 

正如Daniel指出的那样,如果您需要将字符串作为数字,将字符串更改为数字总是更好。它似乎很混乱,为什么该程序无法正常工作,直到我发现x0被使用了两次。

程序返回NaN的原因是因为当使用+运算符时,该数字被转换为字符串而不是数字。

这里发生:x0 + (dx * a/d);

会发生什么,然后是一个负数被添加到字符串制作类似:2-2

正如你所期望的值不再被转换成一个数字,从而返回NaN,当我们稍后尝试减去它时。