如何在R中获得(拉长的)多边形的两端?

如何在R中获得(拉长的)多边形的两端?,r,algorithm,polygon,distance,R,Algorithm,Polygon,Distance,我有一个不规则形状的细长多边形 我需要找到它的终点。我假设它是拉长的,在这种情况下很容易在视觉上发现它,但数学上有点棘手 我试图将这个问题近似为找到两个最远的距离点,同时保持其周长上的“增量”不变。代码如下: > print(x) x1 x2 [1,] 609899.7 217820.0 [2,] 609909.9 217817.8 [3,] 609912.2 217812.9 [4,] 609916.9 217811.8 [5,

我有一个不规则形状的细长多边形

我需要找到它的终点。我假设它是拉长的,在这种情况下很容易在视觉上发现它,但数学上有点棘手

我试图将这个问题近似为找到两个最远的距离点,同时保持其周长上的“增量”不变。代码如下:

> print(x)
             x1       x2
  [1,] 609899.7 217820.0
  [2,] 609909.9 217817.8
  [3,] 609912.2 217812.9
  [4,] 609916.9 217811.8
  [5,] 609924.0 217809.7
  [6,] 609927.2 217809.9
  [7,] 609930.2 217812.0
  [8,] 609934.9 217808.8
  [9,] 609938.0 217808.7
 [10,] 609941.2 217809.2
 [11,] 609945.8 217805.9
 [12,] 609954.2 217806.9
 [13,] 609953.0 217800.7
 [14,] 609957.3 217799.9
 [15,] 609962.0 217798.8
 [16,] 609967.0 217798.8
 [17,] 609971.3 217800.0
 [18,] 609977.4 217802.9
 [19,] 609986.0 217807.4
 [20,] 609987.0 217803.8
 [21,] 609990.4 217804.1
 [22,] 609996.3 217808.9
 [23,] 609999.4 217809.0
 [24,] 609999.4 217804.0
 [25,] 609994.1 217802.3
 [26,] 609990.0 217801.2
 [27,] 609985.4 217798.0
 [28,] 609982.0 217798.2
 [29,] 609979.0 217798.2
 [30,] 609973.4 217797.0
 [31,] 609970.1 217795.6
 [32,] 609961.8 217796.4
 [33,] 609957.4 217797.1
 [34,] 609953.0 217798.3
 [35,] 609948.9 217799.3
 [36,] 609945.3 217801.0
 [37,] 609939.2 217806.0
 [38,] 609936.0 217806.2
 [39,] 609932.3 217806.1
 [40,] 609928.0 217807.3
 [41,] 609924.9 217807.2
 [42,] 609921.3 217807.1
 [43,] 609917.0 217808.3
 [44,] 609912.9 217809.2
 [45,] 609908.3 217810.1
 [46,] 609898.3 217817.0
 [47,] 609892.1 217824.8
 [48,] 609893.1 217828.8
 [49,] 609896.2 217829.1
 [50,] 609898.1 217834.8
 [51,] 609899.3 217839.0
 [52,] 609899.1 217842.1
 [53,] 609902.2 217848.9
 [54,] 609905.3 217855.0
 [55,] 609909.1 217862.2
 [56,] 609917.2 217873.9
 [57,] 609921.3 217879.9
 [58,] 609935.1 217894.1
 [59,] 609939.3 217902.0
 [60,] 609943.4 217909.1
 [61,] 609946.1 217915.2
 [62,] 609949.3 217922.1
 [63,] 609953.4 217929.1
 [64,] 609957.0 217936.2
 [65,] 609961.6 217944.4
 [66,] 609967.4 217953.1
 [67,] 609971.0 217960.2
 [68,] 609976.5 217969.2
 [69,] 609981.4 217977.1
 [70,] 609984.9 217984.2
 [71,] 609989.9 217992.6
 [72,] 609994.4 218000.1
 [73,] 609997.0 218006.3
 [74,] 610000.9 218005.6
 [75,] 610000.5 218001.9
 [76,] 609998.6 217996.1
 [77,] 609991.8 217988.1
 [78,] 609990.2 217981.5
 [79,] 609984.5 217975.8
 [80,] 609981.0 217968.6
 [81,] 609978.6 217960.1
 [82,] 609974.6 217958.8
 [83,] 609971.0 217951.6
 [84,] 609965.8 217943.1
 [85,] 609967.5 217934.9
 [86,] 609957.7 217929.9
 [87,] 609955.8 217924.7
 [88,] 609954.5 217919.2
 [89,] 609954.4 217916.0
 [90,] 609945.7 217905.9
 [91,] 609944.0 217901.4
 [92,] 609945.6 217894.1
 [93,] 609938.9 217890.1
 [94,] 609935.6 217882.1
 [95,] 609923.0 217874.8
 [96,] 609923.4 217869.0
 [97,] 609916.1 217865.4
 [98,] 609911.9 217858.3
 [99,] 609912.6 217850.1
[100,] 609905.1 217845.4
[101,] 609903.8 217840.9
[102,] 609902.9 217836.2
[103,] 609900.7 217831.0
[104,] 609901.2 217825.1
获取某些内容的函数:

## Get all deltas between points (on line)
deltas = NULL; dsum = 0
for (i in 1:nrow(x)) {
  if (i == 1) {
    d = sqrt((x[i,1]-x[nrow(x),1])^2 + (x[i,2]-x[nrow(x),2])^2)
  } else {
    d = sqrt((x[i,1]-x[i-1,1])^2 + (x[i,2]-x[i-1,2])^2)
  }
  ddf = data.frame(id = i, x = x[i,1], y = x[i,2], delta = d, d_agr = dsum, stringsAsFactors = F, row.names = NULL)
  deltas = rbind.data.frame(deltas, ddf)
  dsum = dsum + d
}

# provisional opposite vertex index
povi = which(deltas$d_agr > dsum/2)[1]

maxd = 0; nac = 0; p1 = 0; p2 = 0
for (i in 1:povi) {  #i=28
  idx = i
  iv2 = which(deltas$d_agr > dsum/2+deltas$d_agr[idx])[1]
  if (is.na(iv2)) {
    nac = nac + 1
    idx = nac
    iv2 = which(deltas$d_agr > dsum/2+deltas$d_agr[idx])[1]
  }
  d = sqrt((x[idx,1]-x[iv2,1])^2 + (x[idx,2]-x[iv2,2])^2)
  if (d > maxd) { maxd = d; p1 = i; p2 = iv2 }
}
现在如果我打印
print(c(maxd,p1,p2))
我得到我的点是20和73,所以它们很接近,但它们不是这些端点

plot(x, pch=20, cex=0.1)
text(x, cex=0.5, pos = 1, offset = 0.1)

我宁愿赌24英镑和74英镑。所以我的努力不是我想要的。更重要的是,我不需要保持这些点之间的“增量”不变,因为最后,有24和74,我想知道它们在环上的“上”和“下”距离

您提供的关于如何采取这种方法的任何提示。我需要一个像这样的O(n)