您的位置:首页 > 其它

关于点聚合的一点学习

2016-10-15 22:15 218 查看
前段时间看到了点聚合的实现原理,http://wenku.baidu.com/link?url=452FtzWd6JfpBWog2jpnLHkaYrlVwlMYA1onW4J4omVaKg0k-68T9D5ONono0cwdsMBC1AFecOikR-7hs_FwMk7MmN8z1U9S7WU0CxKNQN7

抽空按照想法写了第一个方法:

基于网格的点聚合算法(Grid-based Clustering) 的算法,定义了

点类和矩形类,就此保存下来.
package com.lazy.sheep.point;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class GridBasedCluster {
public static void main(String[] args) {

//生成的点全都在矩形里面,没有考虑点在最大矩形外面的情况
int length = 100;//矩形的长度 使用正方形
int grids = 5;//划分的矩形格数 横坐标5段,纵坐标5段
Point originalPoint = new GridBasedCluster().new Point(0,0);//设置左上角的原点
int pointLength = 300;//随机点的个数
Point[] points = new Point[pointLength];
List<Rectangle> rectangles = genericRectangles(originalPoint,length,grids);//生成矩形
genericPoints( pointLength, points);//随机生成点
comparePoints(rectangles,points);//将点加入到各个矩形中
printArray( points);

}
public static List<Rectangle> genericRectangles(Point originalPoint,int length,int grids){
Point prePoint = null,curPoint = null;
int preLat = originalPoint.lat,preLng = originalPoint.lng
,curLat = 0,curLng = 0;
List<Rectangle> rectangles = new ArrayList<GridBasedCluster.Rectangle>();
for(int i=1;i<=grids;i++){//代表横坐标循环
preLat = length/grids*(i-1);
curLat = length/grids*i;
for(int j=1;j<=grids;j++){//代表纵坐标循环
preLng = length/grids*(j-1);
curLng = length/grids*j;
prePoint = new GridBasedCluster().new Point(preLat,preLng);
curPoint = new GridBasedCluster().new Point(curLat, curLng);
Rectangle rectangle = new GridBasedCluster().new Rectangle();
rectangle.leftUpPoint = prePoint;
rectangle.rightDownpoint = curPoint;
rectangle.createCenetrPoint();
rectangles.add(rectangle);
}
}

return rectangles;
}
public static void genericPoints(int pointLength,Point[] points){
for(int i=0;i<pointLength;i++){
int lat = (int)(1+Math.random()*99);
int lng = (int)(1+Math.random()*99);
Point point = new GridBasedCluster().new Point(lat,lng);
points[i] = point;
}
}
public static void comparePoints(List<Rectangle> rectangles,Point[] points){
for(int i=0;i<points.length;i++){
for(int j=0;j<rectangles.size();j++){
boolean bool = isIn( points[i], rectangles.get(j));
if(bool==true){
rectangles.get(j).points.add(points[i]);
break;
}
}
}
}
public static boolean isIn(Point point,Rectangle rectangle){
Point leftUpPoint = rectangle.leftUpPoint;
Point rightDownpoint = rectangle.rightDownpoint;
if(point.lat<=leftUpPoint.lat || point.lng<=leftUpPoint.lng
|| point.lat>rightDownpoint.lat || point.lng>rightDownpoint.lng){
return false;
}
return true;
}
public static void printArray(Object[] points){
String list = Arrays.deepToString(points);
System.out.println(list);
}
class Rectangle{
Point leftUpPoint;
Point rightDownpoint;
Point centerPoint;
List<Point> points = new ArrayList<GridBasedCluster.Point>();
@Override
public String toString() {
return "Rectangle["+leftUpPoint+" "+rightDownpoint+
"],centerPoint["+centerPoint+"],inSize:["+points.size()+"]";
}
public void createCenetrPoint(){
int lat = (rightDownpoint.lat-leftUpPoint.lat)/2+leftUpPoint.lat;
int lng = (rightDownpoint.lng-leftUpPoint.lng)/2+leftUpPoint.lng;
centerPoint = new Point(lat, lng);
}
}
class Point{
Integer lat;
Integer lng;
@Override
public String toString() {
return "Point("+lat+","+lng+")";
}
public Point(int lat,int lng) {
this.lat=lat;
this.lng=lng;
}
}
}


以后有时间写后面的试试.

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 网格