New features in JTS 1.11

JTS最近发布了1.11版本,新增了:

计算Delaunay三角网和Voronoi多边形:

import java.util.ArrayList;
import java.util.Collection;

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryCollection;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.triangulate.DelaunayTriangulationBuilder;
import com.vividsolutions.jts.triangulate.VoronoiDiagramBuilder;

/**
 *
 * @author Sun Ning/SNDA
 * @since 2010-3-3
 */

public class DelaunayAndVoronoiApp {

    /**
     * create some predefined sites
     * @return
     */

    public static Collection<coordinate> getPredefinedSites(){
        double[][] coords = {{100,27},{28, 50},{29, 40},{32, 90}, {12, 26}};
        ArrayList<coordinate> coordinates = new ArrayList<coordinate>(coords.length);

        for(int i=0; i<coords.length; i++){
            coordinates.add(new Coordinate(coords[i][0], coords[i][1]));
        }

        return coordinates;
    }

    /**
     *
     * @param coords
     * @return a geometry collection of triangulations
     */

    public static Geometry buildDelaunayTriangulation(Collection<coordinate> coords){
        DelaunayTriangulationBuilder builder = new DelaunayTriangulationBuilder();
        builder.setSites(coords);
        return builder.getTriangles(new GeometryFactory());
    }
    /**
     *
     * @param coords
     * @return a collection of polygons
     */

    public static Geometry buildVoronoiDiagram(Collection<coordinate> coords){
        VoronoiDiagramBuilder builder = new VoronoiDiagramBuilder();
        builder.setSites(coords);
        return builder.getDiagram(new GeometryFactory());
    }

    /**
     *
     * @param args
     */

    public static void main(String[] args){
        Collection<coordinate> coordinates = getPredefinedSites();

        /**
         * Delauny
         */

        GeometryCollection triangulations
                = (GeometryCollection)buildDelaunayTriangulation(coordinates);

        int total = triangulations.getNumGeometries();
        System.out.printf("Total triangulations: %d\n", total);
        for(int i=0; i<total; i++){
            Geometry g = triangulations.getGeometryN(i);
            Coordinate[] coords = g.getCoordinates();
            System.out.printf("Triangulation %d: ", i);
            for(Coordinate c : coords){
                System.out.printf("(%.3f, %.3f) ", c.x, c.y);
            }
            System.out.println();
        }

        /**
         * Voronoi
         */

        GeometryCollection diagram = (GeometryCollection)
                buildVoronoiDiagram(coordinates);
        int totalDia = diagram.getNumGeometries();
        for(int i=0; i<totalDia; i++){
            Geometry g = diagram.getGeometryN(i);
            Coordinate[] coords = g.getCoordinates();
            System.out.printf("Diagram %d: ", i);
            for(Coordinate c : coords){
                System.out.printf("(%.3f, %.3f) ", c.x, c.y);
            }
            System.out.println();
        }
    }

}

输出:

Total triangulations: 5
Triangulation 0: (32.000, 90.000) (12.000, 26.000) (28.000, 50.000) (32.000, 90.000)
Triangulation 1: (32.000, 90.000) (28.000, 50.000) (100.000, 27.000) (32.000, 90.000)
Triangulation 2: (100.000, 27.000) (28.000, 50.000) (29.000, 40.000) (100.000, 27.000)
Triangulation 3: (100.000, 27.000) (29.000, 40.000) (12.000, 26.000) (100.000, 27.000)
Triangulation 4: (12.000, 26.000) (29.000, 40.000) (28.000, 50.000) (12.000, 26.000)
Diagram 0: (-76.000, 88.625) (-76.000, 178.000) (176.713, 178.000) (72.699, 65.730) (-38.235, 76.824) (-76.000, 88.625)
Diagram 1: (-76.000, -62.000) (-76.000, 88.625) (-38.235, 76.824) (11.978, 43.348) (56.422, -10.619) (57.006, -62.000) (-76.000, -62.000)
Diagram 2: (11.978, 43.348) (-38.235, 76.824) (72.699, 65.730) (67.316, 48.882) (11.978, 43.348)
Diagram 3: (176.713, 178.000) (188.000, 178.000) (188.000, -62.000) (57.006, -62.000) (56.422, -10.619) (67.316, 48.882) (72.699, 65.730) (176.713, 178.000)
Diagram 4: (11.978, 43.348) (67.316, 48.882) (56.422, -10.619) (11.978, 43.348)

将Geometry对象转换成Shape对象,绘制在JPanel上:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.util.Collection;
import javax.swing.JFrame;
import javax.swing.JPanel;

import com.vividsolutions.jts.awt.ShapeWriter;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import java.util.Random;

/**
 *
 * @author Sun Ning/SNDA
 * @since 2010-3-3
 */

public class JTS2Awt {

    public static void showUI(final Shape... shape){
        JFrame jframe = new JFrame("JTS Geometry to AWT Shape");

        JPanel jp = new JPanel(){
            @Override
            public void paint(Graphics g){
                super.paint(g);
                Graphics2D g2d = (Graphics2D)g;
                if(shape != null){
                    for(Shape s: shape){
                        g2d.setColor(new Color(Color.HSBtoRGB(new Random().nextFloat(), 1f, 0.6f)));
                        g2d.draw(s);
                    }
                }
            }
        };
        jp.setPreferredSize(new Dimension(150, 150));



        jframe.getContentPane().add(jp);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jframe.pack();
        jframe.setVisible(true);
    }

    public static Shape toShape(Geometry geom){
        ShapeWriter writer = new ShapeWriter();
        return writer.toShape(geom);
    }

    public static void main(String[] args){
        Collection<coordinate> coords = DelaunayAndVoronoiApp.getPredefinedSites();
        Geometry geomT = DelaunayAndVoronoiApp.buildDelaunayTriangulation(coords);
        Geometry geomD = DelaunayAndVoronoiApp.buildVoronoiDiagram(coords);

        showUI(toShape(geomT), toShape(geomD));
    }

}

jts

封闭开发

从后天起,我就要被封闭开发了。地点在公司对面的酒店里,问具体的情况据老大说,是要去一个“有人给你做饭,有人给你洗衣服”的地方,说得跟人间天堂似的。去年刚到公司实习的时候就赶上有组封闭开发,印象中好像封了有一个多月。老实说封闭开发也是没办法的事情,我们这个菜场式的办公环境,一个人手上又有多个项目,不断地有人来找你问各种各样的事情,就算不问你,问你旁边的人,声音大到耳机挡不住,这种环境下怎么可能开发出有质量的产品。参考一下敏捷团队空间注意事项,那想想,封就封了吧。

这次项目到四月中旬截止,还不太清楚会是什么情况,能不能上网,每天要干多长时间,具体情况等我从小黑屋发来现场报道吧。