java n个点 凸多边形_寻找面积最大的凸多边形

该博客介绍了一种在Java中寻找n个点构成的凸多边形中面积最大的子集的方法。首先从输入数据中读取点坐标,并存储到Map中。接着,确定起点和终点,然后通过比较斜率找到最大面积的边,逐步构建凸多边形。最终输出所找到的凸多边形顶点数量及其坐标。
摘要由CSDN通过智能技术生成

importjava.awt.Point;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Map;importjava.util.Scanner;importjava.util.StringTokenizer;public classMain {public static Map>readData(){

Scanner s= newScanner(System.in);

String input= null;

Map> pts = new HashMap>();if(s.hasNext()){

input=s.nextLine();

}

StringTokenizer st= new StringTokenizer(input, ",;");

st.nextToken();while(st.hasMoreTokens()){

Integer x=Integer.parseInt(st.nextToken());

Integer y=Integer.parseInt(st.nextToken());

ArrayList v = pts.get(x) == null ? new ArrayList() : pts.get(x);

v.add(newPoint(x, y));

pts.put(x, v);

}int key = 0;

Map> indexPts = new HashMap>();for(java.util.Map.Entry entry : pts.entrySet()){

indexPts.put(key, (ArrayList)entry.getValue());

key++;

}returnindexPts;

}

@SuppressWarnings({"rawtypes", "unchecked"})public static voidmain(String[] args) {

ArrayList ptOkList = new ArrayList();

Map> pts = readData();//读取数据并存储到map中

int i = 0;

Point startUp= pts.get(0).get(0);

Point startBottom= pts.get(0).get(0);

Point endUp= pts.get(pts.size() - 1).get(0);

Point endBottom= pts.get(pts.size() - 1).get(0);for(i = 0; i < pts.get(0).size(); i++){if(pts.get(0).get(i).y >startUp.y){

startUp= pts.get(0).get(i);

}if(pts.get(0).get(i).y

startBottom= pts.get(0).get(i);

}

}for(i = 0; i < pts.get(pts.size() - 1).size(); i++){if(pts.get(pts.size() - 1).get(i).y >startUp.y){

endUp= pts.get(pts.size() - 1).get(i);

}if(pts.get(pts.size() - 1).get(i).y

endBottom= pts.get(pts.size() - 1).get(i);

}

}

Point startPt=startUp;int index = 0;

Point p=startUp;while(true){float k = -Float.MAX_VALUE;for(i = index + 1; i < pts.size(); i++){//int index_ = index;

for(int j = 0; j < pts.get(i).size(); j++){

Point temp=pts.get(i).get(j);float kk = (temp.y - startPt.y) / (temp.x -startPt.x);if(kk >k){

p=temp;

k=kk;

index=i;

}

}

}

startPt=p;if(startPt ==endUp){break;

}

ptOkList.add(startPt);

}

startPt=endBottom;

index= pts.size() - 1;

p=endBottom;while(true){float k = -Float.MAX_VALUE;for(i = index - 1; i >= 0; i--){//int index_ = index;

for(int j = 0; j < pts.get(i).size(); j++){

Point temp=pts.get(i).get(j);float kk = (temp.y - startPt.y) / (temp.x -startPt.x);if(kk >k){

p=temp;

k=kk;

index=i;

}

}

}

startPt=p;if(startPt ==startBottom){break;

}

ptOkList.add(startPt);

}for(i = 0; i < pts.get(0).size(); i++){

ptOkList.add(pts.get(0).get(i));

}for(i = 0; i < pts.get(pts.size() - 1).size(); i++){

ptOkList.add(pts.get(pts.size()- 1).get(i));

}

System.out.print(ptOkList.size());for(i = 0; i < ptOkList.size(); i++){

System.out.print(";" + ptOkList.get(i).x + "," +ptOkList.get(i).y);

}

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值