| | |
| | | |
| | | /** |
| | | * æ ¹æ®æ£æ¹å½¢ç½æ ¼ä¸å¿ç¹åæ ï¼è®¡ç®4个顶ç¹åæ |
| | | * ç½æ ¼ä¸å¿ç¹åæ æç
§ä»å·¦å°å³ãä»ä¸å°ä¸çé¡ºåºæå |
| | | * @param points ç½æ ¼ä¸å¿åæ ç¹æ°ç» |
| | | */ |
| | | fun calGridVertex(points: List<Pair<Double, Double>>): List<GridVertex> { |
| | | // ç½æ ¼å°äº2个ï¼åæ æ³ç»å¶ |
| | | if (points.size < 2) return emptyList() |
| | | val p1 = points[0]; |
| | | val p2 = points[1]; |
| | | // è·ååä¸¤ä¸ªç½æ ¼ |
| | | // Fixme 2025.01.10: ç®åå
ç®åé»è¾ï¼æç
§åä¸¤ä¸ªç¹æ¯å·¦å³æå¸ï¼ä¸ç¹p2å¨ç¹p1çä¸è¾¹ |
| | | val p1 = points[0] |
| | | val p2 = points[1] |
| | | // 两ä¸å¿ç¹é´çè§åº¦ |
| | | val angle = MapUtil.getAngle(p1.first, p1.second, p2.first, p2.second); |
| | | val angle = MapUtil.getAngle(p1.first, p1.second, p2.first, p2.second) |
| | | // 两ä¸å¿ç¹é´çè·ç¦» |
| | | val dis = MapUtil.getDistance(p1.first, p1.second, p2.first, p2.second); |
| | | val dis = MapUtil.getDistance(p1.first, p1.second, p2.first, p2.second) |
| | | // ç½æ ¼æ£æ¹å½¢å¯¹è§çº¿çä¸åé¿åº¦ |
| | | val halfDiagonal = sqrt((dis / 2) * (dis / 2) * 2); |
| | | val halfDiagonal = sqrt((dis / 2) * (dis / 2) * 2) |
| | | // 计ç®é¦ä¸ªæ£æ¹å½¢åé¡¶ç¹ç¸å¯¹äºä¸å¿ç¹çè§åº¦ï¼å¾å°æ£æ¹å½¢åé¡¶ç¹çåæ |
| | | val angle1 = MapUtil.plusAngle(angle, 45.0); |
| | | val gp1 = MapUtil.getPointByLen(p1, halfDiagonal, angle1 * PI / 180); |
| | | val angle2 = MapUtil.plusAngle(angle1, 90.0); |
| | | val gp2 = MapUtil.getPointByLen(p1, halfDiagonal, angle2 * PI / 180); |
| | | val angle3 = MapUtil.plusAngle(angle2, 90.0); |
| | | val gp3 = MapUtil.getPointByLen(p1, halfDiagonal, angle3 * PI / 180); |
| | | val angle4 = MapUtil.plusAngle(angle3, 90.0); |
| | | val gp4 = MapUtil.getPointByLen(p1, halfDiagonal, angle4 * PI / 180); |
| | | // 4ä¸ªé¡¶ç¹æç
§ä»å·¦ä¸è§å¼å§ï¼é¡ºæ¶éæ¹åç顺åºè¿è¡æå |
| | | val angle1 = MapUtil.plusAngle(angle, 45.0 + 180.0) |
| | | val gp1 = MapUtil.getPointByLen(p1, halfDiagonal, angle1 * PI / 180) |
| | | val angle2 = MapUtil.plusAngle(angle1, 90.0) |
| | | val gp2 = MapUtil.getPointByLen(p1, halfDiagonal, angle2 * PI / 180) |
| | | val angle3 = MapUtil.plusAngle(angle2, 90.0) |
| | | val gp3 = MapUtil.getPointByLen(p1, halfDiagonal, angle3 * PI / 180) |
| | | val angle4 = MapUtil.plusAngle(angle3, 90.0) |
| | | val gp4 = MapUtil.getPointByLen(p1, halfDiagonal, angle4 * PI / 180) |
| | | // 计ç®4个顶ç¹åå«ä¸ä¸å¿ç¹çç»çº¬åº¦å·®å¼ |
| | | val dx1 = gp1.first - p1.first |
| | | val dy1 = gp1.second - p1.second |
| | |
| | | } |
| | | |
| | | /** |
| | | * æåç½æ ¼ |
| | | * æåç½æ ¼ä¸ºç»åç½æ ¼ |
| | | * æ ¹æ®ç¸ä¼¼ç©å½¢çåçï¼å¯ä»¥å嫿æ¯ä¾å¾å°æ¯ä¸ªç»åç½æ ¼çç»çº¬åº¦ |
| | | * @param gridCellList åå§ç½æ ¼æ°ç» |
| | | * @param scale æåçç³»æ°ï¼ä¾å¦ 2ï¼è¡¨ç¤ºå°åæç½æ ¼æè¾¹é¿ç 1/2 æåæ 2 * 2 ç4ä¸ªç½æ ¼ |
| | | */ |
| | | fun splitGrid(gridCellList: List<GridCell?>): List<GridCell> { |
| | | TODO() |
| | | fun splitGrid(gridCellList: List<GridCell>, scale: Int): List<GridCell> { |
| | | if (scale <= 0) throw IllegalArgumentException("ç½æ ¼æåçæ°éä¸è½å°äº1") |
| | | // æåç³»æ°ä¸º1ï¼åè¡¨ç¤ºä¸æå |
| | | if (scale == 1) return gridCellList |
| | | if (gridCellList.isEmpty()) return emptyList() |
| | | |
| | | val newGridCellList = mutableListOf<GridCell>() |
| | | |
| | | // æ ¹æ®å½æ°[calGridVertex]çæçç½æ ¼4个顶ç¹åæ ï¼ä»¥ä¸åä¸å左西å³ä¸æ¹å为æ å |
| | | // 计ç®é¦ä¸ªç½æ ¼ä¸å¿åæ ç¹åå«å4个顶ç¹çç»çº¬åº¦å·®å¼ |
| | | val p = gridCellList[0] |
| | | // ï¼éè¿è¿ä¼¼å¹³é¢åæ ç³»çæ¹å¼ï¼æ ¹æ®å个åå§ç½æ ¼ç4个顶ç¹åæ ï¼åå«ç¡®å®ä»¥ä¸ä¸ç»åæ ç¹ä¹é´çç»çº¬åº¦åä½åç§»é |
| | | val p1 = p.point1Lon to p.point1Lat |
| | | val p2 = p.point2Lon to p.point2Lat |
| | | val p3 = p.point3Lon to p.point3Lat |
| | | val p4 = p.point4Lon to p.point4Lat |
| | | // p1ãp3çç»çº¬åº¦åä½å·®å¼ |
| | | val dx1 = (p3.first - p1.first) / scale.toBigDecimal() |
| | | val dy1 = (p3.second - p1.second) / scale.toBigDecimal() |
| | | // p1ãp2çç»çº¬åº¦åä½å·®å¼ |
| | | val dx2 = (p2.first - p1.first) / scale.toBigDecimal() |
| | | val dy2 = (p2.second - p1.second) / scale.toBigDecimal() |
| | | // p3ãp4çç»çº¬åº¦åä½å·®å¼ |
| | | val dx3 = (p4.first - p3.first) / scale.toBigDecimal() |
| | | val dy3 = (p4.second - p3.second) / scale.toBigDecimal() |
| | | // ä¸å¿ç¹åp1çç»çº¬åº¦åä½å·®å¼ |
| | | val dxC = (p.longitude - p1.first) / scale.toBigDecimal() |
| | | val dyC = (p.latitude - p1.second) / scale.toBigDecimal() |
| | | |
| | | // ç½æ ¼è¡å¾ªç¯ |
| | | for (row in 0 until scale) { |
| | | val newGridCell1 = GridCell() |
| | | |
| | | // ç¡®å®æ¯ä¸è¡é¦ä¸ªç»åç½æ ¼çä¸å¿åæ å4个顶ç¹åæ |
| | | // å·¦ä¸è§é¡¶ç¹æ ¹æ®æå¨è¡æ°å¨åå§ç½æ ¼é¡¶ç¹åºç¡ä¸å¢å åç§»é |
| | | newGridCell1.point1Lon = p1.first + dx1 * row.toBigDecimal() |
| | | newGridCell1.point1Lat = p1.second + dy1 * row.toBigDecimal() |
| | | // å·¦ä¸è§é¡¶ç¹æ ¹æ®æå¨è¡æ°å¨åå§ç½æ ¼é¡¶ç¹åºç¡ä¸å¢å åç§»éï¼æ¯å·¦ä¸è§é¡¶ç¹å¤ä¸ä¸ªåç§»ï¼ |
| | | newGridCell1.point3Lon = p1.first + dx1 * (row + 1).toBigDecimal() |
| | | newGridCell1.point3Lat = p1.second + dy1 * (row + 1).toBigDecimal() |
| | | // å³ä¸è§é¡¶ç¹å¨ç»åç½æ ¼å·¦ä¸è§çåºç¡ä¸å¢å ç¸åºçåç§»é |
| | | newGridCell1.point2Lon = newGridCell1.point1Lon + dx2 |
| | | newGridCell1.point2Lat = newGridCell1.point1Lat + dy2 |
| | | // å³ä¸è§é¡¶ç¹å¨ç»åç½æ ¼å·¦ä¸è§çåºç¡ä¸å¢å ç¸åºçåç§»é |
| | | newGridCell1.point4Lon = newGridCell1.point3Lon + dx3 |
| | | newGridCell1.point4Lat = newGridCell1.point3Lat + dy3 |
| | | // ä¸å¿ç¹å¨ç»åç½æ ¼å·¦ä¸è§çåºç¡ä¸å¢å åºå®åç§»é |
| | | newGridCell1.longitude = newGridCell1.point1Lon + dxC |
| | | newGridCell1.latitude = newGridCell1.point1Lat + dyC |
| | | |
| | | // å å
¥ç»æéå |
| | | newGridCellList.add(newGridCell1) |
| | | |
| | | // ç½æ ¼å循ç¯(ä»ç¬¬2åå¼å§) |
| | | for (col in 1 until scale) { |
| | | val newGridCell = GridCell() |
| | | newGridCell.point1Lon = newGridCell1.point1Lon + dx2 * col.toBigDecimal() |
| | | newGridCell.point1Lat = newGridCell1.point1Lat + dy2 * col.toBigDecimal() |
| | | newGridCell.point2Lon = newGridCell1.point2Lon + dx2 * col.toBigDecimal() |
| | | newGridCell.point2Lat = newGridCell1.point2Lat + dy2 * col.toBigDecimal() |
| | | newGridCell.point3Lon = newGridCell1.point3Lon + dx3 * col.toBigDecimal() |
| | | newGridCell.point3Lat = newGridCell1.point3Lat + dy3 * col.toBigDecimal() |
| | | newGridCell.point4Lon = newGridCell1.point4Lon + dx3 * col.toBigDecimal() |
| | | newGridCell.point4Lat = newGridCell1.point4Lat + dy3 * col.toBigDecimal() |
| | | newGridCell.longitude = newGridCell.point1Lon + dxC |
| | | newGridCell.latitude = newGridCell.point1Lat + dyC |
| | | |
| | | newGridCellList.add(newGridCell) |
| | | } |
| | | } |
| | | |
| | | return newGridCellList |
| | | } |
| | | |
| | | } |