2011-02-15 4 views
0

두 개의 Point 오브젝트 사이에 선을 그리는 가장 간단한 방법은 그 선을 실시간으로 그리는 것처럼 보입니까? 예를 들어두 개의 Point 오브젝트 사이에서 선 애니메이션하기

:

Point a = new Point(5,20); 
Point b = new Point(15,20); 

은 어떻게 "이동"라인이 점을 연결합니까?

다른 말로하면 사용자가 일종의 "동작"을 느끼게하고 싶습니다. 그렇게 할 수있는 간단한 방법이 있습니까?

+1

사람이 Java로 철자를 쓰는 90 년대 중반의 또 다른 시간 왜곡은 –

답변

2

Chinmay Kanchi의 대답에 이어 애니메이션 느낌을 만들어야합니다. 위에서 Uhlen이 언급 한 것처럼 EDT에서 작업 할 때는 Swing 's Timer를 사용해야합니다. 타이머를 사용하는 방법에 대한 예제를 제공합니다. 패널이 있다고 가정하고 예를 들어 패널을 열면 버튼을 클릭하므로 크기를 늘려 슬라이딩을 활성화해야합니다. 아래는 타이머를 사용하여 작업을 수행하는 방법을 보여주는 예제입니다.

this.extendingTimer = new Timer(0, new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     //assume sliding is vertical  
     int value = maximumHeight; 
     //make sure the size will not be bigger then allowed maximum 
     if(currentExtensionSize + extensionRate >= value) 
     { 
      currentExtensionSize = value; 
      stopExtending(); 
     } 
     else 
      currentExtensionSize += extensionRate; 
     setSize(new Dimension(maximumWidth, currentExtensionSize)); 
    } 
}); 
extendingTimer.setInitialDelay(0); 
extendingTimer.setDelay(100); 
extendingTimer.setRepeats(true); 
+0

답장을 보내 주셔서 감사합니다. 욕심쟁이이거나 다른 것을 의미하지는 않지만 Graphics2D 클래스를 사용하여 점차 Ellipse2D 객체에 색을 채우려 할 때 어떻게해야하는지에 대한 단서를 줄 수 있습니까? – kstratis

+1

이것은 약간 다른 문제입니다. 타원 안쪽의 모든 점과 애니메이션의 방향을 결정해야합니다. 불평등'x^2/a^2 + y^2/b^2 <1'을 만족하는 모든 점을 찾아 채우려는 방식에 따라 점/선을 그려야합니다. 더 자세한 내용이 필요하면 다른 질문으로 질문하십시오. –

+0

고마워요.하지만 너무 복잡해지고 있어요! 내 앱에서 두 가지 효과가 필요했지만 스윙을 할 때 가장 힘들지 않은 움직임을 찾지 못했습니다. 타이머 클래스는 인수로 메서드를 호출하는 것을 "허용"하지 않기 때문에 매우 불편합니다. – kstratis

3

두 점이 주어지면이를 연결하는 선의 등식을 결정할 수 있습니다. 선의 방정식은 y = mx + c의 형식입니다. 여기서 m은 기울기이고 c는 y 절편입니다.

따라서 두 점 (5,20)과 (15,20)가 주어지면 먼저 m을 결정합니다. 직선의 방정식에 대입

m = (y2-y1)/(x2-x1) 
    = (20-20)/(15-5) 
    = (0)/10 
    = 0 

, 우리는 y = 0x + c 또는 y = c 얻을. 이제 우리는 이것을 알고 y = c와 5 < = x < = 15 인 점을 알아야합니다. 각각의 점을 그리기 사이에 Thread.sleep() 콜을 사용하여 정상적인 방법으로이 점들 각각을 그립니다 (정확한 방법은 this을보십시오). 이 경우에는 11 포인트 밖에 그리지 않으므로 100ms마다 1 포인트를 그리는 것이 좋습니다. Thread.sleep()에 대한 자세한 내용은 here을 참조하십시오.

EDIT : Thread.sleep()은 EDT에서 작동하지 않으므로 대신 Uhlen이 제안한대로 javax.swing.Timer을 확인하십시오.

+3

스레드 # 수면은 EDT에서 작동하지 않습니다. javax.swing.Timer를 사용하면 ... – Uhlen

+0

사용 방법에 대한 힌트를 줄 수 있습니까? 그런데 – kstratis

+0

... EDT는 무엇입니까 ?? – kstratis

0
int lineCount = 0; //global 
// timer calls the below 

xLocation = (*a)[a->size()-1] * timeSoFar/duration ; 
    if(xLocation > (*a)[lineCount+1]){ 
     lineCount++;   
    } 
    double m = ((*b)[lineCount+1] - (*b)[lineCount])/((*a)[lineCount+1]-(*a)[lineCount]); 
    double yIntercept = (*b)[lineCount]-m*(*a)[lineCount]; 
    yLocation = m * xLocation + yIntercept; 
    xLocation = (yLocation - yIntercept)/m; 

이 C에 ++ 및 벡터하지만 우리가 원하는 그 이론을 사용. 이것은 하나의 라인이 아닌 여러 줄을 허용합니다.

관련 문제