Как преобразовать координаты x, y в угол?
Microsoft предоставляет отличный SVG градиент maker таким образом, IE9 также может иметь градиенты "CSS3" (нажмите Custom).
в настоящее время я использую их логику для моего фейерверк и Dreamweaver расширения для преобразования градиентов в SVG, но я знаю, как это сделать только для стандартных верхнего, нижнего, левого, правого направлений. Если вы вводите угол, я не делаю преобразования, потому что я не уверен, как я бы преобразовать x1, x2, y1, y2 в CSS3 угол степени.
генератор градиента значений, как это: Х1="0%" У1="0%" Х2="56.262833675564686%" У2="68.29999651227678%"
Я не большой с математикой или тригонометрией, так может кто-нибудь помочь мне? Я также хотел бы использовать ту же математику в Sass mixin, чтобы сделать аналогичную вещь, если это возможно.
6 ответов
если вы deltaX
и deltaY
из ваших координат тогда Math.atan2
возвращает арктангенс частного его аргументов. Возвращаемое значение находится в радианах.
var deltaX = x2 - x1;
var deltaY = y2 - y1;
var rad = Math.atan2(deltaY, deltaX); // In radians
затем вы можете преобразовать его в градусы так же легко, как:
var deg = rad * (180 / Math.PI)
редактировать
в моем первоначальном ответе были некоторые ошибки. Я считаю, что в обновленном ответе все ошибки устранены. Пожалуйста, прокомментируйте здесь, Если вы думаете, что есть проблема здесь.
принятый в настоящее время ответ неверен. Прежде всего,Math.tan
совершенно неправильно-я подозреваю, что Мохсен имел в виду Math.atan
и это просто опечатка.
однако, как и другие ответы на это состояние ответа, вы действительно должны использовать Math.atan2(y,x)
вместо. Регулярная обратная касательная будет возвращать значения только между-pi / 2 и pi / 2 (квадранты 1 и 4), потому что вход неоднозначен - обратная касательная не может знать, принадлежит ли входное значение в квадранте 1 против 3 или 2 против 4.
Math.atan2
, С другой стороны, можно использовать значения xy, чтобы выяснить, в каком квадранте вы находитесь, и вернуть соответствующий угол для любых координат во всех 4 квадрантах. Тогда, как отмечали другие, вы можете просто умножить на (180/Math.pi)
преобразовать радианы в градусы, если вам нужно.
вместо использования математики.функция tan вы должны использовать математику.инструмент atan2:
пример использования:
deltaX = x2 - x1;
deltaY = y2 - y1;
deg = Math.atan2(deltaY, deltaX)*180.0/Math.PI;
и это вернет градус от .
Если вы в квадранте
P1=(X0,Y0)
P2=(X1,Y1)
a=(X0-X1)
b=(Y0-Y2)
deltaX=((a)**2)**0.5
deltaY=((b)**2)**0.5
rad=math.atan2(deltaY, deltaX)
deg = rad * (360 / math.pi)
print deg
deg будет между 0 ~ 180
var x,x1,x2,y,y1,y2;
var cells = 'cell0';
var h,w;
var cx,cy;
var dx,dy;
var derajat;
var deg;
var ang;
var light;
var control;
function mouse_watch(event){
x = event.clientX;
y = event.clientY;
cell_data(cells);
koordinat(x2,y2);
busur(derajat);
}
function koordinat(x2,y2){
x2 = x-cx;
y2 = y-cy;
yk = y2;
xk = x2;
}
function busur(derajat){
y1 = Math.sqrt((Math.abs(yk)*Math.abs(yk))+(Math.abs(xk)*(Math.abs(xk))));
x1 = 0;
dy = yk-y1;
dx = xk-x1;
rad = Math.atan2(dy, dx);
derajat = rad * (360 / Math.PI);
cell = document.getElementById(cells);
ang = cell.getElementsByClassName('angle0')[0];
ang.style.transform = 'rotate('+derajat+'deg)';
light = ang.getElementsByClassName('points')[0];
light.style.height = y1+'px';
}
function cell_data(cells){
cell = document.getElementById(cells);
h = Number(cell.style.height.replace('px',''));
w = Number(cell.style.width.replace('px',''));
cy = Number(cell.style.top.replace('px',''))+h/2;
cx = Number(cell.style.left.replace('px',''))+w/2;
}
.preview_engine{
position: absolute;
top: 0;
left: 0;
padding: 10px;
background-color: #2E8AE6;
color: white;
}
body{
cursor: default;
width: 100%;
height: 100%;
font-family: Arial;
font-size: 12px;
}
.fieldwork{
width: 100%;
height: 100%;
position: absolute;
top: 0px;
left: 0px;
}
.cell{
position: relative;
transition : width 2s, height 2s, top 2s, left 2s;
background-color: red;
}
.angle0{
width: 200px;
height: 200px;
position: absolute;
top: -75px;
left: -75px;
background-color: green;
border-radius: 50%;
opacity: 0.5;
transition : width 2s, height 2s, top 2s, left 2s;
}
.points{
width: 10px;
height: 10px;
position: absolute;
left: 95px;
top: 95px;
background-color: red;
border-radius: 1em;
opacity: none;
}
<div class="fieldwork" onmousemove="mouse_watch(event)">
<div class='cell' id="cell0" style="width:50px;height:50px;top:200px;left:400px;">
<div class="angle0">
<div class="points"></div>
</div>
</div>
</div>
эта функция принимает 2 элемента и возвращает степень между серединой элементов.
например, я использовал его на карте мира, чтобы заставить изображение плоскости вращаться в направлении города.
function degFromTwoElements(el1,el2){
var x1,x2,y1,y2,cx1,xy1,cx2,cy2,deltaX,deltaY,dx,dy,rad,deg,shortest,number;
x1 = el1.position().left;
y1 = el1.position().top;
x2 = el2.position().left;
y2 = el2.position().top;
cx1 = x1 - (el1.width() / 2);
cy1 = y1 - (el1.height() / 2);
cx2 = x2 - (el2.width() / 2);
cy2 = y2 - (el2.height() / 2);
deltaX = cx2 - cx1;
deltaY = cy2 - cy1;
y1 = Math.sqrt((Math.abs(deltaY)*Math.abs(deltaY))+(Math.abs(deltaX)*(Math.abs(deltaX))));
x1 = 0;
dy = deltaY-y1;
dx = deltaX-x1;
rad = Math.atan2(dy, dx);
deg = rad * (360 / Math.PI);
shortest;
number = Math.abs(deg);
if ((360 - number ) < number){
shortest = 360 - number;
console.log('shorter degree: ' + shortest);
return shortest;
}
else console.log('Angle is: ' + deg);
return deg;
}