5

Ich möchte eine Gewichtsmatrix für die algebraische Rekonstruktionsmethode finden. Dazu muss ich den Schnittpunkt der Linie mit dem Gitter finden. Ich kann direkten Linienschnittpunkt mit Linie finden, aber ich muss das geschnittene Liniensegmentgitter Nummer weise speichern. Nehmen wir an, wenn sich das erste Quadrat des Gitters nicht mit dem Gitter schneidet, dann setze das erste Element der Gewichtsmatrix auf Null. hier Code, i für Leitungsschnitt versucht:Wie bekomme ich ein Rechtecksegment in Matlab?

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'] 

Erklärung des Problems:

I eine Linie haben, die durch die Parameter definiert m, h, wo y = m*x + h Diese Linie über einem Gitter geht (dh Pixel). Für jedes Quadrat (a, b) des Gitters (dh das Quadrat [a, a+1]x[b, b+1]), möchte ich bestimmen, wenn die gegebene Linie dieses Quadrat oder nicht kreuzt, und wenn ja, was ist die Länge des Segments im Quadrat. Damit kann ich die Gewichtsmatrix aufbauen, die für die algebraische Rekonstruktionsmethode essentiell ist.

+0

Ich weiß nicht, worum es geht, dass Sie Hilfe benötigen. Ihr Code zeichnet eine Linie und ein Gitter mit der Gittergröße 1 von 3 bis 6. Und gibt die y-Werte bei 3,4,5 und 6 zurück. Was wollen Sie als Endergebnis und was ist das genaue Problem? –

+1

@TheMinion Ich habe eine Zeile, definiert durch die Parameter m, h, wobei y = m * x + h Diese Zeile geht über ein Raster (d. H. Pixel). Für jedes Quadrat (a, b) des Gitters (dh das Quadrat [a, a + 1] x [b, b + 1]) möchte ich bestimmen, ob die gegebene Linie dieses Quadrat kreuzt oder nicht, und wenn ja, Wie groß ist die Länge des Segments im Quadrat? Damit kann ich die Gewichtsmatrix aufbauen, die für die algebraische Rekonstruktionsmethode essentiell ist. –

+0

@ParthPatel Sie können den Titel der Frage wie folgt ändern: "Wie Sie ein Linienrechteck-Schnittpunktsegment in Matlab erhalten". Ich beantwortete Ihre Frage unten und gab ein Beispiel, wie es geht. – DontCareBear

Antwort

1

Hier ist eine schöne Möglichkeit, eine Linie mit Raster von Rechtecken zu schneiden und die Längen jeder der Schnittsegmente bekommen: ich die Linie Linie Kreuzung aus dem Pseudo-Code in der dritten Antwort von diesen

% 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'); 
link

verwendet

Dies ist das Ergebnis (die Längen der Pfeile im Bild sind die Segmentlängen) enter image description here