如何获得最大正交(垂直的)距离一组坐标

17日视图(30天)
我有数组X和Y的值,用于绘制图,找到点之间的最大距离(见图)。我现在要做的是找到最大距离,而是我想找2距离相互正交(perpandicular)的最大可能值。谢谢。
11日评论
现场马吉德
现场马吉德 2021年6月3日
是的这就是我寻找我完全卡住了,任何解决方案可以提供但是不雅的感谢,谢谢

登录置评。

接受的答案

为副总经理
为副总经理 2021年6月3日
编辑:为副总经理 2021年6月3日
我相信这可以更有效地完成,我希望有人动机来证明这一点。我欺骗利用polyxpoly(),但我讨厌做线十字路口和处理一系列的条件。我当然希望你有polyxpoly ()。
%生成随机点的戒指
一个= 0.2;% r方差
b = 0.1;% th方差
r = 100;%最大半径
th = 0:(2 *π/ 20):(2 *π* (1-1/20))+ b *兰德(20);
x = r * (1 a +兰德(20))*。* cos (th);
y = r * (1 a + a *兰德(20))。*罪(th);
%需要关闭多边形
x = [x x (1)];
y = [y y (1)];
D =√(x)。^ 2 +(等号。”)。^ 2);% /从所有点的距离
D (D < 1 e-6) =南;%去除self-distances
(Dn Nn) = max (D, [], 2);%最大化
% Dn是距离最远的邻居
% Nn是最远的邻居的指数
%找到最大距离向量
[距离,idx] = max (Dn);
mxidx = [idx Nn (idx)];
DVMx = x (mxidx)
DVMy = y (mxidx)
情节(x, y,”:o ');持有;
情节(DVMx DVMy,“b”)
平等的
%数字式电压表角
ang = atan2d (diff (DVMy) diff (DVMx))
%每个候选人垂直应该至少有一个顶点上的一个端点
%所以考虑所有顶点V除属于数字式电压表
% V找到距离对多边形的边缘
perplen = 0(元素个数(x) 1);
照片= 0(元素个数(x) 1);
piy = 0(元素个数(x) 1);
v = 1:元素个数(x)
%跳过如果V属于数字式电压表
如果ismember (v, mxidx);继续;结束
从V %项目一条垂线
px = x (v) +[1] *距离* cosd (ang + 90);
py = y (v) +[1] *距离*信德(ang + 90);
%之间找到路口垂直和多边形
[xi, yi] = polyxpoly (x, y, px, py);
% V的交集点,找到距离最大化
pid = [xi。' - x (v);彝族。“- y (v)];
[perplen (v) mpididx] = max (sqrt (pid (1:)。:^ 2 + pid (2) ^ 2));
%这是垂直的另一端的候选人
照片(v) = xi (mpididx);
piy (v) =易(mpididx);
情节([x (v)照片(v)], [y (v) piy (v)),“米”)
结束
%找到最大垂直的向量
[~,idx] = max (perplen);
DVPx = [x (idx)照片(idx)];
DVPy = [y (idx) piy (idx)];
情节(DVPx DVPy,“k——”,“线宽”,2)
这个天真的方法并不健壮的反例深凹多边形的特性或自交叉。我甚至不知道点排序问题供你使用。
实际上,这是一个很好的观点。这段代码假定x和y 命令。如果他们不是,多边形之间的吸引点可能会自交叉无稽之谈。
7评论

登录置评。

答案(1)

马特·J
马特·J 2021年6月4日
编辑:马特·J 2021年6月4日
我创建了一个替代 polyxpoly 在这里,
发现一行的交集和polyshape边界。
一旦你有了这个,这不是太难写代码,就会发现多边形的垂直的直线甚至有非常深的凹陷了,虽然我不知道这种情况实际上是相关的。下面我说明这与相同的高尔夫球棒形状的地区如我之前的评论。
负载(“多边形”,“pgon”)
(xl, yl) (pgon)边界框(=大小);托尔= min (diff (xl) diff (yl)) / 1 e6;
(xl, yl) = ndgrid (xl, yl);
警告
bbox = convhull (polyshape ([xl(:),我们(:))));
警告
dpgon =减去(bbox, pgon);
V = pgon.Vertices;nv =大小(V, 1);
IJ = nchoosek (1: nv, 2);
我= IJ (: 1);J = IJ (:, 2);
XY1 = V(我(:):)。”;XY2 = V (J (:):)。”;
N =元素个数(我);
dist =南(nv, 1);
i = 1: N
xy1 = xy1(:,我);xy2 = xy2(:,我);
= linexlines2D (dpgon、xy1 xy2);
= uniquetol(。托尔,“ByRows”1)。“;
如果大小(,2)> 2
继续;
其他的
距离(i) =规范(xy1-xy2);
结束
结束
[L, imax] = max(经销);
xy1 = xy1 (:, imax);xy2 = xy2 (:, imax);%最大限度分离顶点
dvec = [0 1;1 0]* (xy2-xy1);%垂直的方向向量
dvec结束(+ 1)= 0;
dvec = dvec /规范(dvec);
T = linspace (0, 1100);
有趣= @ (t) perpWidth (xy1 + t * (xy2-xy1)、pgon dvec);
[~,imax] = min (arrayfun(有趣,T));
tmin = fminsearch(有趣,T (imax));
[fval,] =乐趣(tmin);
xy3 = (: 1);xy4 = (:, 2);%最大垂直分离点。
% %阴谋的结果
情节(pgon);
持有
情节([xy1 (1) xy2 (1)]、[xy1 (2), xy2 (2)),“om”,“MarkerFaceColor”,“米”)
情节([xy3 (1) xy4 (1)]、[xy3 (2), xy4 (2)),“om”,“MarkerFaceColor”,“米”)
平等的
持有
函数(fval,) = perpWidth (xy, pgon dvec)
E =交叉(xy; 1, dvec);
= linexlines2D (pgon, E);
如果大小(2),< 2,fval = 0;= (xy, xy);返回;结束
[~,idx] =貂(vecnorm (out-xy 2 1), 2);
出= (:,idx);
fval = -vecnorm((: 1)两级(:,2),2,1);
结束

类别

找到更多的在图和网络算法帮助中心文件交换

标签

s manbetx 845


释放

R2021a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!

翻译的