package com.ethon.tools;

import java.awt.Color;

import com.ethon.DataBase;
import com.ethon.mode.DataPoint;

public class CounterUtil {
	/**
	 * 给定两点的坐标，计算它们的距离的平方
	 * @param coord_X1：两点中第一点的坐标x
	 * @param coord_Y1：两点中第一点的坐标y
	 * @param coord_X2：两点中第二点的坐标x
	 * @param coord_Y2：两点中第二点的坐标y
	 * @return：两点之间的欧式距离
	 */
	public double getDistance2(double coord_X1, double coord_Y1, double coord_X2, double coord_Y2){
		double x=coord_X1-coord_X2;
		double y=coord_Y1-coord_Y2;
		
		return x*x+y*y;
	}
	
	/**
	 * 给定点（势源点和受影响点）的实际坐标以及势源点的权值，计算出势源点在受影响点出的势值
	 * @param coord_Source_X：势源点的坐标x
	 * @param coord_Source_Y：势源点的坐标y
	 * @param weight：势源点的权重
	 * @param coord_X：受影响点的坐标x
	 * @param coord_Y：受影响点的坐标y
	 * @param sigma：影响因子
	 * @return：势源点在受影响点出的势值
	 */
	public double getPotential(double coord_Source_X, double coord_Source_Y, double weight, double coord_X, double coord_Y, double sigma){
		double d=this.getDistance2(coord_Source_X, coord_Source_Y, coord_X, coord_Y);
		double exponent=d/Math.pow(sigma,2);
			
		return weight*Math.pow(Math.E, -exponent);
	}
	
	/**
	 * 计算由DataField.points组成的数据场中某一点的势值
	 * @param coord_X：数据场中某一点的坐标x
	 * @param coord_Y：数据场中某一点的坐标y
	 * @param sigma：影响因子
	 * @return：数据场中给定点的势值
	 */
	public double getPotential(double coord_X, double coord_Y, double sigma){
		double result=0;
		DataBase db=DataBase.getInstance();
		DataPoint[] dataPoints=db.getPoints();
		
		for(int i=0,len=dataPoints.length;i<len;i++){
			DataPoint p=dataPoints[i];
			result+=this.getPotential(p.getCoord_X(), p.getCoord_Y(), p.getWeight(), coord_X, coord_Y, sigma);
		}
		return result;
	}
	
	/**
	 * 将颜色由HLS空间转换为RGB空间
	 * @param H：颜色空间的色调
	 * @param L：颜色空间的亮度
	 * @param S：颜色空间的饱和度
	 * @return
	 */
	public static Color HLStoRGB(float H, float L, float S){
		if(H>1||H<0)	return null;
		if(S>1||S<0)	return null;
		
		float r=0,g=0,b=0;
		
		if(L<=0)	r=g=b=0;
		else if(L>=1)	r=g=b=1;
		else{
			float hh=(6*H)%6;
			int c1=(int) hh;
			float c2=hh-c1;
			float d=(L<=0.5f)?(S*L):(S*(1-L));
			float w=L+d;
			float x=L-d;
			float y=w-(w-x)*c2;
			float z=x+(w-x)*c2;
			switch(c1){
			case 0: r=w;g=z;b=x;break;
			case 1:	r=y;g=w;b=x;break;
			case 2:	r=x;g=w;b=z;break;
			case 3:	r=x;g=y;b=w;break;
			case 4:	r=z;g=x;b=w;break;
			case 5:	r=w;g=x;b=y;break;
			}
		}
		return new Color(r,g,b);
	}
}
