Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 沿两个给定点的距离在直线上寻找中间点_Matlab - Fatal编程技术网

Matlab 沿两个给定点的距离在直线上寻找中间点

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

我写这个函数是为了在距离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);

如果您不需要其他地方的实际坡度。

计算的问题不是存在负坡度

[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