アプレットを複製しようとしていますが、練習の一部としてhereが見つかりました。アプレットはFortuneのアルゴリズムを使用して両方を生成しています。 VoronoiダイアグラムとDelaunay三角測量。私は飛行機内でDelaunay三角測量を生成することに興味があり、増分アルゴリズムを使用することになります。つまり、一度に1ポイントを追加することです。サンプルポイントが追加されるたびに、生成される三角形を表示するつもりです。三角形や円を計算するために使用されるスイングワーカーからアプレットを再描画する
私はSwingWorkerクラスを使用して、アルゴリズムを含むTriangulateクラスのインスタンスを作成しています。私はGUIのスタートボタンがクリックされたときにサンプルポイントのセットを反復するforループの中で三角形メソッドを呼び出しています。ここで
はそのためのコードです:ここで
JButton startButton = new JButton("Start");
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
SwingWorker<List<Triangle>, Triangle> worker = new SwingWorker<List<Triangle>, Triangle>() {
@Override
protected List<Triangle> doInBackground() throws Exception {
Triangulate dt = new Triangulate(drawingPanel.pointsList());
dt.preTriangulate(); //Set-up a bounding triangle and obtain a random permutation of the points
List<PlanarPoint> pointsList = dt.pointsList();
for (int i = 0; i < pointsList.size(); i++) {
PlanarPoint sample = pointsList.get(i);
dt.triangulate(sample);
List<Triangle> list = dt.trianglesList(); //Obtaining the list of triangles at every stage. Good Idea??
for (int j = 0; j < list.size(); j++) {
publish(list.get(j));
}
Thread.sleep(500);
}
dt.removeTriangles(dt.trianglesList()); // Remove all the triangles containing bounding-triangle vertices
return dt.trianglesList();
}
protected void process(List<Triangle> triangles) {
for (Triangle triangle : triangles) {
g = drawingPanel.getGraphics();
PlanarPoint p1 = triangle.getVertex1();
PlanarPoint p2 = triangle.getVertex2();
PlanarPoint p3 = triangle.getVertex3();
g.drawLine((int) Math.ceil(p1.x), (int) Math.ceil(p1.y),
(int) Math.ceil(p2.x), (int) Math.ceil(p2.y));
g.drawLine((int) Math.ceil(p2.x),(int) Math.ceil(p2.y),
(int) Math.ceil(p3.x),(int) Math.ceil(p3.y));
g.drawLine((int) Math.ceil(p3.x),(int) Math.ceil(p3.y),
(int) Math.ceil(p1.x),(int) Math.ceil(p1.y));
}
}
};
worker.execute();
}
});
は点の集合のDelanuay三角測量を計算三角測量クラスです:
public class Triangulate {
private List<PlanarPoint> pointsList;
private List<Triangle> triangleList;
private Triangle boundingTriangle;
private List<Edge> edgeList;
public Triangulate(List<PlanarPoint> pointsList) {
this.pointsList = pointsList;
this.triangleList = new ArrayList<Triangle>();
this.edgeList = new ArrayList<Edge>();
}
public List<Triangle> trianglesList() {
return triangleList;
}
public List<PlanarPoint> pointsList() {
return pointsList;
}
public void preTriangulate() {
boundingTriangle = getBoundingTriangle(pointsList);
triangleList.add(boundingTriangle);
randomPermutation(pointsList);
}
public void triangulate(PlanarPoint samplePoint) {
// A procedure implementing the Bowyer - Watson algorithm
// to calculate the DT of a set of points in a plane.
}
public void removeTriangles(List<Triangle> trianglesList) {
// A procedure to remove all triangles from the list sharing
// edges with the bounding-triangle
}
private Triangle getBoundingTriangle(List<PlanarPoint> pointsList) {
//Obtains a bounding-triangle for a set of points
}
public void randomPermutation(List<PlanarPoint> pointsList) {
//Obtains a random permutation of a set of points
}
}
私は3つの他のクラス
-
を持っています
- PlanarPoint - y座標のソートを提供するためにComparableを実装するPoint2D.Doubleのサブクラス
- Triangle - 三角形の円と円の半径を決定し、点が三角形の外接円の内側にあるかどうかを決定するクラス
- Edge - Edgeを2つのPlanarPointをそのクラスとするクラスエンドポイント。
DrawingPanel - クリックイベントでポイントが追加され、画面上に描画されるサーフェスとして機能するクラスです。
は今、ここに私は
- を持っているいくつかの懸念がある点の集合を反復して、三角測量のクラスの関数を呼び出すことにより、三角形と、おそらくcircum-円を表示する良い方法はあります既存の円サークルと三角形を取得する
- 上記のコードスニペットでは、JApplet/JFrameを継承するクラスにペイントするので、ウィンドウのサイズが変更されるたびに描画された三角形が描画されるため、すべての図面をDrawingPanelクラスに制限する必要があります失われている?私が従うことができるデザインパターンはありますか?
- ポイントの集合のDTを計算する時間が時間のかかる作業であるという事実を除いて、SwingWorkerを使用して別のスレッドがここで正当化されますか?私は、任意の詳細を見逃している場合は
、私は
おかげで、 Chaitanya
*「アプレットを再描画する」* BTW - 経験豊富なアプレット開発者として、ポイントとヒントを提供します。要点は、私がアプレットで新しい機能をテストすることは決してありません。アプレットを実行可能にするのは難しいですが、開発中にフレーム内のアプレットの要点を設計し、その作業UIをアプレットに最後の瞬間に転送する方が迅速です。これは多くの場合、コードの一行しか必要としない、結合されたアプレット/アプリケーションハイブリッドを開発することによって達成される。 –
ハイブリッド、より簡単な[アニメーション](http://sites.google.com/site/drjohnbmatthews/subway)を参照してください。 – trashgod
@ AndrewThompson、チップのおかげで。私はアプレットを実行可能にするのに問題がありました。 – chaitanya