好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java多边形重心计算

多边形 重心计算

三角形重心

顶点为a,b,c的三角形重心为x = (xa + xb + xc) / 3,y = (ya + yb + yc) / 3

多边形重心

x = (x1w1 + x2w2 + … + xnwn)/w y = (y1w1 + y2w2 + … + ynwn)/w

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

import org.locationtech.jts.geom.coordinate;

import org.locationtech.jts.geom.polygon;

import org.locationtech.jts.io.parseexception;

import java.util.*;

import java.util.stream.collectors;

/**

  * <p>title : polygonnodetriangle </p>

  * <p>description : 多边形自身节点组成三角形</p>

  * @author huifer

  * @date 2018/10/15

  */

public class polygonnodetriangle {

   private int num = 3 ;

   private set result_p = new hashset();

   public static void main(string[] args) {

     //0

     double [] point1 = new double []{ 0 , 0 };

     //1

     double [] point2 = new double []{ 10 , 0 };

     //2

     double [] point3 = new double []{ 20 , 0 };

     //3

     double [] point4 = new double []{ 10 , 10 };

     list< double []> allpoint = new arraylist();

     allpoint.add(point1);

     allpoint.add(point3);

     allpoint.add(point4);

     polygonnodetriangle polygoncenterpoint = new polygonnodetriangle();

     // 外围

     polygon waiwei = polygoncenterpoint.waiwei(point1, point3, point4);

     // 节点三角形

     list<polygon> sanjiaoxing = polygoncenterpoint.trianglemothed(allpoint);

     // 外围内所有三角形

     list<polygon> rangetriangle = polygoncenterpoint.getrangetriangle(waiwei, sanjiaoxing);

     // 重心xy

     double [] gravitycenterxy = polygoncenterpoint.getgravitycenterxy(rangetriangle);

     system.out.println(rangetriangle.size());

     system.out.println( "================================================" );

     double [] doubles = polygoncenterpoint. polygongravitypoint( "polygon((0 0, 20 0, 10 10, 0 0))" );

   }

   /***

    * polygon wkt 计算重心

    * @param wkt

    * @return

    */

   private double [] polygongravitypoint(string wkt) {

 

     if (!wkt.startswith( "polygon" )) {

       return null ;

     }

     operation operation = new operation();

     // 外围数据转 list<double[]>

     polygon waiwei = null ;

     try {

       waiwei = operation.createpolygonbywkt(wkt);

     } catch (parseexception e) {

       e.printstacktrace();

     }

     coordinate[] coordinates = waiwei.getcoordinates();

     list< double []> allp = new arraylist<>();

     arrays.stream(coordinates).foreach(

         s -> {

           double nowx = s.x;

           double nowy = s.y;

           allp.add( new double []{nowx, nowy});

         }

     );

     list<polygon> polygons = trianglemothed(allp);

     list<polygon> rangetriangle1 = getrangetriangle(waiwei, polygons);

     double area = waiwei.getarea();

     double [] gravitycenterxy1 = getgravitycenterxy(rangetriangle1);

     return gravitycenterxy1;

   }

   /***

    * 重心值

    * @param rangetriangle

    * @return [x, y]

    */

   private double [] getgravitycenterxy(list<polygon> rangetriangle) {

     double xarea = 0.0 ;

     double yarea = 0.0 ;

     double aarea = 0.0 ;

     for (polygon triangle : rangetriangle) {

       coordinate[] coordinates = triangle.getcoordinates();

       double area = triangle.getarea();

       double [] onegr = trianglecenterofgravity(coordinates[ 0 ], coordinates[ 1 ], coordinates[ 2 ]);

       xarea += onegr[ 0 ] * area;

       yarea += onegr[ 1 ] * area;

       aarea += area;

     }

     system.out.println( "重心x " + xarea / aarea);

     system.out.println( "重心y " + yarea / aarea);

     return new double []{xarea / aarea, yarea / aarea};

   }

   /***

    * 范围内三角形

    * @param waiwei

    * @param sanjiaoxing

    * @return

    */

   private list<polygon> getrangetriangle(polygon waiwei, list<polygon> sanjiaoxing) {

     list<polygon> triangle = new arraylist<>();

     // 判断三角形是否在面内

     for ( int i = 0 ; i < sanjiaoxing.size(); i++) {

       polygon polygon = sanjiaoxing.get(i);

       boolean within = polygon.within(waiwei);

       if (within) {

         triangle.add(polygon);

       }

     }

     return triangle;

   }

   /***

    * 三角形重心计算

    * @param a

    * @param b

    * @param c

    * @return

    */

   private double [] trianglecenterofgravity(coordinate a, coordinate b, coordinate c) {

     double gravityx = (a.x + b.x + c.x) / 3 ;

     double gravityy = (a.y + b.y + c.y) / 3 ;

     double [] result = new double []{gravityx, gravityy};

     return result;

   }

   /***

    * 测试用外包图形

    * @return

    */

   private polygon waiwei( double [] point1, double [] point3, double [] point4) {

     list< double []> ceshimian = new arraylist();

     ceshimian.add(point1);

//    ceshimian.add(point2);

//    ceshimian.add(point7);

     ceshimian.add(point4);

//    ceshimian.add(point6);

//    ceshimian.add(point5);

     ceshimian.add(point3);

     string polygonforlist = createpolygonforlist(ceshimian);

     operation op = new operation();

     polygon polygonbywkt = null ;

     try {

       polygonbywkt = op.createpolygonbywkt(polygonforlist);

       return polygonbywkt;

     } catch (parseexception e) {

       e.printstacktrace();

     }

     return null ;

   }

   /***

    * 生成所有三角形

    * @param allpoint

    * @return

    */

   private list<polygon> trianglemothed(list< double []> allpoint) {

     // 索引 -> 点坐标

     map<string, double []> indexofpoint = new hashmap();

     for ( int i = 0 ; i < allpoint.size(); i++) {

       indexofpoint.put(string.valueof(i), allpoint.get(i));

     }

     // 排序结果

     sort((list) indexofpoint.keyset().stream().collect(collectors.tolist()), new hashset());

     // 删除元素相同后的集合

     // 所有三角形

     list<polygon> alltriangle = new arraylist();

     for (object onedataobj : result_p) {

       //这一行数据

       set onedatalist = (set) onedataobj;

       // 这一行数据的三角形数据

       list< double []> trianglepoint = new arraylist();

       onedatalist.foreach(

           s -> trianglepoint.add(indexofpoint.get(s)

           ));

       polygon triangle = createtriangle(trianglepoint);

       if (triangle != null ) {

         alltriangle.add(triangle);

       }

     }

     // 所有三角形结束

     return alltriangle;

   }

   /***

    * 从点坐标集合中创建一个面

    * @param points

    * @return

    */

   private static string createpolygonforlist(list< double []> points) {

     string end = "))" ;

     string res = "polygon((" ;

     operation op = new operation();

     for ( double [] point : points) {

       string x = double .tostring(point[ 0 ]);

       string y = double .tostring(point[ 1 ]);

       res += x + " " + y + ", " ;

     }

     res += double .tostring(points.get( 0 )[ 0 ]) + " " + double .tostring(points.get( 0 )[ 1 ]);

     res += end;

     try {

       op.createpolygonbywkt(res);

     } catch (parseexception e) {

       e.printstacktrace();

     }

     return res;

   }

   /***

    * 创建三角形

    * @param trianglepoint

    * @return polygon

    */

   private static polygon createtriangle(list< double []> trianglepoint) {

     operation op = new operation();

     string trianglewkt;

     boolean istri = istriangle(trianglepoint);

     if (istri) {

       trianglewkt = "polygon((" + trianglepoint.get( 0 )[ 0 ] + " " + trianglepoint.get( 0 )[ 1 ] + ", " + trianglepoint.get( 1 )[ 0 ] + " " + trianglepoint.get( 1 )[ 1 ] + ", " + trianglepoint.get( 2 )[ 0 ] + " " + trianglepoint.get( 2 )[ 1 ] + ", " + trianglepoint.get( 0 )[ 0 ] + " " + trianglepoint.get( 0 )[ 1 ] + "))" ;

       try {

         polygon polygonbywkt = op.createpolygonbywkt(trianglewkt);

         return polygonbywkt;

//        return trianglewkt;

       } catch (parseexception e) {

         e.printstacktrace();

       }

     }

     return null ;

   }

   /***

    * 判断三角形

    * @param trianglepoint

    * @return

    */

   private static boolean istriangle(list< double []> trianglepoint) {

     double [] doubles = trianglepoint.get( 0 );

     double [] doubles1 = trianglepoint.get( 1 );

     double [] doubles2 = trianglepoint.get( 2 );

     double len = math.sqrt(math.pow(doubles[ 0 ] - doubles1[ 0 ], 2 ) + math.pow(doubles[ 1 ] - doubles1[ 1 ], 2 ));

     double len1 = math.sqrt(math.pow(doubles[ 0 ] - doubles2[ 0 ], 2 ) + math.pow(doubles[ 1 ] - doubles2[ 1 ], 2 ));

     double len2 = math.sqrt(math.pow(doubles1[ 0 ] - doubles2[ 0 ], 2 ) + math.pow(doubles1[ 1 ] - doubles2[ 1 ], 2 ));

     if ((len + len1 > len2) && (len + len2 > len1) && (len1 + len2 > len)) {

       return true ;

     }

     return false ;

   }

   /***

    * 不重复排列 (元素不相同)

    * @param datas

    * @param target

    */

   private void sort(list datas, set target) {

     if (target.size() == this .num) {

       this .result_p.add(target);

       return ;

     }

     for ( int i = 0 ; i < datas.size(); i++) {

       list newdatas = new arraylist(datas);

       set newtarget = new hashset(target);

       newtarget.add(newdatas.get(i));

       newdatas.remove(i);

       sort(newdatas, newtarget);

     }

   }

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接

原文链接:https://blog.csdn.net/staHuri/article/details/83058930

查看更多关于Java多边形重心计算的详细内容...

  阅读:14次