java实现凸包算法_JAVA语言中实现凸包算法

源码一:JarvisMarch.java

package mtn.uis.xaltin.convex;

import static java.lang.Math.abs;

import java.util.Iterator;

import java.util.LinkedList;

import java.util.List;

public class JarvisMarch {

private int count;

public int getCount() {

return count;

}

public void setCount(int count) {

this.count = count;

}

private static int MAX_ANGLE = 4;

private double currentMinAngle = 0;

private List hullPointList;

private List indexList;

private PointFactory pf;

private Point[] ps;

public Point[] getPs() {

return ps;

}

private int firstIndex;

public int getFirstIndex() {

return firstIndex;

}

public JarvisMarch() {

this(10);

}

public JarvisMarch(int count) {

pf = PointFactory.getInstance(count);

initialize();

}

public JarvisMarch(int[] x, int[] y) {

pf = PointFactory.getInstance(x, y);

initialize();

}

private void initialize() {

hullPointList = new LinkedList();

indexList = new LinkedList();

firstIndex = pf.getFirstIndex();

ps = pf.getPoints();

addToHull(firstIndex);

}

private void addToHull(int index) {

indexList.add(index);

hullPointList.add(ps[index]);

}

public int calculateHull() {

for (int i = getNextIndex(firstIndex); i != firstIndex; i = getNextIndex(i)) {

addToHull(i);

}

showHullPoints();

return 0;

}

private void showHullPoints() {

Iterator itPoint = hullPointList.iterator();

Iterator itIndex = indexList.iterator();

Point p;

int i;

int index = 0;

System.out.println("The hull points is: -> ");

while (itPoint.hasNext()) {

i = itIndex.next();

p = itPoint.next();

System.out.print(i + ":(" + p.getX() + "," + p.getY() + ")  ");

index++;

if (index % 10 == 0)

System.out.println();

}

System.out.println();

System.out.println("****************************************************************");

System.out.println("The count of all hull points is " + index);

}

public int getNextIndex(int currentIndex) {

double minAngle = MAX_ANGLE;

double pseudoAngle;

int minIndex = 0;

for (int i = 0; i < ps.length; i++) {

if (i != currentIndex) {

pseudoAngle = getPseudoAngle(ps[i].getX() - ps[currentIndex].getX(),

ps[i].getY() - ps[currentIndex].getY());

if (pseudoAngle >= currentMinAngle && pseudoAngle < minAngle) {

minAngle = pseudoAngle;

minIndex = i;

} else if (pseudoAngle == minAngle){

if((abs(ps[i].getX() - ps[currentIndex].getX()) >

abs(ps[minIndex].getX() - ps[currentIndex

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值