我如何"膨胀"多边形?也就是说,我想做类似的事情:

要求是新的(膨胀的)多边形的边/点都与旧的(原始)多边形处于相同的恒定距离(在示例图片上它们不是,因为那时它必须使用弧来填充顶点,但是让我们暂时忘掉它;)).
我正在寻找的数学术语实际上是向内/向外多边形的偏离.+1指向balint指出这一点.替代命名是多边形缓冲.
我的搜索结果:
以下是一些链接:
如何找到可以放入凹多边形内的最大圆?
只要能够实时处理具有~50个顶点的多边形,蛮力算法就可以了.
我在我创建的地图上有一堆传单多边形.每个多边形代表不同的东西 根据用户所在的页面,弹出窗口中会显示一组特定信息.我需要找到一种方法,使"popup"气泡在它所代表的多边形的中心打开.
使用以下代码绘制每个多边形:
var L20 = [
[74.0995, -99.92615],
[74.14008, -99.4043],
[74.07691, -99.33838],
[74.03617, -99.86023]
];
var L19 = [
[74.02559, -99.84924],
[74.06636, -99.32739],
[74.0029, -99.26147],
[73.96197, -99.77783]
];
var L18 = [
[73.95142, -99.76684],
[73.99235, -99.25048],
[73.92889, -99.18456],
[73.8878, -99.69543]
];
var set1 = L.polygon([L20, L19, L18], {
color: "#fff",
weight: 1,
stroke: true,
opacity: 0.05,
fillColor: "#346B1F",
}).addTo(map);
Run Code Online (Sandbox Code Playgroud)
使用以下代码绘制弹出窗口:
var popup = L.popup({})
.setLatLng([73.64017, -100.32715])
.setContent(content).openOn(map);
var popup = L.popup();
Run Code Online (Sandbox Code Playgroud)
所以我需要找到一种方法.setLatLang来确定或给出多边形的中心.
我想出了3个可能有用的解决方案,不知道如何去做.
找到一种方法来使用多边形的坐标来确定弹出窗口打开的多边形的中心.
调用多边形的一个点,然后偏移弹出窗口的位置.
对每个多边形使用id,因此每个弹出窗口都知道可以打开的框区域(多边形).
有谁可以帮助我吗?
我在Bing Maps WPF控件上绘制区域(使用SqlGeometry/ SqlGeography并将它们转换为WPF LocationCollection等效项)并需要标记它们.我得到了区域上绘制的标签,并将它们附加到找到的点上STCentroid().当然,正如您所想象的那样,"U"或"C"形区域存在问题,其中质心最终位于区域之外,这使得标签不正确.
有没有办法使用SqlGeometry/ SqlGeography找到"视觉"中心或者找到最适合形状并使用该中心的圆圈?我尝试了各种方法,STPointOnSurface()但似乎STPointOnSurface()总是在边缘上选择一个点,就像DCREHA一样(底部深绿色区域的标签总是在边缘上:

什么算法,我可以用来获得多边形的中心(红点)
案例1:我尝试使用maxX,maxY,minX,minY,我得到了错误的点(黑点)
案例2:我试图得到第二个最大值min坐标X和Y,但是我遇到的问题是多边形有点小于5的
情况3:我添加if point count < 5 then use case 1 else use case 2但是我得到一些多边形的一些错误
你能告诉我正确的算法吗?
注意 :

解释第四张照片
//ma mean max, mi mean min, X1 mean first, X2 mean second
maX1 = maX2 = maY1 = maY2 = 0;
miX1 = miX2 = miY1 = miY2 = 2000;
//aCoor is array of coordinate, format = {x1,y1,x2,y2,x3,y3,x4,y4,...}
for(int i=0; i<aCoor.count(); i+=2)
{
//point is list of point
point.Add(aCoor[i],aCoor[i + 1]);
//this to get second max X
if(maX2 …Run Code Online (Sandbox Code Playgroud) 我在未定形的多边形地图的中心画圆圈.圆圈位于该国大部分地区的中心.但对于"挪威"多边形的形状,返回中心点是错误的.缩放/缩放页面后,您可以清楚地看到差异.
我使用了这个stackoverflow解决方案:链接
我的代码在这里.SVG:
<svg xmlns="http://www.w3.org/2000/svg" style="overflow: hidden; z-index: 0; float: left; background: transparent; height: 500px; width: 500px; margin-top: 0px; margin-left: 0px;">
<path class="mapShape" stroke="#FFFFFF" stroke-width="0.25" fill="#ffff00" d="M289.61881571694846,107.44341140465033,293.96308112495205,110.5369251340838,292.1742152937817,111.64028258514635,293.69594267913214,114.17588213225122,291.33275072129567,115.75640079550517,290.21101327644885,116.115304587361,290.79940687634996,113.34302402649551,289.01707237203874,111.73064813415773,286.86058614336986,113.10652807111005,286.17946205663384,116.00897875925767,284.8551099335093,117.71420145300249,283.3639577705983,116.78716653168755,281.5503303156214,116.97787478097227,280.0068557650149,114.91879878457861,279.17443456817995,115.95395481299134,278.3128736053582,116.11389849530838,278.1091105619184,118.63382135713674,275.4914839478672,118.02707970555407,275.1238635503685,120.11785014900434,273.7901091874799,120.10529402219055,272.87321137841224,122.7050543288587,271.48390485080984,126.60600357598904,269.3273468493182,131.3173178164711,269.8332017031975,132.42411528484843,269.3498835156233,133.6909765856373,267.9721324124638,133.63667113556374,267.07023512332535,136.56637255563933,267.1556447822521,140.55669253761528,268.04325927968785,142.03410132622142,267.5838414420485,145.3716436133896,266.42815545209885,147.26315676671453,265.8157897294402,148.82368555076928,264.88410671891126,147.16092140518467,262.1416671663106,150.27022727262624,260.28992834251846,150.88797751378152,258.3692158361812,149.54060413568916,257.8725479035983,146.63056295282385,257.4334417747625,140.05376745248705,258.71236170116373,138.13152704055724,262.3797376189663,135.55992732652805,265.12181830745385,132.29324106111955,267.6643705490366,127.68026976914571,271.0015914827522,120.85619046583638,273.32767689129025,118.04298816880565,277.1444838258035,113.13815447740048,280.19224496586196,111.35745222872376,282.47741986550216,111.5754647031133,284.5924214026924,108.10819671605745,287.12506899475255,108.29698566394183ZM284.83905555555555,72.19815552139636,281.7365555555555,74.85366572152822,279.28612499999997,73.35699077101634,280.24459722222224,71.66044868206447,279.40541666666667,69.508641420061,282.28369444444445,68.1303212868272,282.8351944444444,70.69457195193213ZM275.84976388888896,58.9806663889022,280.42198611111115,64.57567572395904,276.92690277777774,67.37974197318883,276.1551666666667,72.37724133868834,274.9366805555556,73.61091608778322,274.2752777777778,78.81637965917018,272.6015972222222,79.05316716888755,269.61470833333334,75.26524507138704,270.87438888888886,72.97467771855085,268.79249999999996,71.06094914643477,266.0865416666667,65.20265086315597,265.0062916666667,59.363240232610856,268.7927361111111,56.545993503156645,269.5535,59.301357483657114,271.5316944444445,59.193568518861454,272.0590972222222,56.500983977896404,274.0984027777777,56.221878380253195ZM285.84392411084985,53.30414066139549,288.5659801818243,56.17728511117262,286.50645903652526,60.397046089088526,282.4784246850189,61.291565425339506,278.3822061520165,60.0221846103223,278.1350923237096,57.880800099653854,276.14203281216373,57.74271786397911,274.62224329302427,54.037937230381914,278.9111000819593,51.69790103414376,280.92770107932694,53.71698527072119,282.3322952181492,51.194805998985345Z" stroke-linejoin="round" stroke-linecap="square" nodeValue="#E0E0E0"></path>
<circle fill="#FE0000" cx="271.7692623673869" cy="128.99711033923683" fill-opacity="1" r="1"></circle>
</svg>
Run Code Online (Sandbox Code Playgroud)
JavaScript的:
var path = "289.61881571694846,107.44341140465033,293.96308112495205,110.5369251340838,292.1742152937817,111.64028258514635,293.69594267913214,114.17588213225122,291.33275072129566,115.75640079550517,290.21101327644885,116.115304587361,290.79940687634996,113.34302402649551,289.01707237203874,111.73064813415773,286.86058614336985,113.10652807111005,286.17946205663383,116.00897875925767,284.8551099335093,117.71420145300249,283.3639577705983,116.78716653168754,281.5503303156214,116.97787478097227,280.0068557650149,114.91879878457861,279.17443456817994,115.95395481299134,278.3128736053582,116.11389849530837,278.1091105619184,118.63382135713674,275.4914839478672,118.02707970555407,275.1238635503685,120.11785014900434,273.7901091874799,120.10529402219055,272.87321137841223,122.7050543288587,271.48390485080983,126.60600357598903,269.3273468493182,131.3173178164711,269.8332017031975,132.42411528484843,269.3498835156233,133.6909765856373,267.9721324124638,133.63667113556374,267.07023512332534,136.56637255563933,267.1556447822521,140.55669253761528,268.04325927968784,142.03410132622142,267.5838414420485,145.3716436133896,266.42815545209885,147.26315676671453,265.8157897294402,148.82368555076928,264.88410671891125,147.16092140518467,262.1416671663106,150.27022727262624,260.28992834251846,150.88797751378152,258.3692158361812,149.54060413568916,257.8725479035983,146.63056295282385,257.4334417747625,140.05376745248705,258.71236170116373,138.13152704055724,262.3797376189663,135.55992732652805,265.12181830745385,132.29324106111954,267.6643705490366,127.68026976914571,271.0015914827522,120.85619046583638,273.32767689129025,118.04298816880565,277.1444838258035,113.13815447740047,280.19224496586196,111.35745222872376,282.47741986550215,111.5754647031133,284.5924214026924,108.10819671605745,287.12506899475255,108.29698566394182"
var stringData = path.split(",");
var length = stringData.length;
var data = [], obj;
for (var i = 0; i < length; i = i + 2) {
obj = { x: parseFloat(stringData[i]), y: parseFloat(stringData[i + 1]) }; …Run Code Online (Sandbox Code Playgroud) 我一直在尝试找到弯曲形状(例如香蕉)的中心。我可以完成所有基础操作,例如创建二值图像和定位轮廓。但是,质心函数正确地找到了轮廓之外的点。我需要的点必须在轮廓内。我附上了一张应该能更好地解释事情的图片。
如果有人有任何想法,或看到过类似的东西,我将非常感谢您的帮助。
我有一个图像文件,其背景为白色,非白色物体.我想使用python(Pillow)找到对象的中心.
我在c ++中发现了一个类似的问题,但没有可接受的答案 - 我怎样才能找到对象的中心?
类似的问题,但回答中链接断开 - 找到不规则形状多边形中心的最快方法是什么?(回答中断链接)
我也阅读了这个页面,但它没有给我一个有用的食谱 - https://en.wikipedia.org/wiki/Smallest-circle_problem
编辑:我正在使用的当前解决方案是:
def find_center(image_file):
img = Image.open(image_file)
img_mtx = img.load()
top = bottom = 0
first_row = True
# First we find the top and bottom border of the object
for row in range(img.size[0]):
for col in range(img.size[1]):
if img_mtx[row, col][0:3] != (255, 255, 255):
bottom = row
if first_row:
top = row
first_row = False
middle_row = (top + bottom) / 2 # Calculate the middle row of …Run Code Online (Sandbox Code Playgroud) 我有一组 CGPoints:
let points = [(1234.0, 1053.0), (1241.0, 1111.0), (1152.0, 1043.0)]
Run Code Online (Sandbox Code Playgroud)
我想做的是找到 CGPoints 的中心。所以我可以将一个对象放置在所有点的中心。如果这是一个整数数组,我会像这样减少数组:
points.reduce(0, +)
Run Code Online (Sandbox Code Playgroud)
然后除以数组总数以获得平均值。但由于它的 CGPoints 这不起作用。关于如何实现这一目标有什么想法吗?