<%@ page contentType="image/jpeg; charset=gb2312" %>
<%@ page import="com.mysql.jdbc.Driver" %>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*"%>
<%@ page import="java.awt.*"%>
<%@ page import="java.awt.image.*"%>
<%@ page import="com.sun.image.codec.jpeg.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> DBSCAN算法实现 </TITLE>
<META NAME="Author" CONTENT="方泽明@hubu.edu.cn">
<META NAME="Keywords" CONTENT="dbscan算法">
<META NAME="Description" CONTENT="本程序将实现dbscan算法.该算法依次考察每个对象在半径e内的对象的个数,并将数目大于最少数目MinPts的对象称为核心对象,将核心对象半径e内的所有对象作为一个簇.">
</HEAD>
<BODY>
<% //定义全局变量
String Pronum=request.getParameter("MaxPronum"); //记录的属性个数
String Objnum=request.getParameter("MaxObjnum"); //记录的个数
String stre=request.getParameter("e"); //半径的大小
String strMinPts=request.getParameter("MinPts");
Integer MaxPronum=Integer.parseInt(Pronum);
Integer MaxObjnum=Integer.parseInt(Objnum);
Integer e=Integer.parseInt(stre);
Integer MinPts=Integer.parseInt(strMinPts);
%>
<%
//连接数据库
String driverName="com.mysql.jdbc.Driver";//驱动程序名
String userName="fangzm"; //数据库用户名
String userPasswd="fang"; //密码
String dbName="transaction"; //数据库名
String tableName="dbscan"; //表名
String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&password="+userPasswd;
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection connection=DriverManager.getConnection(url);
Statement statement = connection.createStatement();
//获得数据结果集
String sql="SELECT * FROM "+tableName;
ResultSet rs = statement.executeQuery(sql);
int []kind=new int[MaxObjnum+1]; //标记每一个记录是否是核心对象(值与下标相等),是否已被处理(初始值为0,否则值为所属类别编号)
int color=0;//簇的个数,每个簇对应一种颜色
int []colorkind=new int[MaxObjnum+1];
for(int i=0;i<=MaxObjnum;i++)
kind[i]=0;
for(int i=1;i<=MaxObjnum;i++)
{
if(kind[i]==0)
{
int []recond=new int[MaxPronum]; //当前记录的属性值
int []temp=new int[MaxPronum]; //临时存入用于计算的记录的属性值
int near=0; //当前记录半径e内的记录数目
int []nearid=new int[MaxObjnum]; //当前记录半径e内的记录id
rs.absolute(i);
for(int j=0;j<MaxPronum;j++)
recond[j]=rs.getInt(j+2);
rs.beforeFirst(); //扫描数据库;
while(rs.next())
{
if(kind[rs.getInt(1)]==0) //只考虑未处理过的记录
{
for(int j=0;j<MaxPronum;j++)
temp[j]=rs.getInt(j+2);
int E=0;
for(int j=0;j<MaxPronum;j++) //计算两个记录之前的距离的平方
E+=Math.pow(recond[j]-temp[j],MaxPronum);
if(E<Math.pow(e,MaxPronum))
nearid[near++]=rs.getInt(1);
}
}
if(near>=MinPts) //若为核心对象
{
int j=0;
color++;
while(nearid[j]!=0)
{
kind[nearid[j]]=i;
colorkind[nearid[j]]=color;
j++;
}
}
}
}
// Create image
int width=800, height=800;
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
// Get drawing context
Graphics g = image.getGraphics();
// Fill background
g.setColor(Color.white);
g.fillRect(0, 0, width, height);
for(int i=1;i<=MaxObjnum;i++)
{
rs.absolute(i);
int []recond=new int[2];
for(int j=0;j<2;j++)
recond[j]=rs.getInt(j+2)*10;
if(kind[i]==i)
{
g.setColor(Color.red);
g.drawRect(recond[0]-5,recond[1]-5,10,10);
g.fillRect(recond[0]-5,recond[1]-5,10,10);
g.drawOval(recond[0]-e*10,recond[1]-e*10,e*20,e*20);
}
else
{
if(colorkind[i]==1)
g.setColor(Color.black);
else if(colorkind[i]==2)
g.setColor(Color.blue);
else if(colorkind[i]==3)
g.setColor(Color.cyan);
else if(colorkind[i]==4)
g.setColor(Color.gray);
else if(colorkind[i]==5)
g.setColor(Color.green);
else if(colorkind[i]==6)
g.setColor(Color.magenta);
else if(colorkind[i]==7)
g.setColor(Color.pink);
else g.setColor(Color.yellow);
g.drawRect(recond[0]-5,recond[1]-5,10,10);
g.fillRect(recond[0]-5,recond[1]-5,10,10);
}
}
// Dispose context
g.dispose();
// Send back image
ServletOutputStream sos = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(sos);
encoder.encode(image);
rs.close();
statement.close();
connection.close();
%>
</BODY>
</HTML>
评论4