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_Line Intersection_Tomography Reconstruction - Fatal编程技术网

Matlab 如何获取直线矩形相交线段?

Matlab 如何获取直线矩形相交线段?,matlab,line-intersection,tomography-reconstruction,Matlab,Line Intersection,Tomography Reconstruction,我想找到代数重建法的权矩阵。为此,我必须找到与网格的线交点。我可以找到直线与直线的直接交点,但我必须按编号存储相交线段网格。所以假设在网格中,第一个正方形和网格不相交,然后在权重矩阵的第一个元素上加零 下面是我尝试用于直线相交的代码: ak = 3:6 aka = 3:6 x = zeros(size(aka)) y = zeros(size(ak)) for k = 1:length(ak) line([ak(1) ak(end)], [aka(k) aka(k)],'color','r'

我想找到代数重建法的权矩阵。为此,我必须找到与网格的线交点。我可以找到直线与直线的直接交点,但我必须按编号存储相交线段网格。所以假设在网格中,第一个正方形和网格不相交,然后在权重矩阵的第一个元素上加零

下面是我尝试用于直线相交的代码:

ak = 3:6
aka = 3:6
x = zeros(size(aka))
y = zeros(size(ak))
for k = 1:length(ak)
  line([ak(1) ak(end)], [aka(k) aka(k)],'color','r')
end

% Vertical grid
for k = 1:length(aka)
  line([ak(k) ak(k)], [aka(1) aka(end)],'color','r')
end
hold on;
 X =[0 15.5]
 Y = [2.5 8.5] 
 m = (Y(2)-Y(1))/(X(2)-X(1)) ;
 c = 2.5 ; 
 plot(X,Y)
axis([0 10 0 10])
axis square
% plotting y intercept
for i = 1:4
    y(i) = m * ak(i) + c
    if y(i)<2 || y(i)>6
        y(i) = 0
    end
end
% plotting x intercept
for i = 1:4
   x(i) = (y(i) - c)/m 
    if x(i)<2 || x(i)>6
        x(i) = 0
    end
end  
z = [x' y']
ak=3:6
aka=3:6
x=零(尺寸(aka))
y=零(尺寸(ak))
对于k=1:长度(ak)
行([ak(1)ak(end)],[aka(k)aka(k)],'color','r')
结束
%垂直网格
对于k=1:长度(aka)
行([ak(k)ak(k)],[aka(1)aka(end)],'color','r')
结束
等等
X=[0 15.5]
Y=[2.5 8.5]
m=(Y(2)-Y(1))/(X(2)-X(1));
c=2.5;
绘图(X,Y)
轴([0 10 0 10])
轴线广场
%截距
对于i=1:4
y(i)=m*ak(i)+c
如果y(i)6
y(i)=0
结束
结束
%标绘x截距
对于i=1:4
x(i)=(y(i)-c)/m
如果x(i)6
x(i)=0
结束
结束
z=[x'y']
我有一条线,由参数
m,h
定义,其中
y=m*x+h
这条线穿过网格(即像素)


对于网格的每个正方形(即正方形
[a,a+1]x[b,b+1]
),我想确定给定的线是否与该正方形相交,如果是,正方形中线段的长度是多少,这样我就可以构造代数重建方法所必需的权重矩阵。

这里有一个很好的方法将直线与矩形网格相交,并获得每个相交线段的长度:我使用伪代码中的直线相交在这个问题的第三个答案中

%从方程y=mx+h中创建一些直线
m=0.5;h=0.2;
x=-2:0.01:2;
y=m*x+h;
%在范围[-1,1]上创建栅格
[X,Y]=meshgrid(linspace(-1,1,10),linspace(-1,1,10));
%在此范围内创建四边形网格
fvc=surf2patch(X,Y,零(大小X));
%提取拓扑
v=fvc.顶点(:,[1,2]);
f=fvc面;
%绘制网格和线
贴片(fvc,'EdgeColor','g','FaceColor','w');等等
图(x,y);
%使用链接中的直线交点
DC=[f(:,[1,2]);f(:,[2,3]);f(:,[3,4]);f(:,[4,1]);
D=v(DC(:,1),:);
C=v(DC(:,2),:);
A=repmat([x(1),y(1)],尺寸(DC,1),1);
B=repmat([x(end),y(end)],尺寸(DC,1),1);
E=A-B;
F=D-C;
P=[-E(:,2),E(:,1)];
h=点(A-C,P,2)。/dot(F,P,2);
%计算交点

idx=(0我不知道您需要帮助的是什么。您的代码正在绘制一条线和一个网格,网格大小为1,从3到6。并返回3、4、5和6处的y值。您想要的最终结果是什么,确切的问题是什么?@TheMinion我有一条线,由参数m,h定义,其中y=m*x+h这条线穿过网格(即像素)。对于网格的每个正方形(a,b)(即正方形[a,a+1]x[b,b+1])我想确定给定的直线是否与这个方块相交,如果是的话,方块的长度是多少。这样我就可以构造出一个对代数重建方法至关重要的权重矩阵。。我在下面回答了你的问题,并给出了一个如何做的示例。@Dontcarebar谢谢:)我用了不同的方法:)但你的方法似乎很有效:)在matlab中找到不用循环的方法来解决这些问题总是很好的。您可以使用我给您的代码来创建任何四边形或三角形网格。玩得开心:)
% create some line form the equation y=mx+h
m = 0.5; h = 0.2;
x = -2:0.01:2;
y = m*x+h;
% create a grid on the range [-1,1]
[X,Y] = meshgrid(linspace(-1,1,10),linspace(-1,1,10));
% create a quad mesh on this range
fvc = surf2patch(X,Y,zeros(size(X)));
% extract topology
v = fvc.vertices(:,[1,2]);
f = fvc.faces;
% plot the grid and the line
patch(fvc,'EdgeColor','g','FaceColor','w'); hold on;
plot(x,y);
% use line line intersection from the link
DC = [f(:,[1,2]);f(:,[2,3]);f(:,[3,4]);f(:,[4,1])];
D = v(DC(:,1),:);
C = v(DC(:,2),:);
A = repmat([x(1),y(1)],size(DC,1),1);
B = repmat([x(end),y(end)],size(DC,1),1);
E = A-B;
F = D-C;
P = [-E(:,2),E(:,1)];
h = dot(A-C,P,2)./dot(F,P,2);
% calc intersections
idx = (0<=h & h<=1);
intersections = C(idx,:)+F(idx,:).*repmat(h(idx),1,2);
intersections = uniquetol(intersections,1e-8,'ByRows',true);
% sort by x axis values
[~,ii] = sort(intersections(:,1));
intersections = intersections(ii,:);
scatter(intersections(:,1),intersections(:,2));
% get segments lengths
directions = diff(intersections);
lengths = sqrt(sum(directions.^2,2));
directions = directions./repmat(sqrt(sum(directions.^2,2)),1,2);
directions = directions.*repmat(lengths,1,2);
quiver(intersections(1:end-1,1),intersections(1:end-1,2),directions(:,1),directions(:,2),'AutoScale','off','Color','k');