文件交换

图像缩略图

geom2d

版本1.25(427 KB)通过 大卫Legland
几何库MATLAB。执行对点,线,圆,多边形几何计算...
4
37级

63个下载

更新2019年9月26日

查看许可证

编者按:此文件被选为MATLAB Central本周的挑选

几何库来处理和可视化几何元素,如点,线,圆和椭圆,折线和多边形...
我们的目标是为操纵的几何图元,从而更容易更复杂的几何算法的开发提供了一个低级别的库。
图书馆建议功能:
*使用直观的语法创建各种形状(点,圆,直线,椭圆,折线,多边形)。例如:createCircle(P1,P2,P3),以创建通过3点的圆,创建平行和垂直线
2线之间*计算交点,线和圆之间
*上线与多边形工作:计算质心和面积,扩大,夹子与半平面...
*测量距离,角度(α线,3点之间),或测试的几何形状(在一行点,圆上的)(分,一个点和一条线,一个点和一组点之间)。
*操纵平面变换。例如:P2 = transformPoint(P1,createRotation(CENTER,THETA));
*绘制形状容易。例如:画圆([50 50],25),的drawLine([X0 Y0 DX DY])。一些限幅为无限的形状,例如线或射线进行。
其他帮助在GEOM / Contents.m文件,以及像“points2d.m”或“lines2d.m”摘要文件提供。
注:该项目已合并了geom3d库(FEX 24484),和现在托管在GitHub上:https://github.com/mattools/matGeom

引用作为

大卫Legland(2020年)。geom2d(//www.tianjin-qmedu.com/matlabcentral/fileexchange/7844-geom2d),MATLAB中央文件交换。检索

评论和评级(112

大卫Legland

嗨休伯特
谢谢你的建议!我有固定的文件。新版本可以在GitHub上,并且将包含在下一版本。
最好,
大卫

*
%以前版本
%A = ABS(ATAN2(V(2),V(1)) - ATAN2(U(2)中,u(1)));
%新版本
A = ABS(MOD(ATAN2(V(2),V(1)),2 * PI) - MOD(ATAN2(U(2)中,u(1)),2 * PI));

嗨大卫,
我遇到了一些麻烦与我的一些点的云你minimumCaliperDiameter.m功能。
看来问题就来了,因为你的vectorAngle.m功能的角度评价。
我改了一点只是你ATAN2增加MOD()()的结果:
%以前版本
%a=abs(模数(atan2(v(2),v(1)),2*pi)-mod(atan2(u(2),u(1)),2*pi));
%新版本
A = ABS(MOD(ATAN2(V(2),V(1)),2 * PI) - MOD(ATAN2(U(2)中,u(1)),2 * PI));

我希望它不会影响你的其它功能正常functionning但我的应用程序,它的确定。

感谢您的工作!

大卫Legland

喜迪,
这实在奇怪......我看看,但无法重现......我只是固定在这个功能有些过时的调用;如果你可以打开的代码显示PBM样本的问题,这将是伟大的!

大卫,
我做这个函数[imInscribedCircle]的输出不太understand.The半径变“INF”有时,甚至在你把它provided.How可以成为无限的例子吗?

大卫,
谢谢你的答复和帮助,这是非常有用的me.Have好日子。

喜迪,
我写了这样的功能。这是“MatImage”工具箱的一部分(https://github.com/mattools/matImage)。
适用于二进制或标签imags。你从GitHub上得到它:https://github.com/mattools/matImage/blob/master/matImage/imMeasures/imInscribedCircle.m

大卫,
我有一个问题,这个软件包或其他软件包是否包含一个算法来寻找标签图像或bw图像的最大内接圆?
非常感谢你!

大卫,

感谢您一个伟大的图书馆。我一直在使用这两种geom2d和geom3d至少五年了。

我刚刚下载了最新的版本,发现isAxisHandle功能从geom2d zip文件丢失,但在各自的工具箱是可用的。

最好,
BU

大卫Legland

@joe哈伯德:你是什么意思?你可以对你遇到的错误或问题更具体?

乔·哈伯德

向量似乎并没有被正常

大卫Legland

你好,卡莱什,
您可以使用下面的代码作为基础例如:
图1);CLF;坚持,稍等;
drawEllipse([50 50 40 20 30]);
轴相等;轴([0 100 10 90])
此处吸入(50,50)为中心的椭圆形,与轴线长度等于40和20,以及30度的取向。您可以通过键入“帮助drawEllipse”获取更多的信息。

嗨,你能解释机能的研究drawEllipse(varargin)是如何工作的?
凡进入输入等?

汇华赵

伟大的东西,做的工作非常好!
我有一些问题,使动画因为无法刷新数据全部战平*功能。我可以使用删除手柄的方法来实现我需要什么。
底线,伟大的东西!
非常感谢你。

大卫Legland

@伯克:是的!它最初是为后来的Matlab版本开发的,我试图保持它与大多数Matlab版本兼容。

嗨,
它与R2013b工作?

亚伦张

大卫Legland

@mazen哈基姆:模块图“目前没有与“geom2d”工具箱包装。您可以在父MatGeom项目相关的功能,在GitHub的库托管:https://github.com/mattools/matGeom。该“drawGraph”功能,可以在这里找到https://github.com/mattools/matGeom/blob/master/matGeom/graphs/drawGraph.m
最好,
大卫

我怎么能找到geom2d drawGraph功能?

大卫Legland

@我刚提交了一个新版本,应该可以解决clipEdge中的问题。(问题是关于检查一个点是否属于边,但现在应该解决)。
@Xiadong:在geom2d的vecnorm功能已经过时了很长一段时间(2009年以来实际上...),并通过“vectorNorm”功能已被替换。

希望这可以帮助。

晓东

错误报告:基于MATLAB 2017b预发布,也许也正成为未来正式Matlab的2017b,该vecnorm功能与内置的MATLAB函数名称冲突。你可以将其重命名,以避免这个矛盾呢?只是为了让你知道,我发现这个问题上运行2017b次发行前一段时间。谢谢!

Nishath拉纳辛哈

林肯利

报告bug。
对于功能clipEdge,我在下面运行

边缘= [102.5260 -1.8235 91.5926 12.6135];
框=[0 100 0 100];
clipEdge(边缘,箱)

结果为101.1450 0 91.5926 12.6135

Nienke

大卫Legland

嗨,晶晶,
所述polyxpoly功能需要的映射工具箱,因此增加了一个依赖。该interX功能通常作品很好,可你描述的情况下,失败?
反正,我已经更新了intersectPolylines功能,避免调用interX功能(简单地通过调整interX的代码,直接进入intersectPolylines)。
问候,

谢谢你给我的很棒的包裹。
不过,我觉得在一个bug功能intersectPolylines,基本上都使用本地函数P = InterX(L1,varargin)。
你可以使用嵌入功能polyxpoly和忽略此错误功能。

大卫Legland

嗨Saunhita,
我已经更新,包含丢失文件的修改版本。
问候,

您好大卫

首先感谢大家的真棒包。但isAxisHandle功能缺失在工具箱中。能否请您上传。TIA。

大卫Legland

你好Lockywolf,

这可能是一个数值精度的问题,在嘈杂的数据和/或GUI交互的结果下,很快就会出现问题。
我试图更新库,使其一点更稳健,特别是现在可以指定一个“宽容”参数设置为polygonLoops功能。这允许调整检测到顶点相似,或如何在边缘交叉十字路口的处理方式。默认为1E-14,但使用较大的值(1E说-12,或为1e-10)应提供更好的结果。

希望这可以帮助?否则随意打开的MatGeom GitHub上的问题(最好用流动的例子......)

问候,

Lockywolf

大家好。首先,这个包是美好的,真的。

其次。polygonLoops代码中似乎有一个bug。

当多极不规则有很多自过路的代码抛出异常。
我不是特别清楚如何重现它,但本质上,每天都要工作我尝试一种“画一个点”的一个imfreehand时间,关闭它,并把结果反馈到polygonLoops。

无论如何,感谢您的工作。

大卫Legland

嗨Scrat,
可以使用“distancePointPolygon”功能,采用圆心作为第一个参数(如N×2阵列),并且正方形顶点作为第二个参数(如4×2阵列)。
问候!

Scrat

你好,
假设我有广场和三个圆的正方形内。IST可能测量到方形周边从所述质心的每个圆圈的最短距离。
如果是的话,其是我可以使用的功能,
谢谢

大卫Legland

嗨Thayes,
遗憾的延迟......我没有回答你的问题。我也有使用polygonSelfIntersection功能,我认为需要额外的处理,但不是那么容易实现...

大卫Legland

嗨平流层,
可以计算与在各种角度射线或线多边形的交叉点。您可以使用createRay用于创建射线,intersectRayPolygon函数计算的交叉点。

平流层

你好,

是否有可能以同等角度中心点多边形找到交点?我的意思是我想选择多边形上的一个点N1,然后找到下面的[N1,N2,...,N36]多边形点这样的:

N1和中心=西塔之间的夹角
N2和中心=西塔+ 10之间的角度
N3和中心=西塔+ 20之间的角度
N4和中心=西塔+ 30之间的角度
...
N36和中心=西塔之间角度+ 350

哪些功能可以帮助我吗?谢谢。

嗨,
我有所有的自相交去除上,我们究竟怎么会这样重新排序的多边形的点解决这个问题?我试图玩弄的polygonSelfIntersection和polygonLoops功能,但仍然没有想出如何重新排列点。谢谢

菲利普

大卫Legland

嗨Filipp,
函数“projPointOnPolygon”不依赖于任何工具箱,所以我不明白,在速度上的差异。底层功能是“distancePointEdge”,即我尝试使用bsxfun优化。做大量的顶点没有工作?你有没有试过来分析,以确定其中的代码是慢?(您可以通过邮件联系我,这将是更容易交换)
问候,大卫

菲利普

嗨,我有一个关于projPointOnPolygon函数的问题。它在一个使用matlab2014b(没有安装工具箱)的系统上运行非常慢,但是在另一个安装了matlab2012的系统上运行正常(大多数工具箱都安装了)。它在使用工具箱吗?是否有其他原因导致它如此慢(考虑到第一个系统甚至有更多的RAM)?谢谢您!

埃里克

大卫Legland

@Tao:
在这种情况下,你建议,多边形的边的测试线相重叠。该功能intersectLinePolygon不处理这种退化情况。可以通过稍微移动例如测试线避免它。

我大概在intersectLinePolygon.m遇到了一个错误

我通过以下方式调用此函数:

线= [0 11.8760 1 0];
偏移= [-6.0960 11.8760;
-6.0960 11.6760;
-6.7870 11.6760;
-9.1180 11.8330;
-9.1180 11.8760;
-6.0960 11.8760];
交叉= intersectLinePolygon(线,偏移)

然后我得到:交叉=

-6.0960 11.8760

但它应该为:交叉=

-9.1180 11.8760
-6.0960 11.8760

对于其他情况,它工作得很好,除了这一个。

你可以解决这个问题?我的MATLAB版本是:R2012a

大卫Legland

@Jan:
我已经更新了新版本,与medialAxisConvex一些更新。它适用于我已经测试了几个多边形。我希望这将满足您的需求。
问候,

我试图运行demoMedialAxis和得到这个错误:
???使用错误==> vertcat
CAT参数尺寸并不一致。

误差在==> medialAxisConvex在123
事件=[事件;ir(1)i品脱(1,:)ti(1);ir(2)i品脱(2,:)ti(2)];%#正常

可能有一些问题,分数相加。你知道哪里吗?
谢谢

大卫Legland

@bn dhouba:
在geom2d的边缘应被理解为“线段”。是两个末端限定,且被限制在一组这两个点之间的点。在“线”对象的工作职能认为无限straigt线。希望这使得事情更清晰?问候,

嗨,我真的很欣赏这个包裹真的很有趣。我只是不明白函数DrawEdge或intersedges中edge的确切含义,你的意思是简单的line?是一样的吗?
诚挚

大卫Legland

嗨威廉,
功能meshVolume和polygonArea依赖于面(或顶点)取向。如果所有的面朝外,体积将是积极的。如果所有方面都向内的数控车床,你将获得量的负值。只是要小心,以确保面取向是一致的(例如使用checkMeshAdjacentFaces)

威廉

我似乎得到使用meshVolume功能的负积...
我试图计算出柔韧的开放式圆柱体的体积,使用从等值补丁产生的面和顶点。有什么想法吗?

大卫Legland

嗨碧玉,
感谢您指出的错误!我已经发布了一个新版本,应该修复它。告诉我,如果仍然存在问题。
大卫

Jdeen

我相信我发现了clipEdge功能中的错误,但是没有调查完全错误是什么时候。然而,对于每个盒呼叫clipEdge(allEdges,箱)代替clipEdge(oneEdge,框)时的结果可以是不同的。实例变量在哪里可以在这里找到出现错误:http://codepaste.net/sd1k8o
边行排名第四的一次裁剪所有边缘时,不正确修剪。

这是在计算几何初学者宝。
非常感谢,

法迪

菲利普

嗨大卫,
非常感谢您的建议。使用Delaunay三角听起来很有道理,我一定会努力的!
问候,
菲利普

大卫Legland

嗨Filipp,
我觉得你的问题是密切相关的图论汉弥尔顿路径。也许你可以尝试做的是创建点的Delaunay三角。这将产生一组三角形,可以转换成一组不自相交的边缘。边的集合形成一个图,然后你可以找到或编写发现,通过每个顶点去一次且仅一次的哈密尔顿路径的算法。希望这给人的想法...

通过“排序”的顶点,我的意思发现指数是需要考虑的顺序。也许术语“限令”会更合适。这样做是为了保持原有阵列不变,只有在顶点索引工作。但是,这只是技术性的考虑。

问候,
大卫

菲利普

嗨大卫,
感谢您的耐心:-)第二种选择将是一个我正在寻找:找到通过一组(随机)点,而自相交会的路径。我已经尝试蛮力方法:选择一个随机起点,一个接一个连接点,回去的时候发现十字路口。然而,这是极其昂贵的,似乎没有什么是完美的解决方案。那么,你是什么排序的兴趣顶点是什么意思?
问候,
菲利普

大卫Legland

嗨Filipp,
我不知道真正理解你的问题...你想画一组点的凸包?或者某种路径的经历一组点的不自相交?在这两种情况下,你首先需要绘制它们之前识别和/或排序的兴趣顶点。

菲利普

嗨大卫,
感谢您的答复。我已经试过这两个功能,然而,无论是允许交集。因此,他们不导致与单周轮廓的形状,但在交叉线混杂在一起。你有另外一个设想是如何从众多的随机点创建封闭轮廓?
问候,
菲利普

大卫Legland

嗨filipp,
是的,你可以使用(在“多边形”子包)的“drawPolygon”或“fillPolygon”的功能之一。希望这可以帮助 ?

问候,
大卫

菲利普

嗨大卫,
我寻找一种方法来显示的多边形不相交面(即,形状,其具有一个轮廓)。这是功能的你的包或matgeom可用?如果没有,你有一个想法,以实现这个?
谢谢!

最后,工作好!现在,对于真正的乐趣!谢谢,再次,拉尔夫

谢谢你,大卫,
也许我走出我的深度在这里,但GEOM看了理想创造的有机增长事件模拟作为除了JDK。将它并非没有Matlab的工作吗?
拉尔夫

大卫Legland

你好,拉尔夫,
有没有需要下载Java使用这种贡献。你下载后得到的是一个包含了一组“.M”文件,在一个小目录树状,应该用Matlab运行一个zip文件。
希望这使得事情更清晰?
大卫

拉尔夫Trimnell

可能有人解释如何获取Java承认GEOM我试图粘贴整个JAR到JDK:没有好!我把它的地址在系统环境路径:没有好。提取完毕,它就不再是一个jar文件,只是有extention GEOM。应该有一个简单的方法来做到这一点。我使用的是Windows 8.1中的记事本。谢谢

大卫Legland

喜加里,

在“膨胀”或多边形的“侵蚀”依赖于多边形的方向(逆时针或顺时针)和所述距离的符号。如果多边形是CCW和距离为正,结果将被扩大。

我已经提交了新的版本,即修复了一些错误。这似乎更好地工作。

问候;

功能expandPolygon似乎有一些问题。

下面缩多边形而不是将其展开:

SQ1 = [-10.28,-15.39; -17.28,-4.611; -11.89,-1.110; -4.890,-11.89]
Sq1=[Sq1;Sq1(1,:)];
Sq1e = cell2mat(expandPolygon(SQ1,1));

并且,以下内容会在函数中生成错误:

平方= [[-10,-5];[-10,5];[-5,5]。[-5,-5]];
SQ1 =(SQ * [cos(33 * PI / 180)-sin(33 * PI / 180); SIN(33 * PI / 180)COS(33 * PI / 180)]”)* 9/7 - 3;
Sq1=[Sq1;Sq1(1,:)];
Sq1e = cell2mat(expandPolygon(SQ1,1));

错误消息是:

试图访问聚(0,:);指数必须是
正整数或逻辑。
误差在distancePointPolygon(线19)
如果总和(聚(端,:)==聚(1,:))〜= 2
误差在distancePolygons(线19)
DIST2 =分钟(distancePointPolygon(POLY2,POLY 1));
expandPolygon出错(第63行)
distLoop(1)= distancePolygons(环{I},聚);

正是我一直在寻找。有据可查的,易于使用。谢谢!

不错的工作。

渣子

非常好的作品...谢谢

大卫Legland

你好,苏米莎,
用于表示线基本格式为[X0 Y0 DX DY],其中(W0,Y0)是指起源点,和(DX,DY),以方向矢量。您可以创建一个垂直线与方向THETA:
第1行= [X0 Y0 -sin(THETA)COS(THETA)];
的drawLine(LINE1);
问候。

sumitha

嗨,u能请建议我其中的这些我可以用它来画一条线垂直于给定方向(弧度)一个或者ü可以PLZ给我一个想法我怎么可以用相同的继续进行。

嗨本杰明,多边形的裁剪不是一个简单的问题。有高效的算法,并且将其列入计划,但我仍然没有找到时间把它们写下来。这似乎工具箱为此提供设备的映射,也许你可以检查一下。
问候,大卫

大卫您好,感谢伟大的工作。我一直在使用你的clipPolygon成功为裁剪凸多边形,但现在我还需要它的非凸多边形......你打算包括本在未来的版本?

SHAFIQUL

非常好和必要的编码感谢分享。

请人帮我

大卫Legland

@Frank:是的,有这个功能,一个愚蠢的错误。我已经提交了修正它的增强版本。
问候,大卫

嗨,看起来像一个可爱的小工具箱!
我只是想你的函数“intersectLineCircle.m”。不幸的是,它似乎代码没有给出切线(返回“南”)和线的正确答案这是不是在所有交叉(给人一种错误的交叉点)。

下面是我使用的数据:
C1 = [0 0 0.5]
L1 = [0.5 0 0 1]%切线
L1 = [-1 0 0 1]%的非接触
PTS = intersectLineCircle(L1,C1)

干杯,
坦率

geom2d是一流的补充提供的几何形状的工具。
大卫:你应该添加一个2D阿尔法形状程序。我测试这一块的那一刻,但叶子很多改进的余地。//www.tianjin-qmedu.com/matlabcentral/fileexchange/6760-ashape-a-pedestrian-alpha-shape-extractor

大卫Legland

嗨克里斯,
与直线/圆弧圆的交点暂时不考虑实施,中庸之道,因为我并不需要它尚未...但我会努力实现它在将来的版本。
问候。

嗨,这是对我来说非常有用吗?我只是想知道为什么我没有找到一个线和圆之间获得交点的功能?谢谢。

干得好,大卫!

OK,我想这应该工作,规避EPS。再次,看着中心点,而不是终点。这一次的中心点段。它仍然需要在多个边缘片段显示机箱内一些故障安全码,由于有限precission。该代码也应保持边缘的“方向”,因为你以前的代码。
这里clipEdge的conplete代码:

%处理数据输入
如果尺寸(框,1)== 1
盒=盒([1 3 2 4]);
结束

%得到窗口的限制
XMIN =箱(1);
YMIN =盒(2);
XMAX =盒(3);
YMAX =盒(4);

%将窗口限制转换为线条
lineX0 = [XMIN YMIN XMAX-XMIN 0];
lineX1 = [XMIN YMAX XMAX-XMIN 0];
lineY0 = [XMIN YMIN 0 YMAX-YMIN];
lineY1 = [XMAX YMIN 0 YMAX-YMIN];

边缘2 =零(大小(边缘));

对于i = 1:尺寸(边缘,1)
%当前边缘
iedge =边(i,:);

与包围窗口的每一行计算%交点
px0=交叉线边缘(lineX0,iedge);
PX1 = intersectLineEdge(lineX1,iedge);
PY0 = intersectLineEdge(lineY0,iedge);
PY1 = intersectLineEdge(lineY1,iedge);

%创建点的数组
点= [PX0;PX1;PY0;PY1;iedge(1:2);iedge(3:4)];

%和除去无穷点(边缘平行于盒边缘)
点=点(所有(ISFINITE(点),2),:);

用x那么y%排序点
点=调用sortRows(分);

点之间%GET中心位置
=的centerPoints(点(2:端,:)+点(1:结束-1,:))/ 2;

%找到的centerPoints(如果有的话)内的窗口
插件=找到(的centerPoints(:,1)> =&XMIN的centerPoints(:,2)> = YMIN&...
的centerPoints(:,1)<= XMAX&的centerPoints(:,2)<= YMAX);

如果%内盒的多个段,其可以以有限的分辨率,由于发生,只需要最长时间段
如果长度(英寸)>1
DV =点(INS + 1,:) - 点(插件,:);%所述段的Δ矢量
LEN = hypot将(DV(:,1),DV(:,2));段的长度%
[a,I]=max(len);%查找最长段的索引
插件=插件(I);
结束

如果长度(INS)== 1%,如果中心点中的一个是内框,则根据边缘片段是盒球铁QT500
如果边(i,1)>边(i,3)||(边(i,1)==边(i,3)&&边(i,2)>边(i,4))%恢复边缘的相同方向
边缘2(ⅰ,:) = [点(INS + 1,:)点(INS,:)];
其他
边缘2(ⅰ,:) = [点(INS,:)点(INS + 1,:)];
结束
结束
结束

哎呀,别提了。我的解决方案有DIV 0的问题。整个EPS的东西真的在痛...

原来我的建议上面介绍负数的问题。下面的代码应能正常工作:

%ins=find(points(:,1)-xmin>=-eps&points(:,2)-ymin>=-eps&。。。
%点(:,1)-xmax <= EPS和点(:,2)-ymax <= EPS);
ins=查找((points(:,1)/xmin-1)*符号(xmin)>=-eps&(points(:,2)/ymin-1)*符号(ymin)>=-eps&。。。
(点(:,1)/ XMAX-1)*符号(XMAX)<= EPS和(点(:,2)/ YMAX-1)*符号(YMAX)<= EPS);

此外,在clipEdge(),你应该改变限制检查。请参见下面的代码。更改注释,以建议。

干杯,
雷托

%ins=find(points(:,1)-xmin>=-eps&points(:,2)-ymin>=-eps&。。。
%点(:,1)-xmax <= EPS和点(:,2)-ymax <= EPS);
插件=找到(点(:,1)/ XMIN-1> = - EPS和点(:,2)/ YMIN-1> = - &EPS ...
点(:,1)/ XMAX-1 <= EPS和点(:,2)/ YMAX-1 <= EPS);

你好,
又有些麻烦,数量大,限制检查。这一次在isPointOnEdge,其用于intersectLineEdge,这又在clipEdges被使用。
isPointOnEdge不会具有大量坐标正常工作,因为你申请一个固定的容差。然而,MATLAB的数值公差是相对于数字本身。
我分别归一化的点和边缘的x和y的元素的点的x和y。就像你将在1范围内与数字打交道,你的宽容检查将正常工作。
请参见下面的代码。请注意,我也甩Np的==氖检查,因为它没有做任何事情。
问候,雷托

%提取计算公差
TOL = 1E-14;
如果〜的isEmpty(varargin)
TOL = varargin {1};
结束

边缘和点的数目%
NP =大小(点,1);
NE =尺寸(边缘,1);

%适应的输入大小
X0 = repmat(边缘(:,1)”,NP,1);
Y0 = repmat(边缘(:,2)”,NP,1);
DX = repmat(边缘(:,3)”,NP,1)-x0;
dy=repmat(边(:,4)’,Np,1)-y0;
xp=repmat(点(:,1),1,Ne);
YP = repmat(点(:,2),1,NE);

%归一化的x,y以XP,YP
X0 = X0 / XP;
Y0 = Y0 / YP;
DX = DX / XP;
DY = DY / YP;
XP = 1;
YP = 1;

%试验如果点位于支承线万博1manbetx
B1 = ABS((XP-X0)* DY - (YP-Y0)* DX。)./ hypot将(DX,DY)

%检查点是否位于边边界之间
%的使用取决于线的角度不同的测试
ind=绝对值(dx)>绝对值(dy);
T =零(MAX(NP,NE),1);
吨(IND)=(XP(IND)-x0(IND))./ DX(IND);
吨(〜IND)=(YP(〜IND)-y0(〜IND))./ DY(〜IND);
B = T> -tol&T-1

大卫Legland

嗨,
这是一个好主意,远比处理EPS更方便。我很快就会实现它。
感谢意见!

嗨大卫,
新的限制检查假定线的方向向量也有类似规模的边框,这是不正确necessarely。方向矢量常常具有1的量值,而边界框可以是数值非常大。

以下是一个想法及其背后的想法:
正在检查的边缘的端点是边界框内。当然,终点总是在边界框,让你碰上数值precission问题。那么,为什么不检查边缘的中心是在箱内?这样,你从限制线与水平线和垂直线的例外是客场。在这两种情况下,你不应该有任何问题的数值,因为它们是直角。

因此,我将重新编写限额检查如下,并完全放弃每股收益:

%检查边缘中心是否在边界内
edgeCenterX =总和(边(i,[1,3]))/ 2;
xMinOk = XMIN <= edgeCenterX;
xMaxOk = edgeCenterX <= XMAX;
edgeCenterY =总和(边(i,[2,4]))/ 2;
yMinOk = YMIN <= edgeCenterY;
yMaxOk = edgeCenterY <= YMAX;

这个对我有用。

大卫Legland

嗨雷托,

感谢您的众多和建设性的意见。我已经发表了考虑到你改正的新版本。我会尝试修改传播到其他绘图功能。

对于限制检查,我使用了一种不同的策略,但它似乎也适用于大花束盒。告诉我是否还有问题。

也可以考虑重新编写添加精度极限检查的过程如下:

xOk=xmin*(1-eps)-最小(边(:,[1,3]),[],2)<0&max(边(:,[1,3]),[],2)-xmax*(1+eps)<0;
YOK = YMIN *(1-EPS)-min(边缘(:,[2,4]),[],2)<0&最大值(边缘(:,[2,4]),[],2) -YMAX *(1个+ EPS)<0;

这将考虑限制箱的规模。与原来的代码运行到precission问题时,箱子有大量的(我与数字打交道的1E9范围内)。像这样的精度是相对的而不是绝对的。

然而,一个其他的bug。该库是一个良好的开端,但绝对没有准备好来回黄金时间。
在CLIPLINE()有不正确的索引。修正如下。考虑使用的drawLine()此固定功能(见的drawLine错误上述())。

在每个方向上的边缘的结果的%检查边界

%索引不正确,索引的是边,而不是框
%xOk = XMIN分钟(边缘(:,1:2),[],2)%YOK = YMIN分钟(边缘(:,3:4),[],2)

%这是正确的索引
xOk = XMIN分钟(边缘(:,[1,3]),[],2)YOK = YMIN分钟(边缘(:,[2,4]),[],2)

哎呀,现在我的更正取代了原来的更正。你可以看出我是这个系统的新手。。。
所以,在这里再次完整的建议修正的drawLine()。
原始代码将绘制水平线,即使它们的轴线之外。它也将画线在象限到右侧和下方的轴。

沿x%排序点的坐标,并绘制之间的行
%这两个中间
点=调用sortRows([PX1; PX2; PY1; PY2],1);

如果ISFINITE(点(3,1))%如果不是水平或垂直
点=点(2:3,:);
还有其他%水平或垂直
点=点(1:2,:);
结束

如果点(1,1)> = XMIN &&点(2,1)<= XMAX && ...
点(1,2)> = YMIN &&点(2,2)<= YMAX

H(I)=行(点(1:2,1),点(1:2,2));

如果〜的isEmpty(varargin)
组(H(i)中,varargin {:});
结束

其他
h(i)=-1;
结束

对不起,校正校正:

如果点(1,1)> = XMIN &&点(2,1)<= XMAX && ...
点(1,2)> = YMIN &&点(2,2)<= YMAX

有一个在intersectEdges一个bug()。更改线路143和144

X0(下)= NaN的;
X0(下)= NaN的;



X0(I(下))= NaN的;
Y0(I(下))= NaN的;

否则索引是不正确,你会得到错误的结果。

@马修:
我在“心”的功能,以及其他许多人提交了新的版本,该修补的bug。
当做

马修

次要(但致命的)错误在centroid.m找到用于计算2D对象的质量加权质心。

从文件的更改行69:

中心=平均(PTS * repmat(质量,1,3));

中心=平均(PTS * repmat(质量,1,2));

或者,它会用标分配尺寸不符的错误...点是2列的矩阵,而不是3列的矩阵。

嗨亚历山大,
目前有针对的drawRect功能没有额外的参数。
要指定图形绘制的,最好是用数字(...)调用的drawRect,最终,以避免清算以前的图像使用前举行。
要更改矩形的颜色或宽度,您可以使用该函数返回的句柄:
HR = drawRect中([X0 Y0 W H]);
集(小时, '颜色', 'R', '线宽',4);

我需要的功能的drawRect帮助。
这个功能可以有更多的参数呢?(像:图像在其上放置矩形,矩形的颜色...)

我有这部分代码
图片=双(imread( 'test2.jpg'));
IM =的drawRect(...
图片,...
轮((VJ(位置,2) - 1)* +的sF 1),...
轮((VJ(位置,2)+ velicinaLica(1) - 1)* +的sF 1),...
圆((VJ(POS,3) - 1)*的sF + 1),...
轮((VJ(正,3)+ velicinaLica(2) - 1)* +的sF 1),...
[1 0 0] ...
);

大卫Legland

哎呀,对不起,纠正严重错误...
新版本已提交,与修改建议。也有多边形和折线(见例如“帮助polygons2d”或“帮助polylines2d”)的一些新功能

我测试了一些其他功能。非常有用的确!谢谢。

该文件intersectLinePolygon.m仍然包含在地方“相交”的“圆周率”。历史上说,它已被取代,但它尚未更换。我下载的zip文件于2009年7月22日。

此外,这里是一个清晰的(当然等同方式)来进行更新:

相交= [];
对于i = 1:长度(边缘)
P0 = intersectLines(线,createLine(边缘(I,1:2),边缘(i,3:4)));
如果isPointOnEdge(P0,边缘(i,:))
相交= [相交;P0];
结束
结束

这个库和它的同伴,geom3d,被闪闪发光的宝石 - 对二维和三维空间物体在做不平凡的计算是必不可少的。

顺便说一句,保留所有文件的geom2d目录和目录添加到您的路径。然后,您可以键入“help geom2d”或“DOC geom2d”,并获得在命令窗口或帮助窗口正确链接帮助文本。该Contents.m文件是正确的“MATLAB的方式”提供的文档。

大卫Legland

嗨,

我已经提交了新版本,修复了intersectEdges的bug,以及用于操纵折线(交叉口,距离点...)增加了新的功能。请不要犹豫,报告bug(直接邮件优先)。

在“P1”变量(参见失读的评论)是不应该导致问题,因为它位于一个函数中。该图书馆的目的主要是为了隐藏计算细节与显名的功能,而不必阅读内码。然而,变量“圆周率”更合适(希望明确)的名称改名。

问候,大卫

格雷格

我已经试过功能intersectEdges却发现某些情况下mishanlded等。

嗨,什么变量/功能“PI”的名声,我的意思是:

“PI = intersectLinePolygon(线,点)”

我有一个头痛试图发现什么是错的这个文件(因为在理论上它应该工作),这是一个非常大的项目,我在工作的一部分。

最后,我发现了“圆周率”的问题,“PI”是存在于代码,但我也不得不与PI工作= 3.1415 ......,这CR * MATLAB的对糊涂了。数学哦!,我有这样美好的回忆......

当然,也不是那么聪明呼叫几何脚本变量/功能“PI”。此外,正如彼得说是非常糟糕的评论(发现错误),所以不放心多这一个。

Nilimb Misal

在实现更复杂的几何形状的算法非常有帮助

马修·戴维森

drawLabels实际上并没有得出任何标签...

彼得Gurk

试图circleaspolygon和rectaspolygon但均不能自给,严重解释。该软件包似乎很有前途,但远没有即插即用。

斯蒂芬·麦克尼尔

几何分析非常方便的功能

更新

1.25

重命名inertiaEllipse到equivalentEllipse,加入principalAxes,各种错误修复。

1.24

增加新的功能多边形

1.24.0.0

多边形的新功能:polygonInertiaEllipse.m,polygonSecondAreaMoments.m,boxToPolygon;还提高了一些功能数值精度。

1.23.1.0

更新项目链接

1.23.0.0

*增加了新的功能:randomPointInPolygon,resamplePolygonByLength,polygonEdges
*改进的计算精度为几个功能(例如isPointOnEdge,isParallel / isPerpendicular ...)
*更新intersectLineCircle,minDistancePoints

1.22.0.0

在头文件的各种更新

1.21.0.0

删除许可声明

1.20.0.0

添加缺少公用设施目录,更新说明

1.19.0.0

多边形/折线自相交的更新计算,添加registerICP用于迭代最近点登记,添加一些功能(polygonSymmetryAxis,signatureToPolygon)。
删除了一些不推荐使用的函数。

1.18.0.0

更新medialAxisConvex,加smoothPolygon,smoothPolyline,findClosestPoint功能

1.17.0.0

修复了几个错误(clipEdge,removeMultipleVertices ...),各种文档更新,添加一些演示,多项式曲线

1.16.0.0

各种代码清理和文档更新

1.15.0.0

很多代码清理,新的功能与多边形工作,清理绘图功能

1.14.0.0

在intersectLineCircle修复的bug,添加minimumCaliperDiameter和averagePointSet一组点的。现在使用度代表形状

1.13.0.0

分裂库在几个包,添加几个功能(圈与圈线的交点,惯性椭圆的计算)

1.12.0.0

修复的bug(intersectLines,isPointOnEdge),删除过时的许可事项

1.11.0.0

bug修复(isPointOnEdge,intersectPolylines),删除过时的许可证信息

更新说明

更新文档,添加一些功能,修复了一些bug

MATLAB版本兼容性
创建了R2019a
兼容任何版本
平台兼容性
视窗 苹果系统 Linux的

geom2d /演示-geom2d /三角

geom2d /演示-polygons2d

geom2d /演示-polynomialCurves2d

geom2d / geom2d

geom2d / geom2d /私有

geom2d / polygons2d

geom2d / polygons2d /私有

几何2D/多项式曲线2D

geom2d / utils的