我有一堆带有两组数据的交叉图,并且一直在寻找一种matploltib方法,用平滑的多边形轮廓突出显示它们的绘图区域.
目前我只使用Adobe Illustrator并修改已保存的情节,但这并不理想.例:
我很感激任何指针/链接到示例.
干杯
我创建没有孔的多边形联合.输入多边形没有孔,也应输出一个.我已经有了工作算法来找到两个多边形.但是如果超过两个则存在问题.因为联合不应该是不相交的多边形,当我尝试逐个计算它们的总和时我在这种情况下遇到问题:

然后多边形1遇到多边形2,联合是不相交的(因此我的算法不计算总和).在第二个循环ofc中它与第3和第4个多边形结合,但是输出与第2个多边形不同.那么有人知道这种快速而准确的算法吗?可能一个好主意是首先通过交叉点对多边形进行排序,但我不能想到任何快速算法,也不完全不确定它们应该如何排序.
我正在使用Unity,但解决方案应该是通用的.我将通过鼠标点击获得用户输入,鼠标点击定义了封闭的不规则多边形的顶点列表.该顶点将定义平面3D网格的外边缘.
要在Unity中以程序方式生成网格,我必须指定所有顶点以及它们如何连接以形成三角形.
因此,对于凸多边形而言,它是微不足道的,我只是制作具有顶点1,2,3然后1,3,4等的三角形,形成类似孔雀尾巴的东西.
但对于凹多边形而言,并非如此简单.是否有一种有效的算法来查找内部三角形?
输入图片:

预期产出:

我打算适合三个(或一些数量)多边形(对于这种情况,矩形)来表示此图像中的"大"白色斑点.在输出图像中绘制的矩形是根据我对白色区域的感知.我不认为算法会提出这些相同的bouding区域.我希望的是在白色像素簇周围安装一些紧密的多边形.
我的初始解决方案包括找到该图像的轮廓,并通过找到每个轮廓中的点的凸包来在每个轮廓周围拟合闭合的凸多边形.
然而,由于白色区域高度碎裂,边缘内部和边缘有黑色区域,cv2.findContours返回的轮廓数量非常高(约500左右).因此,装配凸包不会改善白色区域的形状.白色区域大多保留其原始的抽象形状.我的目标是将白色区域的许多小轮廓合并为一个包含轮廓的整体,然后我可以在其上安装凸壳.
我该如何解决这个问题?我应该首先在轮廓点上使用聚类算法来找到彼此靠近的轮廓吗?
我将多边形添加到 Google Map v2 中,如下所示:
for (int index = coordinats.size()-1; index >= 0; index--) {
polygonOptions.add(
new LatLng(latCoordinats.get(index), lngCoordinats.get(index)));
}
polygonOptions.strokeColor(0x7FFFFFFF);
polygonOptions.strokeWidth((float) 5);
polygonOptions.fillColor(Color.BLUE);
polygon= mMap.addPolygon(polygonOptions);
Run Code Online (Sandbox Code Playgroud)
polygonOptions.fillColor(Color.BLUE);
不适合我......我错过了什么?
我无法想出一种算法来检测弱的简单多边形(即允许边接触但不能交叉的多边形).目前我只是检查每一方之间的交叉点 - 这是我呼吁所有非相邻方的功能.这样,只允许简单的多边形(根本不接触).多边形是点的向量.
bool linesIntersect(const point &a1, const point &a2, const point &b1, const point &b2) {
// Solve intersection of parametric lines using inverse matrix
// The equation of the parametric lines are line1 = (a2 - a1)*s + a1
// and line2 = (b2 - b1)*t + b1, where a1, a2, etc. are vectors.
// Two equations can be produced from the two components, and these
// this system of two equations can be solved for s and …Run Code Online (Sandbox Code Playgroud) 我正在努力在 Shiny 应用程序中绘制多个多边形 - 基于传单包。
这是我希望的非应用程序输出:
data <- list(
beam1 = data.frame(lat = c(-115,-125, -125, -115),
lon = c(32, 32, 45,45)),
beam2 = data.frame(lat = c(-100, -111, -111, -100),
lon = c(42, 42, 50,50))
)
dataTemp <- do.call(rbind, lapply(data, function(x) rbind(x, NA)))
library(leaflet)
m = leaflet() %>% addTiles()
m %>%
addPolygons(
dataTemp[,"lat"],
dataTemp[,"lon"],
color = c('red', 'green'), weight = 3
)
Run Code Online (Sandbox Code Playgroud)
然而,事实证明,用它创建一个 Shiny 应用程序是很困难的 - 多边形被绘制出来,然后一旦绘制了一个新的多边形就一个一个地消失。这是我正在使用的代码。您需要单击“绘制”来绘制多边形 注意如何: 1 - 绘制绿色时红色多边形消失(3 秒后) 2 - 此处的多边形是三角形,而在上面的代码中它们是矩形。3 - 如果您查看下面 server.R 中的代码,我实际上不得不翻转“lat”和“lon”列才能获得远程正确的图片。
用户界面:
library(shiny) …Run Code Online (Sandbox Code Playgroud) 我将raster带有 4 个类的 a转换为 a SpatialPolygonsDataFrame,其中表示类的特征并不总是连接的。我使用disaggregate(package sp) 来获取单个功能。
我现在想摆脱所有这些小于 3000 平方米的功能。我已经使用poly.areas(包 GISTools)生成了该区域,并将信息作为属性添加到 Shapefile 中。
小特征应与其周围的特征合并。
有谁知道如何解决这个问题?unionSpatialPolygons仅适用于 ID,不适用于属性条件。
我想在其中绘制一个有多个孔的多边形,如下所示:
P = [
0.5, 0.8;
1.0, 0.0; % outer boundary
0.0, 0.0;
0.5, 0.8;
%{
%}
0.5, 0.3;
0.3, 0.1; % inner boundary I
0.7, 0.1; % (hole)
0.5, 0.3;
%{
%}
0.5, 0.6;
0.3, 0.4; % inner boundary II
0.7, 0.4; % (hole)
0.5, 0.6;
];
figure, clf, hold on
patch(P(:,1),P(:,2), 'r', 'linestyle', 'none')
Run Code Online (Sandbox Code Playgroud)
但是,patch并不像我预期的那样工作.当我将最后一个洞更改为:
% ...
0.45, 0.6; % <- slightly offset in X-direction
0.3, 0.4;
0.7, 0.4;
0.45, 0.6; % <- slightly offset in …Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,用于从文本文件中的给定 GPS 位置绘制移动路径。到目前为止,我已经成功加载数据并绘制路径。我的解决方案是,路径必须绘制为矩形,因为它包含数据(例如颜色和宽度)并且可单击。Line 无法做到这一点。此外,当这些矩形旋转时,它们之间也有一个三角形间隙,所以我用三角形填充它。并且路径必须是双路径,因为我还有另一个数据要显示在第二层上。这意味着,要为更长的路径绘制大量多边形。
我在15公里的旅程中尝试过这个,需要1000行gps数据。当我解析该文件时,它为两个图层总共绘制了多达 5000 个多边形。
我的问题是,当它绘制多达 1000 个多边形的形状时,应用程序变得迟缓,没有响应。如果我让线程休眠 1 秒,似乎没问题。但速度更快了,就变得没反应了。
我一直在网上阅读此解决方案并找到它。仅供参考,我已经创建了另一个线程来处理文本文件。我还通过让应用程序在不绘制多边形的情况下完成该过程来缩小问题范围,并且该过程很顺利。我读到没有其他方法可以处理主线程之外的多边形。
更新:我正在使用 Asynctask 后台从文本文件中读取一行,将其解析为包含纬度、经度、Value1、Value2 的数组。然后在那里进行大量的计算。每行完成后,我将对象发送到 onProgressUpdate,以使用标记、折线和形状更新 UI 线程。
这是我的异步任务
private class DrawPathAsync extends AsyncTask<File, Object, Void>
{
FileInputStream is;
BufferedReader reader;
@Override
protected Void doInBackground(File... params) {
File sFile = params[0];
Integer count;
String line = "";
double radius = 8; //8 meter
double distance;
double Heading_y;
int kaler, gkaler;
double apprate, gi;
if (sFile.exists()) {
try {
is = new FileInputStream(sFile);
reader = new BufferedReader(new InputStreamReader(is));
reader.readLine(); …Run Code Online (Sandbox Code Playgroud)