WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Schnittpunkt zweier "lines"

 

chris4aus

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2011, 02:58     Titel: Schnittpunkt zweier "lines"
  Antworten mit Zitat      
Hallo!

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(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)/2 Var(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)/2 0; Var(1)/2 -Var(1)/2 0; Var(1)/2 Var(1)/2 0; -Var(1)/2 Var(1)/2 0; -Var(1)/2 -Var(1)/2 0];
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));
 


Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2011, 05:49     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
chris4aus

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2011, 05:22     Titel: mehr Erklärung
  Antworten mit Zitat      
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)/2 Var(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)/2 0; Var(1)/2 -Var(1)/2 0; Var(1)/2 Var(1)/2 0; -Var(1)/2 Var(1)/2 0; -Var(1)/2 -Var(1)/2 0];
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.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.10.2011, 09:12     Titel: Re: Schnittpunkt zweier "lines"
  Antworten mit Zitat      
Hallo chris4aus,

Was genau ist nun Deine Frage?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
chris4aus

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.10.2011, 01:23     Titel:
  Antworten mit Zitat      
Hallo Jan!

Ich möchte die Länge der blauen Linien zwischen den roten Linien ausrechnen

Gruss,
Christiane
 
chris4aus

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.11.2011, 05:44     Titel: Geht doch nicht
  Antworten mit Zitat      
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.

Danke schon mal im Vorraus,
Christiane
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.11.2011, 08:31     Titel: Re: Geht doch nicht
  Antworten mit Zitat      
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
chris4aus
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.11.2011, 02:55     Titel: Loesung
  Antworten mit Zitat      
Hallo Jan!

Du hast recht, wenn man sich erst mal ransetzt, ist es nicht mehr ganz so schwer.
Ich habe jetzt solve verwendet:
Code:

SP = solve(['y = ',num2str(m_poly),'*x+',num2str(n_poly)],...
                ['y = ',num2str(m_sc),'*x + ',num2str(n_sc)]);
         


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
Code:

elseif (m_sc == m_poly)
 

gibt es mir Null aus, weil wie gesagt, die Steigung wie gesagt nicht die gleiche ist.

Aber ich werde es mal manuell loesen, ohne solve, vielleicht geht es dann auch schneller...
Private Nachricht senden Benutzer-Profile anzeigen
 
chris4aus
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2011, 01:29     Titel: DANKE
  Antworten mit Zitat      
Hallo Jan!

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...
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.