道格拉斯算法 java_道格拉斯-普克算法的java的实现代码如下

展开全部

packagecom.mapbar.jts;

/***ClassPoint.java*/

publicclassPoint

{

/***点的X坐标*/privatedoublex=0;

/***点的Y坐标*/privatedoubley=0;

/***点所属的曲线的索引*/privateintindex=0;

publicdoublegetX() {returnx;}

publicvoidsetX(doublex) {this.x=x;}

publicdoublegetY() {returny;}

publicvoidsetY(doubley) {this.y=y;}

publicintgetIndex() {returnindex;}

publicvoidsetIndex(intindex) {this.index=index;}

/***点数据的构造e69da5e887aa3231313335323631343130323136353331333361303563方法**

@paramx*点的X坐标*@paramy*点的Y坐标*@paramindex点所属的曲线的索引*/

publicPoint(doublex,doubley,intindex)

{this.x=x;this.y=y;this.index=index;}

}

packagecom.mapbar.jts;

importjava.util.ArrayList;

importjava.util.List;

importcom.vividsolutions.jts.geom.Coordinate;

importcom.vividsolutions.jts.geom.Geometry;

importcom.vividsolutions.jts.io.ParseException;

importcom.vividsolutions.jts.io.WKTReader;

/***ClassDouglas.java*/

publicclassDouglas

{

/***存储采样点数据的链表*/

publicListpoints=newArrayList();

/***控制数据压缩精度的极差*/

privatestaticfinaldoubleD=1;

privateWKTReaderreader;

/***构造Geometry**@paramstr*@return*/

publicGeometrybuildGeo(Stringstr)

{

try

{

if(reader==null) {reader=newWKTReader();}

returnreader.read(str);

}

catch(ParseExceptione) {thrownewRuntimeException(buildGeometryError,e);}

}

/***读取采样点*/

publicvoidreadPoint()

{

Geometryg=buildGeo(LINESTRING(14,23,42,66,77,86,95,1010));

Coordinate[]coords=g.getCoordinates();

for(inti = 0;i < coords.length; i++)

{Pointp=newPoint(coords[i].x,coords[i].y,i);points.add(p);}

}

/***对矢量曲线进行压缩**@paramfrom*曲线的起始点*@paramto*曲线的终止点*/

publicvoidcompress(Pointfrom,Pointto)

{

/***压缩算法的开关量*/booleanswitchvalue=false;

/***由起始点和终止点构成的直线方程一般式的系数*/

System.out.println(from.getY());

System.out.println(to.getY());

doubleA=(from.getY()-to.getY())/Math.sqrt(Math.pow((from.getY()-to.getY()),2)+Math.pow((from.getX()-to.getX()),2));

/***由起始点和终止点构成的直线方程一般式的系数*/

doubleB=(to.getX()-from.getX())/Math.sqrt(Math.pow((from.getY()-to.getY()),2)+Math.pow((from.getX()-to.getX()),2));

/***由起始点和终止点构成的直线方程一般式的系数*/doubleC=(from.getX()*to.getY()-to.getX()*from.getY())/Math.sqrt(Math.pow((from.getY()-to.getY()),2)+Math.pow((from.getX()-to.getX()),2));

doubled=0;

doubledmax=0;

intm=points.indexOf(from);

intn=points.indexOf(to);

if(n == m+1) return;

Pointmiddle=null;

Listdistance=newArrayList();

for(inti = m+1;i < n;++)

{

d=Math.abs(A*(points.get(i).getX())+B*(points.get(i).getY())+C)/Math.sqrt(Math.pow(A,2)+Math.pow(B,2));

distance.add(d);

}

dmax=distance.get(0);

for(intj = 1;j < distance.size();j++)

{

if(distance.get(j) > dmax) dmax=distance.get(j);

}

if(dmax>D) switchvalue=true;

else switchvalue=false;

if(!switchvalue)

{

//删除Points(m,n)内的坐标

for(inti = m+1;i < n;i++)

points.get(i).setIndex(-1);

}

else

{

for(inti = m+1;i < n;i++)

{

if((Math.abs(A*(points.get(i).getX())+B*(points.get(i).getY())+C)/Math.sqrt(Math.pow(A,2)+Math.pow(B,2))==dmax))

middle=points.get(i);

}

compress(from,middle);

compress(middle,to);

}

}

publicstaticvoidmain(String[]args)

{

Douglasd=newDouglas();

d.readPoint();

d.compress(d.points.get(0),d.points.get(d.points.size()-1));

for(inti = 0;i < d.points.size();i++)

{

Pointp=d.points.get(i);

if(p.getIndex()>-1){System.out.print(p.getX()++p.getY()+,);}}

}

}

c946902038310f4c962d7d0da6d2b6fd.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值