Matlab 沿两个给定点的距离在直线上寻找中间点
我写这个函数是为了在距离x1,y1和x2,y2之间找到一个点。如果坡度m变为负值,我会遇到无法正确放置点的问题。代码如下:Matlab 沿两个给定点的距离在直线上寻找中间点,matlab,Matlab,我写这个函数是为了在距离x1,y1和x2,y2之间找到一个点。如果坡度m变为负值,我会遇到无法正确放置点的问题。代码如下: function [X,Y] = linE(x1,y1,x2,y2,d) m = (y2-y1)/(x2-x1); theta = atand(m); X = x1+cumsum(d)*cosd(theta); Y = y1+cumsum(d)*sind(theta); 如果您不需要其他地方的实际坡度。计算的问题不是存在负坡度 [X
function [X,Y] = linE(x1,y1,x2,y2,d)
m = (y2-y1)/(x2-x1);
theta = atand(m);
X = x1+cumsum(d)*cosd(theta);
Y = y1+cumsum(d)*sind(theta);
如果您不需要其他地方的实际坡度。计算的问题不是存在负坡度
[X1, Y1] = linE(3, 1, 7, 10, 2);
[X2, Y2] = linE(3, 10, 7, 1, 2);
两者都能产生正确的输出:
问题是当旋转进入相对于第一点的第二和第三笛卡尔象限时:
[X1, Y1] = linE(7, 10, 3, 1, 2);
[X2, Y2] = linE(7, 1, 3, 10, 2);
从几何角度看,结果是有意义的。看看我们的一个相似斜率段对,段3,1,7,10和7,10,3,1的斜率都是2.25,所以atand将返回66°,而后者实际上是-114°。为了说明这一点,您可以检查以确保使用if/else块操作的象限,或者使用MATLAB函数,即四象限反切线
然后,您的函数变成:
function [X,Y] = linE(x1,y1,x2,y2,d)
theta = atan2d((y2 - y1), (x2 - x1));
X = x1 + cumsum(d)*cosd(theta);
Y = y1 + cumsum(d)*sind(theta);
end
这为我们的4个案例产生了正确的结果:
你的函数可以很好地处理正/负斜率,问题是你在计算θ时没有考虑到你的直线进入第二和第三个笛卡尔象限。请参阅:简单地移除斜坡标志是一种糟糕的绷带解决方案。符号对于确定映射点应位于哪个象限非常重要。您正在人为地将所有要转到的点放置在第一个象限中。excaza关于使用atan2d的评论是正确的。忽略象限问题,这使得以前正确的答案是错误的。第3行、第10行、第7行、第1行、第2行与原始公式功能正常,修改错误。
function [X,Y] = linE(x1,y1,x2,y2,d)
theta = atan2d((y2 - y1), (x2 - x1));
X = x1 + cumsum(d)*cosd(theta);
Y = y1 + cumsum(d)*sind(theta);
end