如何将x,y坐标转换为角度?

Mat*_*tow 34 javascript svg gradient trigonometry css3

Microsoft提供了一个出色的SVG渐变制作器,因此IE9也可以具有"CSS3"渐变(单击自定义).

我目前利用他们的逻辑为我的FireworksDreamweaver扩展将渐变转换为SVG,但我只知道如何为标准的顶部,底部,左,右方向做.如果输入一个角度,我不进行转换,因为我不确定如何将x1,x2,y1,y2转换为CSS3角度.

梯度生成器提供如下值:x1 ="0%"y1 ="0%"x2 ="56.262833675564686%"y2 ="68.29999651227678%"

我对数学或三角学不太满意,所以有人可以帮助我吗?如果可能的话,我也想在Sass mixin中使用相同的数学来做类似的事情.

Moh*_*sen 67

如果从坐标获得deltaX并返回其参数的商的反正切值.返回值以弧度为单位.deltaYMath.atan2

var deltaX = x2 - x1;
var deltaY = y2 - y1;
var rad = Math.atan2(deltaY, deltaX); // In radians
Run Code Online (Sandbox Code Playgroud)

然后你可以将它转换为度数就像:

var deg = rad * (180 / Math.PI)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑

我最初的答案中有一些错误.我相信更新的答案会解决所有错误.如果您认为此处存在问题,请在此处发表评论.

  • 您应该使用[`Math.atan2`](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/atan2). (8认同)
  • 我看到这个答案已被编辑(它曾经说过`Math.tan`而不是`Math.atan2`),但它仍然不是*非常正确.坐标应该是`(y,x)`而不是`(x,y)`的顺序......对我来说似乎也很傻,但这对你来说就是JavaScript.有关"Math.atan2"的文档或我自己的答案,请参阅[此处](http://www.w3schools.com/jsref/jsref_atan2.asp)以获取更多详细信息. (4认同)
  • deltaX将为x2-x1,deltaY将为y2-y1。您的答案是正确的,但是以弧度为单位,您忘了乘以(180 / Math.PI)以度为单位 (2认同)

Mat*_*att 19

目前接受的答案不正确.首先,Math.tan完全错了 - 我怀疑Mohsen的意思Math.atan,这只是一个错字.

但是,正如对该答案的其他回应所述,您应该真正使用Math.atan2(y,x).常规反正切将仅返回-pi/2和pi/2(象限1和4)之间的值,因为输入是不明确的 - 反正切无法知道输入值是否属于象限1对3,或者2比4.

Math.atan2另一方面,可以使用给定的xy值来确定您所在的象限,并为所有4个象限中的任何坐标返回适当的角度.然后,正如其他人所说(180/Math.pi),如果需要,你可以乘以将弧度转换为度数.