我有一个二维点列表。

例如:

x = c(4,3,3,5,6,6,4)



y = c(5,3,1,0,1,3,5)

这些二维点的图是

我想为这个点集画一个包装:

注意,边界(包装器)与最近点之间的垂直距离为2个单位。

请注意,:我有许多点集,例如上面的点集。我想为所有布景做同样的事情。

我想要这个边界多边形。任何人都可以建议我该怎么做。

Janak,任何想法都非常感谢。

最佳答案

使用Java,这变得非常简单。该程序通过绘制结果来演示结果。也可以通过迭代area.getPathIterator(at)来获得轮廓,该ojit_code将一一返回所有点。

import java.awt.*;
import java.awt.geom.*;
import java.util.*;

public class PointSet {
public static final int W = 2;
Area area = new Area();

public void add( double x, double y ){
    area.add( new Area( new Rectangle2D.Double( x-W, y-W,2*W, 2*W ) ) );
}
public void plot(){
    Board board = new Board();
    board.go( area );
}
public static void main( String[] args ){
    PointSet ps = new PointSet();
    ps.add( 4, 5);
    ps.add( 3, 3);
    ps.add( 3, 1);
    ps.add( 5, 0);
    ps.add( 6, 1);
    ps.add( 6, 3);
    ps.plot();
}
}

和:
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import java.util.*;
public class Board extends JPanel {
Area area;
void go( Area area ) {
    this.area = area;
    JFrame frame = new JFrame("Circle Test");
    frame.getContentPane().add(this);
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    repaint();
    frame.setPreferredSize(new Dimension(800,800));
    frame.pack();
    frame.setVisible(true);
}

public void paintComponent(Graphics g) {
  AffineTransform at = new AffineTransform();
  at.translate( 100, 100 );
  at.scale( 50, 50 );
  PathIterator pit = area.getPathIterator( at );
  Path2D path = new Path2D.Double();
  path.append( pit, true );
  Graphics2D g2d = (Graphics2D)g;
  g2d.draw( path );
}
}

10-08 08:33