Shapeから取得したPathIteratorに沿って図形を移動する
Total: 1701
, Today: 1
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
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