![]() |
Entfernung zwischen zwei Pixelkoordinaten
Liste der Anhänge anzeigen (Anzahl: 1)
Hi, ich möchte die entfernung zwischen 2 pixelpunkten in einem Panel berechnen lassen, und das wie folgt.
in unserem Hörsaal haben wir ca 30 PCs. Ich möchte ein Programm schreiben, mit dem man ein Surroundsound für diese PCs erstellen kann. Dafür hab ich mir eine Oberfläche (im Anhang) erstellt und möchte jetzt für jeden PC die Lautstärke in Abhängigkeit zur Entferung eines Punktes(welcher sich mit dem Mauszeiger bewegt) berechnen. Dazu habe ich folgende Funktion aufgestellt und sie funktioniert auch reibungslos. hier erstmal der code
Delphi-Quellcode:
Problem ist nur, dass sie viel zu viel Performace nimmt, vor allem wenn ich diese Funktion 30 mal jede Viertelsekunde durchlaufen lassen muss.
procedure TForm1.Timer1Timer(Sender: TObject); //Timerintervall auf 250
var topx:real; entfernung:integer; leftx:real; shape1top, shape1left:integer; begin shape1Top:=shape1.Top;shape1left:=shape1.Left; //PC031 topx:=abs(PC031.Top-shape1Top); leftx:=abs(PC031.left-shape1left); entfernung:=(250*trunc(ntewurzel(2,trunc(power(leftx,2)+power(topx,2))))); if entfernung>65000 then entfernung:=65000 else; SetMasterVolume(MasterVolumeControl,65000-entfernung); {Lautstärke des PCs}:=floattostr(65000-entfernung); //6500 als maximaler Lautsärkewert so lange rede kurzer sinn, habt ihr eine einfachere Lösung mit der ich die Entfernung zweier Punkte ausrechnen kann? sie sollte allerdings noch möglichst genau sein schonmal thx für die Antwort, lg cRayZo |
Re: Entfernung zwischen zwei Pixelkoordinaten
Zitat:
Ansonsten: Entfernung := Wurzel(X*X+Y*Y) Wobei X und Y der X- und Y-Abstand sind. Als Wurzel kannst du SQRT aus der Math.pas nehmen |
Re: Entfernung zwischen zwei Pixelkoordinaten
joa also Bild ist jetzt im Anhang^^
zu deinem Tipp:
Delphi-Quellcode:
ist ja nichts anderes als
Entfernung := Wurzel(X*X+Y*Y)
Delphi-Quellcode:
so wie ich es benutzt habe
power(x,2)+power(y,2)
der Rest in meiner Gleichung rundet den Wert ja nur und rechnet diesen in die Lautstärke um so wie ich es gemacht habe, ich hab die Änderung von dir trotzdem mal ausprobiert..die performance wird noch miserabler^^ Will garned dran denken wies dann aussieht, wenn das Senden der Lautstärke an die PCs performancemäßig noch gehen soll^^ |
Re: Entfernung zwischen zwei Pixelkoordinaten
Evtl. bringt der Einsatz von Threads schon einmal etwas.
|
Re: Entfernung zwischen zwei Pixelkoordinaten
Zitat:
Problem ist nur, ich weiß nicht wie ich einen Thread erstelle, noch nie gebraucht^^ |
Re: Entfernung zwischen zwei Pixelkoordinaten
Delphi-Quellcode:
das kann man aber deutlich schöner machen.
topx:=abs(PC031.Top-shape1Top);
leftx:=abs(PC031.left-shape1left); entfernung:=(250*trunc(ntewurzel(2,trunc(power(leftx,2)+power(topx,2))))); if entfernung>65000 then entfernung:=65000 else; SetMasterVolume(MasterVolumeControl,65000-entfernung); {Lautstärke des PCs}:=floattostr(65000-entfernung); //6500 als maximaler Lautsärkewert a) die 65000 als Konstante deklarieren, reine Zahlen haben im Code eigentlich nichts zu run.
Delphi-Quellcode:
:shock: was macht das else? nimm doch einfach entfernung := min(entfernung, 65000);
if entfernung>65000 then entfernung:=65000 else;
Delphi-Quellcode:
wie wäre es mit
entfernung:=(250*trunc(ntewurzel(2,trunc(power(leftx,2)+power(topx,2)))));
Delphi-Quellcode:
selbstgeschriebene Funktionen sind wohl kaum schneller als das eingebaute sqrt, das sicherlich aufs höchste optimiert ist.
entfernung = trunc(250*sqrt(leftx*leftx+topx*topx));
|
Re: Entfernung zwischen zwei Pixelkoordinaten
Hallo,
nur mal eine Verständnisfrage, warum berechnest Du die Entfernungen in einem TimerIterval von 250ms? Die Berechnungen müßen doch nur dann durchgeführt werden, wenn der Punkt verschoben wurde und nicht permanent. Grüße Klaus |
Re: Entfernung zwischen zwei Pixelkoordinaten
Wenn ich mich richtig erinnere, ist sqrt sogar eine FPU-Operation und somit um einiges schneller als jede mögliche andere Implementierung. Achja, und so nebenbei, power(x, 2) ist um einiges langsamer als x*x. Naja, jedenfalls theoretisch, praktisch gesehen wird der Compiler es wahrscheinlich sowieso wegoptimieren und in x*x übersetzen, aber x*x ist immer noch schöner.
|
Re: Entfernung zwischen zwei Pixelkoordinaten
hmm ich hab grad nen test gemacht:
Delphi-Quellcode:
ist ca 36 mal so schnell wie
Y := X*X
Delphi-Quellcode:
und dein ntewurzel kenne ich nicht :/
Y := Trunc(Power(X, 2));
ich würde das so machen:
Delphi-Quellcode:
edit:
entfernung := 250 * round(SQRT(leftx * leftx + topx * topx));
ich seh grad, der vorschlag von Nikolas ist genauer, da er zuesrt *250 nimmt und dann die nachkommststellen abschneidet... ansonsten kannst du ja noch runden xD
Delphi-Quellcode:
entfernung := round(250 * SQRT(leftx * leftx + topx * topx));
|
Re: Entfernung zwischen zwei Pixelkoordinaten
Zitat:
joa also muss ich mich dann owhl erstmal in Threads probieren, anders wirds wohl kaum gehen, wenn ich mehr performance erreichen will.. oder hat jemand noch eine andere idee? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:45 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