在某种方式中在两个Point对象之间绘制直线的最简单方法是什么 看起来我手工实时绘制那条线?
例如:
Point a = new Point(5,20);
Point b = new Point(15,20);
如何将这些点与“移动”线连接?
换句话说,我想让用户感受某种“动作”。有没有一种简单的方法可以做到这一点?
答案 0 :(得分: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的点。只需以正常方式绘制每个点(在this处查看确切的方法),并在绘制每个点之间调用Thread.sleep()
。在这种情况下,您只有11个点可以绘制,因此每100毫秒绘制1个点是有意义的。有关Thread.sleep()
的详细信息,请参阅here。
编辑:由于Thread.sleep()
无法在EDT上发挥作用,请转而考虑javax.swing.Timer,正如Uhlen建议的那样。
答案 1 :(得分:2)
根据Chinmay Kanchi的回答,你需要创造一种动画的感觉。如上所述,在Uhlen的评论中,你应该在使用EDT时使用Swing的Timer。举例说明如何使用Timer。让我们假设我们有一个面板,我们希望它在例如按钮单击,因此我们需要通过增加其大小来滑动打开它的动画。下面是一个示例,显示了如何使用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);
答案 2 :(得分: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 ++和使用向量,但它是我们想要的理论。这允许多行而不仅仅是一行。