2013-12-22 10 views
1

Мне нужен способ преобразования координат X и Y в угол. У меня есть этот код, но мне нужен этот макет:Преобразование X, Y в угол

180 

90 270

360

private double getAngle(double xTouch, double yTouch) { 
    double x = xTouch - (slideBtn.getWidth()/2d); 
    double y = slideBtn.getHeight() - yTouch - (slideBtn.getHeight()/2d); 
    switch (getQuadrant(x, y)) { 
     case 1: 
      return Math.asin(y/Math.hypot(x, y)) * 180/Math.PI; 
     case 2: 
      return 180 - Math.asin(y/Math.hypot(x, y)) * 180/Math.PI; 
     case 3: 
      return 180 + (-1 * Math.asin(y/Math.hypot(x, y)) * 180/Math.PI); 
     case 4: 
      return 360 + Math.asin(y/Math.hypot(x, y)) * 180/Math.PI; 
     default: 
      return 0; 
    } 
} 

/** 
* @return The selected quadrant. 
*/ 
private static int getQuadrant(double x, double y) { 
    if (x >= 0) { 
     return y >= 0 ? 1 : 4; 
    } else { 
     return y >= 0 ? 2 : 3; 
    } 
} 

Edit, чтобы прояснить проблему: У меня проблема была в том, что я получал неправильные углы для x, y углы. Например: 0/360 градусов - верхняя сторона круга, а 180 градусов - нижняя сторона круга. Я попытался исправить это, используя код выше (с разными квадрантами, но это не сработало). Принятый ответ сделал трюк для меня.

ответ

3

Я не совсем уверен, чего вы пытаетесь достичь, но разве не проще просто использовать функцию atan2, чтобы получить угол?

http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#atan2(double, двойной)

Если вы не знакомы с функцией вы можете прочитать здесь:

http://en.wikipedia.org/wiki/Atan2

Edit, код примера:

Итак, вот некоторый код я считают полезным, после обсуждения

public static double getAngle(int x, int y) 
{ 
    return 1.5 * Math.PI - Math.atan2(y,x); //note the atan2 call, the order of paramers is y then x 
} 

В принципе, он вычисляет угол между отрицательной осью Y с положительным направлением по часовой стрелке. Надеюсь, это то, что вы искали.

+0

Когда я делаю метод getAngle(), я получаю неправильный макет угла. Поэтому мне нужен угол, как указано выше. Atan2 не то, что я хотел ... 180 градусов вместо 90 градусов сверху. Поэтому поверните весь угол на 90 градусов, но я не знаю, как это сделать. – matthijs2704

+0

Когда вы получите результаты atan2, вы должны просто добавить PI/2 для поворота угла против часовой стрелки на 90 градусов, если это ваша проблема , Но проблема в том, что я не понимаю, где на вашем макете 0 градусов, а углы увеличиваются по часовой стрелке или против часовой стрелки? –

+0

0 градусов в той же точке, что и 360 градусов, но я попробую atan2! Спасибо, и я приму ваш ответ, когда он сработает – matthijs2704

0

\t var x,x1,x2,y,y1,y2; 
 
\t \t var cells = 'cell0'; 
 
\t \t var h,w; 
 
\t \t var cx,cy; 
 
\t \t var dx,dy; 
 
\t \t var derajat; 
 
\t \t var deg; 
 
\t \t var ang; 
 
\t \t var light; 
 
\t \t var control; 
 
\t \t \t function mouse_watch(event){ 
 
\t \t \t \t x = event.clientX; 
 
\t \t \t \t y = event.clientY; 
 
\t \t \t \t cell_data(cells); 
 
\t \t \t \t koordinat(x2,y2); 
 
\t \t \t \t busur(derajat); 
 
\t \t \t } 
 
\t \t \t function koordinat(x2,y2){ 
 
\t \t \t \t x2 = x-cx; 
 
\t \t \t \t y2 = y-cy; 
 
\t \t \t \t yk = y2; 
 
\t \t \t \t xk = x2; 
 
\t \t \t } 
 
\t \t \t function busur(derajat){ 
 

 
\t \t \t \t y1 = Math.sqrt((Math.abs(yk)*Math.abs(yk))+(Math.abs(xk)*(Math.abs(xk)))); 
 
\t \t \t \t x1 = 0; 
 
\t \t \t \t dy = yk-y1; 
 
\t \t \t \t dx = xk-x1; 
 
\t \t \t \t rad = Math.atan2(dy, dx); 
 
\t \t \t \t derajat = rad * (360/Math.PI); 
 
\t \t \t \t cell = document.getElementById(cells); 
 
\t \t \t \t ang = cell.getElementsByClassName('angle0')[0]; 
 
\t \t \t \t ang.style.transform = 'rotate('+derajat+'deg)'; 
 
\t \t \t \t light = ang.getElementsByClassName('points')[0]; 
 
\t \t \t \t light.style.height = y1+'px'; 
 
\t \t \t } 
 
\t \t \t function cell_data(cells){ 
 
\t \t \t \t cell = document.getElementById(cells); 
 
\t \t \t \t h = Number(cell.style.height.replace('px','')); 
 
\t \t \t \t w = Number(cell.style.width.replace('px','')); 
 
\t \t \t \t cy = Number(cell.style.top.replace('px',''))+h/2; 
 
\t \t \t \t cx = Number(cell.style.left.replace('px',''))+w/2; 
 
\t \t \t }
.preview_engine{ 
 
\t \t \t \t position: absolute; 
 
\t \t \t \t top: 0; 
 
\t \t \t \t left: 0; 
 
\t \t \t \t padding: 10px; 
 
\t \t \t \t background-color: #2E8AE6; 
 
\t \t \t \t color: white; 
 
\t \t \t } 
 
\t \t \t body{ 
 
\t \t \t \t cursor: default; 
 
\t \t \t \t width: 100%; 
 
\t \t \t \t height: 100%; 
 
\t \t \t \t font-family: Arial; 
 
\t \t \t \t font-size: 12px; 
 
\t \t \t } 
 
\t \t \t .fieldwork{ 
 
\t \t \t \t width: 100%; 
 
\t \t \t \t height: 100%; 
 
\t \t \t \t position: absolute; 
 
\t \t \t \t top: 0px; 
 
\t \t \t \t left: 0px; 
 
\t \t \t } 
 
\t \t \t .cell{ 
 
\t \t \t \t position: relative; 
 
\t \t \t \t transition : width 2s, height 2s, top 2s, left 2s; 
 
\t \t \t \t background-color: red; 
 
\t \t \t } 
 
\t \t \t .angle0{ 
 
\t \t \t \t width: 200px; 
 
\t \t \t \t height: 200px; 
 
\t \t \t \t position: absolute; 
 
\t \t \t \t top: -75px; 
 
\t \t \t \t left: -75px; 
 
\t \t \t \t background-color: green; 
 
\t \t \t \t border-radius: 50%; 
 
\t \t \t \t opacity: 0.5; 
 
\t \t \t \t transition : width 2s, height 2s, top 2s, left 2s; 
 
\t \t \t } 
 
\t \t \t .points{ 
 
\t \t \t \t width: 10px; 
 
\t \t \t \t height: 10px; 
 
\t \t \t \t position: absolute; 
 
\t \t \t \t left: 95px; 
 
\t \t \t \t top: 95px; 
 
\t \t \t \t background-color: red; 
 
\t \t \t \t border-radius: 1em; 
 
\t \t \t \t opacity: none; 
 
\t \t \t }
\t \t <div class="fieldwork" onmousemove="mouse_watch(event)"> 
 
\t \t \t <div class='cell' id="cell0" style="width:50px;height:50px;top:200px;left:400px;"> 
 
\t \t \t \t <div class="angle0"> 
 
\t \t \t \t \t <div class="points"></div> 
 
\t \t \t \t </div> 
 
\t \t \t </div> 
 
\t \t </div>

+0

Запустить и увидеть результат, –

+0

Спасибо, но я попросил java-ответ, а не javascript-ответ;) Но я мог бы переписать его для java, так что спасибо! – matthijs2704

+0

Можете ли вы помочь мне написать свою игру в java ?? Я сделал игру в javascript, которая запускается в браузере, , но я застрял в памяти gpu, которая используется для запуска игры, если в игре создается больше объектов, это заставит вспышку работать медленно. –

0

Этот класс преобразует входной сигнал джойстика на угол, 0, являющегося положительным у ось является 0 градусов, положительные х означает 90, отрицательный у как 180, а отрицательные х, как 270

public class GetAngle { 

    public static void main(String[] args) { 

     System.out.println(getAngle(-1,0)); 

    } 

    public static double getAngle(double x, double y) { 

     // Checking if the joystick is at center (0,0) and returns a 'stand still' 
     // command by setting the return to 99999 
     if (x == 0 && y == 0) { 

      return (99999); 

      // Returns a value based on the quadrant and does some math to deliver the angle 
      // of the coordinates 
     } else if (x >= 0 && y > 0) { 

      return (90 - (Math.atan(y/x) * 180/Math.PI)); 

     } else if (x > 0 && y <= 0) { 

      return (90 - (Math.atan(y/x) * 180/Math.PI)); 

     } else if (x <= 0 && y < 0) { 

      return (180 + (Math.atan(y/x) * 180/Math.PI)); 

     } else if (x < 0 && y >= 0) { 

      return (270 - (Math.atan(y/x) * 180/Math.PI)); 

     } else 
      return (99999); 

    } 

} 
Смежные вопросы