2013-05-24 8 views
0

Я знаю, что здесь есть несколько вопросов о точках и вращениях, и я чувствую, что Im почти там. Мне нужно немного толкнуть.Вращение точки вокруг центральной точки

У меня есть форма с 6 точками, как этот.

enter image description here

Я хочу, чтобы повернуть точки P вокруг точки C

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

заранее спасибо


Thread thread = new Thread() { 

    public void run() { 

     //THE RADIUS OF THE SHAPE IS 100 

     //GET THE POINT P 
     PointClass point_class = points.get(0); 

     //GET THE CENTER POINT C 
     Point center = new Point(point_class.point.x - 100, point_class.point.y); 

     int deg = 0; 

     while(deg < 360) { 

      //GET THE ANGLE IN RADIANS 
      double angle = Math.toRadians(deg); 

      //FIRST TRANSLATE THE DIFFERENCE 
      int x1 = point_class.point.x - center.x; 
      int y1 = point_class.point.y - center.y; 

      //APPLY ROTATION 
      x1 = (int) ((double) x1 * Math.cos(angle) - y1 * Math.sin(angle)); 
      y1 = (int) ((double) x1 * Math.sin(angle) + y1 * Math.cos(angle)); 

      //TRANSLATE BACK 
      point_class.point.x = x1 + center.x; 
      point_class.point.y = y1 + center.y; 

      //ROTATE + 1 DEEGRE NEXT TIME 
      deg++; 

      try { 

       //SLEEP TO SEE THE DIFFERENCE 
       sleep(100); 

      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    } 
}; 

thread.start(); 

Что происходит с этим кодом является то, что точка P заканчивается в центре, как этот

enter image description here

ответ

2

Так я понял, что был неправ.

Перевод двух точек,

//FIRST TRANSLATE THE DIFFERENCE 
double x1 = point_class.point.x - center.x; 
double y1 = point_class.point.y - center.y; 

должен выходить за пределы контура, потому что мне нужно взять базу в этом месте при применении матрицы вращения. А также в цикле, я должен иметь deegre фиксированный в 1, так что он только incrementet на 1, а не 81 + 82 + 83 ... Не знаю, почему я сделал это.

Надеется, что это помогает кто-то =)

+1

Ваша формула выше помогла с чем-то совершенно не связанным :) – cgatian

3

Я думаю, что ваш радиус уменьшается каждый раз через петлю в то время как из-за кастинга двойников к ints. Это может работать лучше вместо:

double x1 = point_class.point.x - center.x; 
double y1 = point_class.point.y - center.y; 

//APPLY ROTATION 
x1 = x1 * Math.cos(angle) - y1 * Math.sin(angle)); 
y1 = x1 * Math.sin(angle) + y1 * Math.cos(angle)); 

//TRANSLATE BACK 
point_class.point.x = (int)Math.ceil(x1) + center.x; 
point_class.point.y = (int)Math.ceil(y1) + center.y; 
+0

Не технику его подводит исправить –

+2

Ротацию часть этого кода является неправильным. Значение y1 обновляется на основе нового значения x1, а не начального. –

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