关于点聚合的一点学习

前段时间看到了点聚合的实现原理,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;
		}
	}
}

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

  

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值