Swing/MotionPathAnimation のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/MotionPathAnimation へ行く。
- 1 (2020-12-28 (月) 04:03:34)
- 2 (2023-06-29 (木) 15:33:53)
- category: swing folder: MotionPathAnimation title: Shapeから取得したPathIteratorに沿って図形を移動する tags: [Shape, PathIterator, JPanel, Timer] author: aterai pubdate: 2020-12-28T04:02:15+09:00 description: Shapeから取得したPathIteratorに沿って図形が移動するアニメーションをJPanel上に描画します。 image: https://drive.google.com/uc?id=1FHbqO5DwZfRAJS-R59DCLdU78ZxM7W1U
概要
Shape
から取得したPathIterator
に沿って図形が移動するアニメーションをJPanel
上に描画します。
Screenshot
Advertisement
サンプルコード
PathIterator pi = shape.getPathIterator(null, .01);
Point2D prev = new Point2D.Double();
double delta = .02;
double threshold = 2d;
double[] coords = new double[6];
while (!pi.isDone()) {
int segment = pi.currentSegment(coords);
Point2D current = createPoint(coords[0], coords[1]);
if (segment == PathIterator.SEG_MOVETO) {
points.add(current);
prev.setLocation(current);
} else if (segment == PathIterator.SEG_LINETO) {
double distance = prev.distance(current);
double fraction = delta;
if (distance > threshold) {
Point2D p = interpolate(prev, current, fraction);
while (distance > prev.distance(p)) {
points.add(p);
fraction += delta;
p = interpolate(prev, current, fraction);
}
} else {
points.add(current);
}
prev.setLocation(current);
}
pi.next();
}
View in GitHub: Java, Kotlin解説
Shape#getPathIterator(...)
でShape
の輪郭線を平坦化されたパスセグメントとして取得しArrayList
にPoint2D
として保存- 輪郭線が指定の長さ以上の直線になる場合は適当な長さで自前で分割して
ArrayList
に追加 JPanel
の中央にShape
とそのShape
から生成した輪郭線上の点を黒い円として描画- パスに沿った図形のアニメーションは、
ArrayList
からTimer
で更新したインデックスの位置にある座標Point2D
をひとつ取り出して赤い円としてJPanel
に描画
参考リンク
- FlatteningPathIteratorでShape上の点を取得する
- swing - Moving Objects along an arc path with java graphics - Stack Overflow