AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Punkt in der Schnittmenge dreier Kreise
Thema durchsuchen
Ansicht
Themen-Optionen

Punkt in der Schnittmenge dreier Kreise

Ein Thema von Blitzschutz1 · begonnen am 8. Jun 2021 · letzter Beitrag vom 9. Jun 2021
Antwort Antwort
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
772 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Punkt in der Schnittmenge dreier Kreise

  Alt 9. Jun 2021, 12:59
Das ganze wird in diesem Fall vermutlich noch einfacher, da zum einen die Mittelpunkte alle untereinander denselben Abstand A haben und die Radien R der drei Kreise alle gleich sind. Weiterhin gilt A < R, da es sonst keine Überschneidungen geben würde.
Nicht ganz:
Sei r der Radius der drei Kreise. Wenn die drei Kreismittelpunkte Eckpunkte eines gleichseitigen Dreiecks mit Seitenlänge a sind, dann haben je zwei Kreise eine gemeinsame Schnittmenge, wenn a<=2*r (bei Gleichheit genau einen Punkt).
Damit alle drei Kreise gemeinsame Punkte haben, muss a<=sqrt(3)*r gelten. (Überlegung: Die drei Kreise haben dann genau einen gemeinsamen Schnittpunkt, wenn sie sich im Schwerpunkt S des Dreiecks treffen. Wir wissen: Der Schwerpunkt S teilt die Seitenhalbierende (und hier gleichzeitig Höhenlinie) des Dreiecks im Verhältnis 2:1. => Die Höhe des Dreiecks beträgt also 1.5*r => Die Seitenlänge a damit r*sqrt(3). => Wenn a < r*sqrt(3) wird aus dem Schnittpunkt eine Schnittfläche.)
Michael Gasser

Geändert von Michael II ( 9. Jun 2021 um 14:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.662 Beiträge
 
Delphi 12 Athens
 
#2

AW: Punkt in der Schnittmenge dreier Kreise

  Alt 9. Jun 2021, 14:07
Wenn man für aus jedem Kreismittelpunkt und dem zu untersuchenden Punkt ein rechtwinkliges Dreieck bildet, so befindet sich der Punkt dann in der Schnittmenge der 3 Kreise, wenn jede der errechneten Hypotenusen kleiner als der Kreisradius ist, oder mache ich da einen Denkfehler?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.688 Beiträge
 
Delphi 12 Athens
 
#3

AW: Punkt in der Schnittmenge dreier Kreise

  Alt 9. Jun 2021, 14:33
oder mache ich da einen Denkfehler?
Nein, machst du nicht. Das deckt sich inhaltlich mit dem unter #3 gesagten.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.662 Beiträge
 
Delphi 12 Athens
 
#4

AW: Punkt in der Schnittmenge dreier Kreise

  Alt 9. Jun 2021, 14:47
Sry, den Beitrag hatte ich wohl übersehen
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
772 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Punkt in der Schnittmenge dreier Kreise

  Alt 9. Jun 2021, 19:55
Ja #3 und #9 schreiben über das gleiche Ding.
Der Kreis k mit Mittelpunkt M=(mx,my) und Radius r hat die Gleichung (x-mx)^2 + (y-my)^2 = r^2. Alle Punkte (x,y) innerhalb von k erfüllen (x-mx)^2 + (y-my)^2 < r^2.

Wenn man prüfen will, ob ein Punkt (x,y) in der gemeinsamen Schnittfläche aller Kreise liegt muss man nur prüfen, ob die drei Ungleichungen für die drei Kreise erfüllt sind.


Alternativ zu Abstandsmessung/Kreisgleichung: Man kann hier auch mit Regionen arbeiten. Dann muss man nix rechnen, wenn man wissen will, ob ein Punkt (x,y) innerhalb einer Region liegt.

( Im Code unten findest du ein Beispiel für die Nutzung von floodfill" fürs grüne Ausmalen der gemeinsamen Schnittmenge. )

Mit CreateEllipticRgn() kann man die Menge der Punkte der jeweiligen Kreise definieren. Mittels CombineRgn() wird die gemeinsame Schnittmenge (schnittmenge) ermittelt.

Wenn ein User an Position (x,y) aufs Formular klickt, wird mit if PtInRegion( schnittmenge, x, y ) geprüft, ob (x,y) in der gemeinsamen Schnittmenge (schnittmenge) liegt.

Anstatt floodfill aus der VCL fürs Ausmalen zu nutzen, kann man auch Regionen mit einer Farbe belegen. Dies geschieht unten im Code mittels:

Delphi-Quellcode:
    brush := CreateSolidBrush( $000000ff );
    FillRgn( higru.canvas.Handle, schnittmenge, brush );


Delphi-Quellcode:
var higru : TBitMap;
    schnittmenge : HRGN;
    m : array[1..3] of TPoint;


procedure zeichne;
var r, d : integer;
    ahrgn : array[1..3] of HRGN;
    i : integer;
begin
  r := trunc(higru.height/3+0.5);
  d := trunc(2*r*sqrt(3)/3+0.5);

  // Mittelpunkte der Kreise
  m[1] := Point(r,2*r);
  m[2] := Point(r+d,2*r);
  m[3] := Point(trunc(r+d/2+0.5),r);

  higru.Canvas.Brush.Style := bsClear;
  higru.Canvas.Pen.Color := clBlack;

  for i := 1 to 3 do
  higru.Canvas.Ellipse( m[i].X-r,m[i].Y-r,m[i].X+r, m[i].Y+r );

  higru.Canvas.Brush.Color := clgreen;
  higru.canvas.brush.Style := bsSolid;
  higru.Canvas.FloodFill( trunc((m[1].x+m[2].x+m[3].x)/3), trunc((m[1].y+m[2].y+m[3].y)/3), clBlack, fsBorder );

  // Schnittmenge der drei Kreise berechnen => Region "schnittmenge"
  // Die drei Kreise:
  for i := 1 to 3 do
  ahrgn[i] := CreateEllipticRgn( m[i].X-r,m[i].Y-r,m[i].X+r, m[i].Y+r );

  // Kreis1 mit Kreis2 schneiden und in schnittmenge abspeichern
  CombineRgn( schnittmenge, ahrgn[1], ahrgn[2], RGN_AND );
  // Kreis3 mit schnittmenge schneiden und in schnittmenge abspeichern
  CombineRgn( schnittmenge, schnittmenge, ahrgn[3], RGN_AND );

  for i := 1 to 3 do
    DeleteObject(ahrgn[i]);
end;

procedure TForm114.FormCreate(Sender: TObject);
begin
  higru.SetSize( 500, 400 );
  zeichne;
end;

procedure TForm114.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  var brush : HBRUSH;
begin
  if PtInRegion( schnittmenge, x, y ) then
  begin
    brush := CreateSolidBrush( $000000ff );
    FillRgn( higru.canvas.Handle, schnittmenge, brush );
    showmessage ( 'Ich gehöre zu "schnittmenge"' );
    Repaint;
  end;
end;

procedure TForm114.FormPaint(Sender: TObject);
begin
    canvas.Draw( 0,0, higru );
end;

initialization
higru := TBitMap.Create;
schnittmenge := CreateRectRgn(0, 0, 0, 0);
finalization
DeleteObject( schnittmenge );
higru.free;
end.
Michael Gasser

Geändert von Michael II ( 9. Jun 2021 um 22:19 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 21:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz