确定投影点的位置在一个椭圆

7视图(30天)
你好,
我有一组数据点(下面的蓝点)我要想他们投射到一个椭圆(与已知的a, b, x0, y0,和弧度或倾斜)。
我想知道我可以确定椭圆上的每个投影点的位置。任何建议/代码/ peudo代码将是可爱的。谢谢你!

接受的答案

马特·J
马特·J 2022年12月16日
编辑:马特·J 2022年12月16日
使用 ellipseprj 下面的函数。它需要的下载 trustregprob 从文件交换
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);
结束
5个评论
沙拉盒
沙拉盒 2022年12月20日
谢谢你约翰和马特,特别是约翰,现在解释了一切。我必须承认我的轴是扭曲的。发现好!
谢谢你马特。你的船在检查切也非常有价值的提供检查垂直度的另一种方式。
伟大的答案。谢谢。)

登录置评。

更多的答案(2)

约翰D 'Errico
约翰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找到免费下载的文件交换:
4评论
沙拉盒
沙拉盒 2022年12月20日
谢谢你的回答Torsten。我做了你建议修改t 5000间隔。它没有改变结果。预计B点仍有相同的x和y值时50 t间隔。我不确定是否t是关键。

登录置评。


Torsten
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)
sol_theta =
%转换给定的点(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)))
sol_theta =
%变换投影点回到椭圆
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))
平等的
网格
2的评论
Torsten
Torsten 2022年12月16日
编辑:Torsten 2022年12月16日
px和py应该成为你的数据点。
你必须承认0 < =θ< 2 *π来确定最优投影点椭圆,但图形部分只是为了说明,这不是一个必要的部分代码。
输入————说
= 2;
b = 1;%主要轴
x0 = 1;
y0 = 1;%的翻译
α= 5;%旋转角的椭圆度
px = randn (10);
py = randn (10);%采样点投影
和输出pxp和pyp——椭圆上的点的x坐标最近(px / py)——也许(如果它的利息)数组“距离”,包含给定数据点之间的欧氏距离和同行的椭圆。

登录置评。

类别

找到更多的在二维和三维图帮助中心文件交换

社区寻宝

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

开始狩猎!