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 naherliegender Geraden???

 

RoyalFlush
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 82
Anmeldedatum: 27.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2010, 13:49     Titel: Schnittpunkt naherliegender Geraden???
  Antworten mit Zitat      
Hallo!

Ich würde gerne den Schnittpunkt von Geraden berechnen. Ich weiß natürlich dass das alleine einfach geht indem man die Geradengleichungen gleichsetzt.

Mein Problem ist aber, dass ich sehr sehr viele Geraden habe (>30000) und ich eigentlich nur den nähesten Schnittpunkt meiner Referenzgeraden (rot im Beispiel) mit einer anderen Geraden brauche.

Diese Geradenberechnung ist bei mir ein Teil in einer großen Schleife und wird auch noch sehr oft gerechnet, also will ich nicht jedes Mal den Schnitpunkt meiner Gerade mit allen Geraden berechnen und den nähesten suchen, da das ziemlich viel Rechenzeit kostet.

Ich habe die Koordinaten meiner Anfangs- und Endpunkte sowie die Winkel aller Geraden. Da muss es doch etwas geben dass ich nur bestimmte Geraden auswähle und nur zu denen die Schnittpunktsberechnung mache?? Das würde mir einiges an Rechenzeit ersparen!

Ich weiß, dass ich nicht nach einem Schnittpunkt mit den Geraden ganz rechts aussen suchen muss (siehe Beispiel) da ich weiß, dass meine Gerade sicher eine näher gelegene vorher schneiden wird.

Ich wäre sehr dankbar wenn mir das jemand zeigen könnte!

Danke.

Intersection.png
 Beschreibung:

Download
 Dateiname:  Intersection.png
 Dateigröße:  116.85 KB
 Heruntergeladen:  366 mal
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 30.07.2010, 14:00     Titel:
  Antworten mit Zitat      
Hallo RoyalFlush,

zeige uns dochmal Deinen Code. 30.000 klingt nich besonders viel, und möglicherweise liesse sich Dein Code beschleunigen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
RoyalFlush
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 82
Anmeldedatum: 27.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2010, 15:22     Titel:
  Antworten mit Zitat      
Hallo!

Mein Code ist über 1000 Zeilen lang und Teil eines grossen Projektes.

Ok, etwas genauer vielleicht. Ich hab meine Skizze etwas geändert: Meine Rote Linie wächst im laufe der Zeit und ich will prüfen ob sich in dem Bereich vor der Linie schon eine andere befindet, also ob diese Linie wo anstößt.

Das würde ich brauchen, so effizient wie möglich...

Irgendwelche Ideen?

Intersection_2.png
 Beschreibung:

Download
 Dateiname:  Intersection_2.png
 Dateigröße:  121.86 KB
 Heruntergeladen:  414 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
yankemen
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 14.04.10
Wohnort: ---
Version: 32: 2008a & 2010a
     Beitrag Verfasst am: 30.07.2010, 15:32     Titel:
  Antworten mit Zitat      
Moin RoyalFlush,

ich wage zu behaupten, dass der relevante Code keine 1000 Zeilen sind und dass die Berechnung an einer bestimmten, zusammengefassten Stelle auftritt.
Habe mit einem Mathe-Abi-Buch ein Programm zur Überprüfung der Abstände von zwei Geometrien geschrieben. Es ist, wie Du schon sagst, recht simple Mathematik. Und wenn ich jedes Dreieck mit jedem anderen vergleiche, dann bräuchte ich zwei Schleifen und 5 Jahre.
Aber Vektorisierung reduziert es in jedem Fall auf 1 Schleife. Und bei 70.000 Dreiecken zu 50.000 Dreiecken rechnet er trotzdem nur < 30 Minuten.

Ich würde um den Endpunkt einen Kreis definieren und schauen, ob da was drin ist. Wenn ja, dann prüfe auf echten Schnittpunkt. Wenn nein, dann ignorieren. Wenn Du noch einen Halbkreis draus machen kannst, dann umso besser, dann werden Strecken, die hinter dem aktuellen Punkt aber im Umkreis liegen, nicht mehr betrachtet.
Gruß,
yankemen
_________________

Code:
% Kommentare brauchen ein Leerzeichen nach dem %
Gibt es ein Ist und ein Wunsch-Soll? Gibt es Beispiele zum Durchprobieren? Wenn selbstgeschriebene Funktionen aufgerufen werden: können sie bitte angehangen werden? Gab es Fehlermeldungen?
Stimmen die Werte, wenn der Debugger mit Haltepunkten etc. eingesetzt wird?
Danke Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
RoyalFlush
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 82
Anmeldedatum: 27.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2010, 15:43     Titel:
  Antworten mit Zitat      
Ok, dieser Teil der Berechnung ist in einer function ausgegliedert. Ich habe eine Matrix M die alle Daten der Geraden enthält. Jede Zeile in M ist eine Gerade.

Code:

M = [x_anfang, y_anfang, x_ende, y_ende, winkel];
 


Jetzt bin ich z.B. bei Linie 5 (also Zeile 5 in M) und will am ende der Linie (x_ende, y_ende) prüfen ob innerhalb eines Bereichs mit dem Radius R ein anderes Liniensegment drinnenliegt.

Den Schnittpunkt zweier Geraden zu berechnen ist leicht, aber wie bekomme ich den minimalen Abstand von einem Punkt zu einem Liniensegment?


Ich hoffe ich konnte es jetzt deutlicher erklären.
Private Nachricht senden Benutzer-Profile anzeigen
 
RoyalFlush
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 82
Anmeldedatum: 27.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2010, 15:50     Titel:
  Antworten mit Zitat      
yankemen hat Folgendes geschrieben:

Ich würde um den Endpunkt einen Kreis definieren und schauen, ob da was drin ist...


So denke ich mir das auch, aber wenn ich nur die Anfangs und Endpunkte meiner Linien hab weis ich ja nicht ob ein Teil der Linie in diesem Kreis liegt...
Private Nachricht senden Benutzer-Profile anzeigen
 
RoyalFlush
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 82
Anmeldedatum: 27.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2010, 16:12     Titel:
  Antworten mit Zitat      
Hab mal schnell ein m-file zusammengebastelt...

Code:

close all; clear;
%
% Generate the lines
Lines = [0.4214,0.9079, 0.2558, 0.3329
        0.5135, 0.8358, 0.6790, 0.5828
        0.0861, 0.3706, 0.5698, 0.5780
        0.7157, 0.2439, 0.4407, 0.2900
        0.5632, 0.2852, 0.7828, 0.3689];
%
%
%
figure;
axis image;
hold on;
%
% Draw the lines (The first one in red)
for k = 1:size(Lines,1)
    x = Lines(k, 1:2);
    y = Lines(k, 3:4);
    if (k==1)
        color = [1 0 0];
    else
        color = [0 0 1];
    end;
    line(x, y, 'Color', color);
end;
%
%Plot the Radius
Radius = 0.1;
t = linspace(0, 2*pi, 100);
xr = Lines(1,1) + Radius * cos(t);
yr = Lines(1,3) + Radius * sin(t);
plot(xr, yr, 'r');
plot(Lines(1,1), Lines(1,3), 'r+');


% How can I calculate if the red line collides with any of the other lines
% (if any other line lies in that circle with Radius R)?

% I have more than 30000 Lines, and that is placed in a loop as well, so
% only a very efficient code would help!
 
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 - 2025 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.