AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Schnittpunkte beliebiger Polygone mit einem beliebigem Achsen-parallelem Rechteck

Schnittpunkte beliebiger Polygone mit einem beliebigem Achsen-parallelem Rechteck

Ein Thema von ohkay · begonnen am 25. Jun 2012 · letzter Beitrag vom 26. Jun 2012
Antwort Antwort
Seite 1 von 3  1 23   
ohkay

Registriert seit: 25. Jun 2012
6 Beiträge
 
#1

Schnittpunkte beliebiger Polygone mit einem beliebigem Achsen-parallelem Rechteck

  Alt 25. Jun 2012, 21:05
Hey

ich sitze in ner Sackgasse Hilfe.

in Image:
Ich habe ein Rechteck welches Achsen-parallel durch (xmin,ymin) und (xmax,ymax) def. ist.
Nun setz ich Polygon punkte (belibig viel) und lasse diese Polygone dann in der Reinfolge verbinden.

jetzt kommt das problem, : jede der Polygonstrecken soll drauf untersucht werden ob sie das Rechteck schneiden wenn ja, soll der Schnittpunkt gekennzeichnet werden.

wenn wer ne Lösung hat die ich verstehe bin ich sehr dankbar

mfg Martin



Ich dank allen für ihre hilfe hir miene Lösung nach 2 tagen ...

[Delphi]
procedure Schnittpunkt(x1,y1,x2,y2,x3,y3,x4,y4:integer;var xs,ys:integer; var ok:boolean);
var
d:integer; t1,t2:real;
function det (a,b,c,d:integer):integer;
begin
det:=a*d-b*c;
end;
begin
d:= det(x2-x1,x3-x4,y2-y1,y3-y4);
ok:= false;
if d<>0 then
begin
t1:=det(x3-x1,x3-x4,y3-y1,y3-y4)/d;
t2:=det(x2-x1,x3-x1,y2-y1,y3-y1)/d;
if (t1>=0) and (t1<=1) and (t2>=0) and (t2<=1) then

begin
xs:=x1+round(t1*(x2-x1));
ys:=y1+round(t1*(y2-y1));
ok:=true;
end;
end;
end;

//die anwendung der funktion für mein problem
{procedure TForm1.Button3Click(Sender: TObject); //schnittpunkte anzeigen
var
i:integer;
xs,ys:integer;
ok:boolean;

begin
xp[n+1]:=xp[1];
yp[n+1]:=yp[1];
for i := 1 to n do
begin
image1.Canvas.Pen.Color:=clred;
Schnittpunkt(xp[i],yp[i],xp[i+1],yp[i+1],xmin,ymin,xmax,ymin,xs,ys,ok); //schnitpunkte oben
if ok then
begin
image1.Canvas.Rectangle(xs-3,ys-3,xs+3,ys+3)
end;
Schnittpunkt(xp[i],yp[i],xp[i+1],yp[i+1],xmax,ymin,xmax,ymax,xs,ys,ok); //schnitpunkte rechts
if ok then
begin
image1.Canvas.Rectangle(xs-3,ys-3,xs+3,ys+3)
end;
Schnittpunkt(xp[i],yp[i],xp[i+1],yp[i+1],xmax,ymax,xmin,ymax,xs,ys,ok); //schnitpunkte unten
if ok then
begin
image1.Canvas.Rectangle(xs-3,ys-3,xs+3,ys+3)
end;
Schnittpunkt(xp[i],yp[i],xp[i+1],yp[i+1],xmin,ymax,xmin,ymin,xs,ys,ok); //schnitpunkte links
if ok then
begin
image1.Canvas.Rectangle(xs-3,ys-3,xs+3,ys+3)
end;
end;
end;}
end.
[Delphi]

Geändert von ohkay (26. Jun 2012 um 20:19 Uhr)
  Mit Zitat antworten Zitat
schlagzu

Registriert seit: 11. Okt 2010
86 Beiträge
 
Delphi XE Starter
 
#2

AW: Schnittpunkte beliebiger Polygone mit einem beliebigem Achsen-parallelem Rechteck

  Alt 25. Jun 2012, 21:14
testen ob der erste Punkt in dem Rechteck liegt und der zweite nicht (oder umgekehrt).
Das nächste wäre dann die die diagonal durch gehen und beide außerhalb liegen und trotzdem schneiden.

Dann denn Schnittpunkt berechnen mit Dreieck (Rechtwinklig)

PS:

die die diagonal gehen so abfangen: 1 Punkt x liegt zwischen xmin xmax, 2Punkt y liegt zwischen ymin ymax

Geändert von schlagzu (25. Jun 2012 um 21:21 Uhr) Grund: Idee
  Mit Zitat antworten Zitat
schlagzu

Registriert seit: 11. Okt 2010
86 Beiträge
 
Delphi XE Starter
 
#3

AW: Schnittpunkte beliebiger Polygone mit einem beliebigem Achsen-parallelem Rechteck

  Alt 25. Jun 2012, 21:18
Mal zur Anschauung
PS: der eine strich sollte noch rot sein
Miniaturansicht angehängter Grafiken
unbenannt.png  
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Schnittpunkte beliebiger Polygone mit einem beliebigem Achsen-parallelem Rechteck

  Alt 25. Jun 2012, 21:26
Überprüfe doch einfach für jede Linie des Polygons einzeln, wo sie sich mit den vier Seiten des Rechtecks, die ja ebenfalls Strecken sind, schneidet.

Hier findest du einige Lösungen, um Schnittpunkte von Strecken zu berechnen.

Die Tatsache, dass das Rechteck achsenparallel ist, könnte man allerdings ausnutzen und damit einfacheren Code erzeugen. Du kannst dir die diagonale Strecke (bzw. Gerade) als lineare Funktion und die achsenparallele Strecke als Y-Achse auf einem Funktionsgraphen denken. Dann kannst du leicht den Schnittpunkt ausrechnen – dann musst du noch schauen, ob der Schnittpunkt im Bereich der Strecke liegt.

Für die andere Achse musst du die Koordinaten vertauschen.
  Mit Zitat antworten Zitat
ohkay

Registriert seit: 25. Jun 2012
6 Beiträge
 
#5

AW: Schnittpunkte beliebiger Polygone mit einem beliebigem Achsen-parallelem Rechteck

  Alt 25. Jun 2012, 21:38
also ich bin so weit (als neuling) gekommen

Delphi-Quellcode:
var
    n,m,xmin,ymin,xmax,ymax:integer;
    p1:boolean;
    xp,yp:array [1..100] of integer;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
  begin //Recheck zeichnen
      if button=mbleft then
      if radiogroup1.ItemIndex=0 then
      begin
          if p1 then
          begin
              xmin:=x;
              ymin:=y;
              p1:=false;
              image1.Canvas.Rectangle(x-3,y-3,x+3,y+3);
          end
          else
          begin
              xmax:=x;
              ymax:=y;
              p1:=true;
              image1.Canvas.Rectangle(xmin,ymin,xmax,ymax);
              image1.Canvas.Rectangle(x-3,y-3,x+3,y+3);
          end;
      end
      else
      begin //Poligohnpunkte
          n:= n+1;
          xp[n]:=x;
          yp[n]:=y;
          image1.Canvas.Rectangle(x-3,y-3,x+3,y+3);
      end;
  end;

procedure TForm1.Button1Click(Sender: TObject); //poligon zeichnen

  var
      i,s: Integer;
      sr: real;
  begin
      for i := 1 to n-1 do
      begin
          image1.Canvas.MoveTo(xp[i],yp[i]);
          image1.Canvas.LineTo(xp[i+1],yp[i+1]);
      end;
      image1.Canvas.LineTo(xp[1],yp[1]);
      image1.Canvas.Pen.Color:=clblack;
  end;

procedure TForm1.Button3Click(Sender: TObject); //berechnung und ausgabe visuel

  var
      x1,y1,x2,y2,x3,y3,x4,y4: integer; //...
      x5,y5: integer; //...
      ok: boolean; //...
  begin
          ????
  end;

end.


aber was du jetzt genau willst, was ich machen soll versteh ich net bzw ich weiß was du mienst aber ich kann das nicht umsetzen
  Mit Zitat antworten Zitat
ohkay

Registriert seit: 25. Jun 2012
6 Beiträge
 
#6

AW: Schnittpunkte beliebiger Polygone mit einem beliebigem Achsen-parallelem Rechteck

  Alt 25. Jun 2012, 21:55
ok ich versuchs

Geändert von ohkay (26. Jun 2012 um 19:45 Uhr)
  Mit Zitat antworten Zitat
ohkay

Registriert seit: 25. Jun 2012
6 Beiträge
 
#7

AW: Schnittpunkte beliebiger Polygone mit einem beliebigem Achsen-parallelem Rechteck

  Alt 25. Jun 2012, 21:58
mhh klappt net so ganz

Geändert von ohkay (26. Jun 2012 um 19:45 Uhr)
  Mit Zitat antworten Zitat
schlagzu

Registriert seit: 11. Okt 2010
86 Beiträge
 
Delphi XE Starter
 
#8

AW: Schnittpunkte beliebiger Polygone mit einem beliebigem Achsen-parallelem Rechteck

  Alt 25. Jun 2012, 22:18
Also bekannt bei den dreiecken ist dir eine Seite und die Winkel (durch Polygon Hausrechenbar)zudem eine Koordinate. Das hat nichts mit Delphi zutun sondern Geometrie
  Mit Zitat antworten Zitat
schlagzu

Registriert seit: 11. Okt 2010
86 Beiträge
 
Delphi XE Starter
 
#9

AW: Schnittpunkte beliebiger Polygone mit einem beliebigem Achsen-parallelem Rechteck

  Alt 25. Jun 2012, 22:40
nochmal erklärt:
der rest macht sin und cos
und die andere Idee ist leichter da hast du sogar die Funktion gegeben
Miniaturansicht angehängter Grafiken
unbenannt.png  

Geändert von schlagzu (25. Jun 2012 um 22:48 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Schnittpunkte beliebiger Polygone mit einem beliebigem Achsen-parallelem Rechteck

  Alt 25. Jun 2012, 23:45
Im Anhang findest du eine Skizze und eine Herleitung für den Schnittpunkt mit den horizontalen Seiten des Rechtecks. x0 und y0 beschreiben einen beliebigen Punkt auf der blauen Geraden (also z.B. die Koordinaten von P1 oder P2).

Die Mathematik kannst du eigentlich 1:1 in Source Code umsetzen.

Am Ende musst du noch prüfen, ob der Schnittpunkt auf der grünen und der blauen Strecke liegt, was einfach zu erledigen ist, indem du die X-Koordinaten vergleichst.

Sonderfall:
Δx = 0 → entweder kein Schnittpunkt oder unendlich Schnittpunkte. Muss auf jeden Fall abgefangen werden, weil sonst eine Division durch 0 entsteht.
Miniaturansicht angehängter Grafiken
schnittpunkt_achsenparll.jpg  

Geändert von Namenloser (25. Jun 2012 um 23:53 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz