Java 重新绘制swingworker用于计算三角形和外圆的小程序
我正在尝试复制作为练习一部分找到的小程序。小程序使用Fortune的算法生成这两个函数;Voronoi图和Delaunay三角剖分。我只对在平面上生成Delaunay三角剖分感兴趣,因此将使用增量算法,即一次添加1个点。我打算显示添加采样点时在每个阶段生成的三角形 我正在使用SwingWorker类创建包含算法的Triangulate类的实例。我在for循环中调用triangulate方法,当单击GUI上的start按钮时,该循环将遍历样本点集 下面是代码:Java 重新绘制swingworker用于计算三角形和外圆的小程序,java,swing,graphics,computational-geometry,swingworker,Java,Swing,Graphics,Computational Geometry,Swingworker,我正在尝试复制作为练习一部分找到的小程序。小程序使用Fortune的算法生成这两个函数;Voronoi图和Delaunay三角剖分。我只对在平面上生成Delaunay三角剖分感兴趣,因此将使用增量算法,即一次添加1个点。我打算显示添加采样点时在每个阶段生成的三角形 我正在使用SwingWorker类创建包含算法的Triangulate类的实例。我在for循环中调用triangulate方法,当单击GUI上的start按钮时,该循环将遍历样本点集 下面是代码: JButton startButto
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();
}
});
JButton Start按钮=新的JButton(“开始”);
addActionListener(新ActionListener()){
已执行的公共无效行动(行动事件ae){
SwingWorker worker=新SwingWorker(){
@凌驾
受保护列表doInBackground()引发异常{
Triangulate dt=新的三角形(drawingPanel.pointsList());
dt.preTriangulate();//设置边界三角形并获得点的随机排列
List pointsList=dt.pointsList();
对于(int i=0;i
下面是三角剖分类,它计算一组点的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
}
}
公共类三角剖分{
私有列表点列表;
私人列表三角列表;
私有三角形边界三角形;
私人名单边缘主义者;
公共三角测量(列表点列表){
this.pointsList=pointsList;
this.triangleList=新的ArrayList();
this.edgeList=新的ArrayList();
}
公共列表三角形列表(){
返回三角形列表;
}
公共列表点列表(){
返回点列表;
}
公共无效预三语(){
boundingTriangle=getBoundingTriangle(点列表);
三角形列表。添加(边界三角形);
随机排列(点列表);
}
公共空心三角形化(平面点采样点){
//一个实现Bowyer-Watson算法的程序
//计算平面上一组点的DT。
}
公共空心删除三角形(列表三角形列表){
//从共享列表中删除所有三角形的过程
//具有边界三角形的边
}
私有三角形getBoundingTriangle(列表点列表){
//获取一组点的边界三角形
}
公共无效随机排列(列表点列表){
//获得一组点的随机排列
}
}
我还有3节课
- 不要使用
获取图形对象,因为图形对象obtgetGraphics()