Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Überprüfen ob Punkt im Kreis ist (https://www.delphipraxis.net/88426-ueberpruefen-ob-punkt-im-kreis-ist.html)

xZise 15. Mär 2007 08:21


Überprüfen ob Punkt im Kreis ist
 
Wie kann man möglichst schnell überprüfen ob ein Punkt im Kreis liegt?
Delphi-Quellcode:
if Sqrt(Power(x - center.x, 2) + Power(y - center.y, 2)) <= radius then
center = Mitteplunkt des kreises
x und y = Punkt
radius = Radius

turboPASCAL 15. Mär 2007 08:30

Re: Überprüfen ob Punkt im Kreis ist
 
:gruebel: Was ist denn das für eine Frage?

Delphi-Quellcode:
implementation

{$R *.dfm}

uses math;

var
  center: tpoint = (x:100;y:100);

const
  r = 50;

procedure TForm1.FormPaint(Sender: TObject);
begin
  canvas.Ellipse(center.x-r,center.Y-r,center.X+r,center.Y+r);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Sqrt(Power(x - center.x, 2) + Power(y - center.y, 2)) <= r
    then caption := 'ja'
    else caption := 'nein';
end;

end.

gammatester 15. Mär 2007 08:37

Re: Überprüfen ob Punkt im Kreis ist
 
Zitat:

Zitat von xZise
Wie kann man möglichst schnell überprüfen ob ein Punkt im Kreis liegt?
Delphi-Quellcode:
if Sqrt(Power(x - center.x, 2) + Power(y - center.y, 2)) <= radius then
center = Mitteplunkt des kreises
x und y = Punkt
radius = Radius

Auf jeden Fall schneller und einfacher ist

Delphi-Quellcode:
if sqr(x - center.x) + sqr(y - center.y) <= sqr(radius) then
sqr(radius) ist wahrscheinlich ziemlich konstant und kann vorher berechnet werden. Wenn die Prüfungen innerhalb von x/y Schleifen erfolgen, kann man je nach Struktur sqr(x - center.x) oder sqr(y - center.y) außerhalb der Schleifen berechnen.

Gruß Gammatester

xZise 15. Mär 2007 11:52

Re: Überprüfen ob Punkt im Kreis ist
 
Zitat:

Zitat von turboPASCAL
:gruebel: Was ist denn das für eine Frage?

Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Sqrt(Power(x - center.x, 2) + Power(y - center.y, 2)) <= r
    then caption := 'ja'
    else caption := 'nein';
end;

:gruebel: Was ist denn das für eine Antwort?

Zitat:

Zitat von xZise
Wie kann man möglichst schnell überprüfen ob ein Punkt im Kreis liegt?
Delphi-Quellcode:
if Sqrt(Power(x - center.x, 2) + Power(y - center.y, 2)) <= radius then
center = Mitteplunkt des kreises
x und y = Punkt
radius = Radius

Zitat:

Zitat von gammatester
Auf jeden Fall schneller und einfacher ist

Delphi-Quellcode:
if sqr(x - center.x) + sqr(y - center.y) &lt;= sqr(radius) then

Also quadrieren? Klingt gut!
Eine Frage: Wäre es möglich das mit nur Integer zu rechnen, weil bei ganzen Zahlen immer ganze Quadrate rauskommen?

Zitat:

Zitat von gammatester
sqr(radius) ist wahrscheinlich ziemlich konstant und kann vorher berechnet werden.

Jap...

Zitat:

Zitat von gammatester
Wenn die Prüfungen innerhalb von x/y Schleifen erfolgen, kann man je nach Struktur sqr(x - center.x) oder sqr(y - center.y) außerhalb der Schleifen berechnen.

Ne ... Das wäre unnötig, da ich nur einmal das berechnen muss...

[edit]Nur noch ~ ein viertel!
80 Millionen mal meine Variante = ~4,7 s
80 Millionen mal gammas Variante = ~0,7 s (mit den constanten "r")
[/edit]

Sidorion 15. Mär 2007 12:35

Re: Überprüfen ob Punkt im Kreis ist
 
Ich will nicht den Finger haben, aber a^2+b^2=c^2 => sqr(a^2+b^2)=c, nicht sqr(c)!
edit: und schon garnicht sqr(a)+srr(b)=sqr(c), besuche bitte nochal die 9. Klasse!
Du kannst aber in jeder Schleife die Wurzel sparen, da gilt a^2>(<,=)b^2 <=> a>(<,=)b | a,b e R0+, sprich:
Delphi-Quellcode:
if Power(x - center.x, 2) + Power(y - center.y, 2) <= Power(r,2)
Hier kannst Du aber r^2 vor dem Schleifendurchlauf berechnen.

turboPASCAL 15. Mär 2007 12:44

Re: Überprüfen ob Punkt im Kreis ist
 
@xZise, Harr harr, ne das war zu früh am Morgen für mich.... -.-"
Ich hatte die Frage nicht verstanden da ich ja schon eine richtige Lösung sah... harr harr

:mrgreen:

shmia 15. Mär 2007 12:46

Re: Überprüfen ob Punkt im Kreis ist
 
Zitat:

Zitat von Sidorion
und schon garnicht sqr(a)+srr(b)=sqr(c), besuche bitte ....

Sqr(x) liefert das gleiche Ergebnis wie Power(x, 2)
Sqr => Square => Quadrieren
Sqrt => Square Root => Wurzelziehen (Basis 2)

Sidorion 15. Mär 2007 12:50

Re: Überprüfen ob Punkt im Kreis ist
 
Ja ist mir gerade auch aufgefallen.. ich vergesse immer, dass es die funktion sqr fürs quadrieren gibt. :oops:

xZise 15. Mär 2007 15:58

Re: Überprüfen ob Punkt im Kreis ist
 
Zitat:

Zitat von Sidorion
Ja ist mir gerade auch aufgefallen.. ich vergesse immer, dass es die funktion sqr fürs quadrieren gibt. :oops:

Ich auch :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 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