确定投影点的位置在一个椭圆
7视图(30天)
显示旧的评论
接受的答案
马特·J
2022年12月16日
编辑:马特·J
2022年12月16日
使用
ellipseprj
下面的函数。它需要的下载
trustregprob
从文件交换
//www.tianjin-qmedu.com/matlabcentral/fileexchange/53191-quadratic-minimization-with-norm-constraint
ab = 1 [2];%半径椭圆
xy0 = [1];%椭圆中心
rad = 5;R = [cos (rad), sin (rad);罪(rad),因为(rad)];%椭圆倾斜
xysamp = randn (2、5);%随机点投射到椭圆
xyproj = ellipseprj (R *诊断接头(1. / ab。^ 2) * R, xy0, xysamp);%的投影点
% % %可视化
t = linspace(0, 2 *π,50)';
xyc = xy0 + ab。* cos (t) sin (t)) * R;%点绘制椭圆
情节(xyc (: 1) xyc (:, 2),“b -”)
轴平等的
网格在
持有在
情节(xysamp (1:), xysamp (2:)“罗”)%绘制随机点
情节(xyproj (1:), xyproj (2:)“ks”)%绘制他们的预测
线([xysamp (1:); xyproj (1:)], [xysamp (2:); xyproj (2:)],“颜色”,‘g’)
持有从
函数Xp = ellipseprj (X0, Q, xc)
%的项目有2 d点到2 d椭圆
%
% Xp = ellipseprj (X0, Q, xc)
%
%:
%
% Q, xc:椭圆方程矩阵。问2 x1, x2,我是2
%椭圆方程(y-xc)。* Q * (y-xc) = 1
% X0: 2 xn矩阵的投影点
%
%:
%
% Xp: 2 xn矩阵的投影点
N =大小(X0, 2);
我=我(:);
(Rt, D) = eig (Q);
Rt =实际(Rt);D =真正的(D);
iD =诊断接头(1. /诊断接头(D));
iDsqrt = sqrt (iD);
b = -iDsqrt * Rt。* bsxfun (xc @minus, X0);
Yp =南(大小(X0));
为i = 1: N
Yp (:, i) = trustregprob (iD、b (:, i), 1);
结束
Xp = bsxfun (Rt * iDsqrt * Yp @plus, xc);
结束
更多的答案(2)
约翰D 'Errico
2022年12月16日
编辑:约翰D 'Errico
2022年12月16日
简单。只是下载我distance2curve效用,发现在文件交换。
对于一些示例数据,我不知道你所指的弧度变量。
t = linspace(0, 2 *π,50)';
ab = 1 [2];
xy0 = [1];
rotmat = @ (R) (cos (R), sin (R);罪(R),因为(R));
xyc = xy0 + ab。* cos (t) sin (t)) * rotmat (5);
情节(xyc (: 1) xyc (:, 2),“b -”)
轴平等的
网格在
现在对于一个给定的点集,
xy0 = randn (10, 2);
xyproj = distance2curve (xyc xy0);
持有在
情节(xy0 (: 1) xy0 (:, 2),“罗”)
情节(xyproj (: 1) xyproj (:, 2),“rs”)
线([xy0 (: 1), xyproj (: 1)]”, [xy0 (:, 2), xyproj (:, 2))”,“颜色”,‘g’)
每个椭圆上的点投影到最近的点。
distance2curve找到免费下载的文件交换:
Torsten
2022年12月16日
编辑:Torsten
2022年12月16日
= 2;
b = 1;%主要轴
x0 = 1;
y0 = 1;%的翻译
α= 5;%旋转角的椭圆度
px = randn (10);
py = randn (10);%采样点投影
信谊θxp yp xp_given yp_given
%生成椭圆方程依赖θ
x = a * cos(θ);
y = b * sin(θ);
%求出θ,最小化的距离
f = (x-xp) ^ 2 + (y-yp) ^ 2;
df = diff (f,θ);
sol_theta =解决(df = = 0,θ,“MaxDegree”4)
%转换给定的点(xp_given yp_given)为中心的坐标系椭圆
%和项目
P_slash = [cosd (t1)信德(t1);信德(t1) cosd (t1)] * [xp_given - x0;yp_given - y0];
sol_theta =潜艇(sol_theta [xp yp], [P_slash (1) P_slash (2)))
%变换投影点回到椭圆
Px_proj = cosd(α)*潜艇(x,θ,sol_theta)——信德(α)*潜艇(y,θ,sol_theta) + x0;
Py_proj =信德(α)*潜艇(x,θ,sol_theta) + cosd(α)*潜艇(y,θ,sol_theta) + y0;
%数值例子
为i = 1:元素个数(像素)
px_proj =双(潜艇(px_proj [xp_given yp_given], [px (i) py (i)]));
py_proj =双(潜艇(py_proj [xp_given yp_given], [px (i) py (i)]));
idx = abs(图像放大(px_proj)) < 1 e-6 & abs(图像放大(py_proj)) < 1 e-6;
px_proj = px_proj (idx);
py_proj = py_proj (idx);
d =√(px (i) -px_proj)。^ 2 + (py(我)-py_proj) ^ 2);
(dist (i)、索引)= min (d);
pxp (i) = px_proj(指数);
pyp (i) = py_proj(指数);
结束
%图形演示
thetanum = 0:2 *π/ 100:2 *π;
xx = a * cos (thetanum);
yy = b * sin (thetanum);
xxx = xx * cosd(α)- yy *信德(α);
多= xx *信德(α)+ yy * cosd(α);
xxx = xxx + x0;
多= yyy + y0;
情节(xxx, yyy)
持有在
arrayfun (@ (i)情节([px (i),真正的(pxp (i))], [py (i),实际(pyp (i)))), 1:元素个数(px))
轴平等的
网格在