因此,目前我正在尝试对不同阶数的贝塞尔曲线及其构成的中点进行动画处理,但是对于Java图形我还是很陌生。我了解绘画和重新绘画的工作原理,但是我不知道如何摆脱这种情况。
贝塞尔曲线点由用户单击此处确定,然后在mouseEvent处调用repaint()。
public void paint(Graphics g) {
initgr();
int left = iX(-rWidth / 2), right = iX(rWidth / 2), bottom = iY(-rHeight / 2), top = iY(rHeight / 2);
g.drawRect(left, top, right - left, bottom - top);
for (int i = 0; i < np; i++) {
// Show tiny rectangle around point:
g.drawRect(iX(P[i].x) - 2, iY(P[i].y) - 2, 4, 4);
if (i > 0)
// Draw line P[i-1]P[i]:
g.drawLine(iX(P[i - 1].x), iY(P[i - 1].y), iX(P[i].x),
iY(P[i].y));
}
if (np == 2 && order == 1)
bezier1(g, P, gran);
if (np == 3 && order == 2)
bezier2(g, P, gran);
if (np == 4 && order == 3)
bezier3(g, P, gran);
if (np == 5 && order == 4)
bezier4(g, P, gran);
if (np == 6 && order == 5)
bezier5(g, P, gran);
}
底部调用的函数将转到此处计算和绘制的贝塞尔曲线。
void bezier3(Graphics g, Point2D[] p, int n) {
javax.swing.Timer timer = new javax.swing.Timer(100,
new TimerListener());
timer.setDelay(39);
timer.start();
float dt = 1.0F / n, cx3 = -p[0].x + 3 * (p[1].x - p[2].x) + p[3].x, cy3 = -p[0].y
+ 3 * (p[1].y - p[2].y) + p[3].y, cx2 = 3 * (p[0].x - 2
* p[1].x + p[2].x), cy2 = 3 * (p[0].y - 2 * p[1].y + p[2].y), cx1 = 3 * (p[1].x - p[0].x), cy1 = 3 * (p[1].y - p[0].y), cx0 = p[0].x, cy0 = p[0].y, x = p[0].x, y = p[0].y, x0, y0, x2, y2;
for (int i = 1; i <= n; i++) {
float t = i * dt;
x0 = x;
y0 = y;
x = ((cx3 * t + cx2) * t + cx1) * t + cx0;
y = ((cy3 * t + cy2) * t + cy1) * t + cy0;
// x2 = ((cx3 * (.5F*t) + cx2) * (.5F*t) + cx1) * (.5F*t) + cx0;
// y2 = ((cy3 * (.5F*t) + cy2) * (.5F*t) + cy1) * (.5F*t) + cy0;
x2 = p[1].x * t;
y2 = p[1].y * t;
Point2D A = tcalc(P[0], P[1], t), B = tcalc(P[2], P[3], t), C = tcalc(
P[1], P[2], t), A1 = tcalc(A, C, t), B1 = tcalc(C, B, t);
g.setColor(Color.red);
g.drawLine(iX(x0), iY(y0), iX(x), iY(y));
// paint(g);
g.setColor(Color.green);
g.drawLine(iX(A.x), iY(A.y), iX(C.x), iY(C.y));
g.drawLine(iX(C.x), iY(C.y), iX(B.x), iY(B.y));
g.setColor(Color.blue);
g.drawLine(iX(A1.x), iY(A1.y), iX(B1.x), iY(B1.y));
}
}
所以我知道我不应该在这些方法中画图,而应该在绘画中。但是,我不确定其中有5个功能如何使用,如果我更改另一种方法来更新,就永远不会擦除用户要移至下一个时单击的点。选择点。您可以看到我尝试添加一个基本的摆动计时器,但是我不确定在这种情况下动画是否可以正常工作。
有什么方法可以使它在bezier函数中起作用?我只是看不到如何画出轮廓线。我的5阶有11个中点在不断地计算。显然,我对Java图形这一部分的理解充其量是不稳定的,因此,朝着正确方向的任何一点都将不胜感激。如果我在研究中发现任何问题,将更新问题。
谢谢你的帮助。
最佳答案
忘了计时器。尝试paintComponent。
面向对象将有助于保持概览,简化变量的数量。
使用paint(Graphics){}和onMouse(MouseEvent){}创建基类Bezier。
派生Bezier1,〜2,〜3等。
并且具有变量Bezier bezier2 = new Bezier2(); ...
并在您的paintCompont中调用bezier2.paint(g)。
然后在鼠标处理中尝试repaint(10L)左右。实验学习(paintImmediate等)。