Ich definiere Linien anhand von Code Punkten und möchte die Länge der Linie messen, die zwischen dem rotierten Quadrat (welches ich auch mithilfe von lines definiere) liegen.
Code:
Var = [10,20,0.5,0.7,45,0,3,4,5,2];
% W = Var(1); % Width of test field % H = Var(2); % Height of test field % S = Var(3); % Spacing horizontal % V = Var(4); % Vertical spacing % ALPHA = Var(5); % Rotation angle % O = Var(6); % Offsets wanted % F1 = Var(7); % Feedrate short edges % F2 = Var(; % Feedrate long edges % F3 = Var(9); % Feedrate block interface
geom = zeros(Var(1)/2/Var(3),3);
geom(1,:) = [-Var(1)/2 -Var(2)/2Var(9)];
for n = 2:(Var(1)/Var(3)+1)% block
rmd = mod(n,4);
geom(n,:)= [geom(n-1,1)*mod((rmd+1),2)+mod(rmd,2)*(mod((n+1)/2,2)*Var(1)/(-2)+round(n/4))...
geom(n-1,2)*mod(rmd,2)+mod((rmd+1),2)*sign((-1)^(mod(n/2,2)+1))*(Var(2)/2+floor(n/2)*Var(4))... mod(rmd,2)*Var(7) + mod((rmd+1),2)*Var(8)];
end% block
i_max = [-Var(1)/2 -Var(1)/20; Var(1)/2 -Var(1)/20; Var(1)/2Var(1)/20; -Var(1)/2Var(1)/20; -Var(1)/2 -Var(1)/20];
phi = Var(5);
R = [cosd(phi),-sind(phi),0;sind(phi),cosd(phi),0;0,0,1];
i_max_rot = i_max*R;
line(geom(:,1),geom(:,2));
hold on;
line(i_max_rot(:,1),i_max_rot(:,2));
auf dem Bild sehe ich kein Quadrat (wahrscheinlich meinst du das Rechteck in der Mitte). Außerdem weiß ich nicht welche Linien du meinst (die die das Quadrat schneiden?!). Vielleicht kannst du nochmal näher erläutern was du machen willst und wie du es umsetzen möchtest.
chris4aus
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 26.10.2011, 05:22
Titel: mehr Erklärung
Hallo Thomas84!
Danke für die Antwort:
Hier noch mal der Code, der um 2 Zeilen erweitert ist:
Code:
Var = [10,20,0.5,0.7,45,0,3,4,5,2];
% W = Var(1); % Width of test field % H = Var(2); % Height of test field % S = Var(3); % Spacing horizontal % V = Var(4); % Vertical spacing % ALPHA = Var(5); % Rotation angle % O = Var(6); % Offsets wanted % F1 = Var(7); % Feedrate short edges % F2 = Var(Cool; % Feedrate long edges % F3 = Var(9); % Feedrate block interface
geom = zeros(Var(1)/2/Var(3),3);
geom(1,:) = [-Var(1)/2 -Var(2)/2Var(9)];
for n = 2:(Var(1)/Var(3)+1)% block
rmd = mod(n,4);
geom(n,:)= [geom(n-1,1)*mod((rmd+1),2)+mod(rmd,2)*(mod((n+1)/2,2)*Var(1)/(-2)+round(n/4))...
geom(n-1,2)*mod(rmd,2)+mod((rmd+1),2)*sign((-1)^(mod(n/2,2)+1))*(Var(2)/2+floor(n/2)*Var(4))... mod(rmd,2)*Var(7) + mod((rmd+1),2)*Var(8)];
end% block
i_max = [-Var(1)/2 -Var(1)/20; Var(1)/2 -Var(1)/20; Var(1)/2Var(1)/20; -Var(1)/2Var(1)/20; -Var(1)/2 -Var(1)/20];
phi = Var(5);
R = [cosd(phi),-sind(phi),0;sind(phi),cosd(phi),0;0,0,1];
i_max_rot = i_max*R;
line(geom(:,1),geom(:,2));
hold on;
L = line(i_max_rot(:,1),i_max_rot(:,2));
set(L,'Color','r');
Ich möchte die Länge der blauen Linien zwischen den roten Linien ausrechnen und das Verhältnis von zu verwendenen Linien (im Quadrat) zu nicht verwendet (außerhalb) ermitteln.
Kann man in Matlab irgendwie die Schnittstellen bestimmen?
Anderenfalls kann ich es auf die lange Tour machen und in der Mitte anfangen und dann die Linien abziehen (damit hatte ich Codeweise angefangen, aber das dauert ziemlich lange und für die verschiedenen Winkel...)
Vielleicht verstehst du jetzt etwas besser, was ich machen will.
Ich möchte die Länge der blauen Linien zwischen den roten Linien ausrechnen
Gruss,
Christiane
chris4aus
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 03.11.2011, 05:44
Titel: Geht doch nicht
Hallo!
Ich schaffe es leider nicht, ein Programm dafuer zu schreiben. Die Linien muessen nicht unbedingt mit den Ecken des Quadrates oder Rechteckes uebereinstimmen - und da beginnt mein Problem.
Kann ich die Schnittpunkte zweier Lines in Matlab bestimmen? Muss ich diese dann in Funktionen oder so umwandeln?
Ich habe mit Funktionen noch nicht gearbeitet und wollte das gerne umgehen - sieht kompliziert aus.
Verfasst am: 03.11.2011, 08:31
Titel: Re: Geht doch nicht
Hallo chris4aus,
Aber Du arbeitest bereits mit Funktionen! Du rufst die Funktion LINE auf und auch "[-Var(1)/2 -Var(2)/2 Var(9)]" ist ein impliziter Aufruf der Funktion HORZCAT. Um selbst eine Funktion zu schreiben, benötigst Du auch kein Hexenwerk: Editor öffnen, den Code hineinschreiben, "function [output1, output2, ...] = FunktionsName(input1, input2, ...)" als erste Zeile einsetzen - dabei die Anzahl und Namen der inputs und outputs anpassen. Fertig.
Matlab wird wirklich einfach, wenn man es mal kann.
Wie würdest Du denn den Schnittpunkt zweier Linien per Hand bestimmen? Man kann per Vektorrechnung die Koordinaten den Schnittpunktes bestimmen. Dann könnte man noch zwei Dreiecke zeichnen und ihren Drehsinn und die Winkel verwenden. Google kennt bestimmt weitere Tricks.
Das dauert zwar ziemlich lange zum Durchrennen und spuckt noch "falsche" Ergebnisse aus. Z.B. wenn die m_poly and m_sc bis auf die letzte Stelle gleich sind, wird eine Gerade angezeigt als Schnittpunkt. Wenn ich das dann aber abfangen will mit
Ich habe es jetzt ohne solve versucht auf die tradionelle Art.
Und es laueft so viel schneller!!!
Danke!
Hier der Code (der etwas komplizierter ist, da ich ihn jetzt auf mein richtiges Werk angewandt habe):
Code:
for no_L = 1:no_sides % for each line horizontal and/or slope % calculate slope (delta(y)/delta(x))
m_poly = (scaffold(end).geom_lay(no_L+2,2)-scaffold(end).geom_lay(no_L+1,2))/... (scaffold(end).geom_lay(no_L+2,1)-scaffold(end).geom_lay(no_L+1,1));
% y-axis intersect
n_poly = scaffold(end).geom_lay(no_L+1,2)-m_poly*scaffold(end).geom_lay(no_L+1,1);
% save [x_max x_min m n] in matrix
scaffold(end).geom_sub(no_L,:) = [scaffold(end).geom_lay(no_L+1,1), scaffold(end).geom_lay(no_L+2,1),...
m_poly , n_poly];
for pos=2:length(scaffold(l).geom_lay)% all different lines in scaffold
m_sc = (scaffold(l).geom_lay(pos,2)-scaffold(l).geom_lay(pos-1,2))/... (scaffold(l).geom_lay(pos,1)-scaffold(l).geom_lay(pos-1,1));
n_sc = scaffold(l).geom_lay(pos-1,2)-m_sc*scaffold(l).geom_lay(pos-1,1);
if(m_sc == Inf || m_sc == -Inf)...% m_sc is Inf or -Inf
&& scaffold(l).geom_lay(pos,1) <= scaffold(end).geom_sub(no_L,1)...
&& scaffold(l).geom_lay(pos,1) >= scaffold(end).geom_sub(no_L,2)% check if x value lies in between % add y value of polygon side
SP_matrix(no_L,pos-1) = n_poly + m_poly*scaffold(l).geom_lay(pos,1);
elseif(single(m_sc) == single(m_poly)) && (single(n_sc) == single(n_poly))% if same slope
%&& exactly same line % save length of plygon line
SP_matrix(no_L+1,pos-1) = sqrt((scaffold(end).geom_sub(no_L,1)-scaffold(end).geom_sub(no_L,2))^2...
+(m_poly * (scaffold(end).geom_sub(no_L,1)-scaffold(end).geom_sub(no_L,2)))^2);
else % solve line equations for intersection point
x = (n_sc - n_poly)/(m_poly - m_sc);
y = (m_poly*n_sc - m_sc*n_poly)/(m_poly - m_sc);
if(abs(x)> scaffold(l).stage_dim/2 || abs(y)> scaffold(l).stage_dim/2)&&(m_sc ~=0||single(m_sc) ~= single(m_poly)) disp('Achtung');
end % if intersection point is in the range of polygon if m_sc == 0...% if slope is zero,check if SP.y is in range of polygon
&&(scaffold(l).geom_lay(pos,3) == scaffold(l).FRle(scaffold(l).geom_lay(pos,6))) && ...
y <= (m_poly*scaffold(end).geom_sub(no_L,1)+n_poly) && ...
y >= (m_poly*scaffold(end).geom_sub(no_L,2)+n_poly) % calculate sidelines
SP_matrix(no_L+1,pos-1) = x;
elseif x <= scaffold(end).geom_sub(no_L,1) && ...
x >= scaffold(end).geom_sub(no_L,2)% if SP.x is in range of polygon
k = -1*sign(m_sc)*m_sc*scaffold(end).stage_dim/2+ n_sc;
if k<0
k = 0;
end
SP_matrix(no_L+1,pos-1) = (single(y)-single(k))/sind(scaffold(l).geom_lay(pos,5));
end% intersection point end% lines do not intersect due to m_sc = Inf end% all different lines in scaffold end% each line in polygon
Ich habe eine Struktur, die aus Geraden besteht, und ein Polygon und bestimme die Laenge der Geraden innerhalb des Polygons.
Falls jemand anderes vor dem gleichen Problem steht...
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.