2014-10-14 3 views
0

У меня есть три очка, p1 (начало), p2 (конец) и pos (текущее положение объекта) и метод, который запускает каждый кадр, внутри которого мне нужно переместить объект между точками p1 и p2.Перемещение объекта между двумя точками

Мне просто нужно, чтобы переместить объект вдоль прямой линии между точками

+2

И что проблема? Покажите нам свой код. – Crozin

+0

проливная линия y = mx + c. Вы можете найти m, а затем увеличить x ++. y будет увеличиваться согласно уравнению –

+0

@Crozin В этом проблема. Я сосать по математике и пока еще не имеет кода для этого бита – TheScottymo

ответ

1
уравнение

пролива линии составляет y=mx+c .when вам нужно переместить объект между 2 точками, уравнение можно упростить y=mx, так что вы можете найти м с помощью 2 points.and у зависит от й и equation.look на этой картине

enter image description here

попытаться изменить x1,y1 and x2,y2 и увидеть его перемещение через эту прямую линию. после того, как я просто напишу класс, чтобы вы могли легко запустить его.

public class AnimationJPanel extends JPanel { 
    //edit x1,y1 is starting point x2,y2 is end point 
    int x1=0; 
    int y1=0; 
    int x2=100; 
    int y2=100; 
    // 
    int x=x1; 
    int y; 
    int r=6; 

    int m=(y2-y1)/(x2-x1); 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       AnimationJPanel panel = new AnimationJPanel(); 
       panel.setPreferredSize(new Dimension(400, 300)); 
       panel.animate(); 
       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       frame.getContentPane().add(panel); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
private Timer timer; 

    public AnimationJPanel() { 
     setBackground(Color.BLACK); 
     setForeground(Color.RED); 
     setOpaque(true); 
    } 

    public void animate() { 
     timer = new Timer(15, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if(x>=x2){ 
        timer.stop();//stop when pass the end point 
       } 
       x++; 
       y = m * x; 
       System.out.println("x" + x + " y" + y); 
       repaint(); 
      } 
     }); 
     timer.start(); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawOval(x, y, r, r); 
    } 
} 
0

линейная интерполяция, любая точка на линии между А и В, для значения double k (между 0 и 1):

Point p = B + (A-B)*k; 

просто цикл по for (double k=0; k<=1; k+= deltaK)

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