如何在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)