Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jun 15, 2024 21:35

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Punkte innerhalb eines Kreises
BeitragVerfasst: Mo Jan 30, 2006 01:27 
Offline
DGL Member

Registriert: Mo Jan 30, 2006 01:17
Beiträge: 1
Ich habe einen Punkt 1 gegeben, der von Punkt 2 n einheiten entfernt ist.
Nun brauche ich eine Funktion, die mir alle Punkte in einem array of TPoint zurückgibt, die höchstens n-1 einheiten von Punkt 1 enfernt sind. Ich habe bichts geeignetes finden können. Vielleicht kann mir ja einer von euch da weiterhelfen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 30, 2006 13:33 
Offline
DGL Member
Benutzeravatar

Registriert: So Feb 06, 2005 17:29
Beiträge: 187
Programmiersprache: C, C++
Ich hab mal was überlegt, bin dabei aber auch selbst auf eine Frage gestoßen: Wie regelt man das am besten, wenn eine Funktion ein dynamisches Array zurückgeben soll?

Soweit bin ich auf jeden Fall gekommen:
Code:
  1. type
  2. TPunkte = array of TPoint;
  3.  
  4. function PunkteInKreis (P1, P2: TPoint): TPunkte;
  5. var Punktemax,
  6.   radius, range,
  7.   x, y: integer;
  8. begin
  9.   radius := round(sqrt(sqr(P1.x-P2.x)+sqr(P1.y-P2.y)))-1;
  10.   for y := -radius to radius do
  11.   begin
  12.     range := round(sqrt(sqr(radius)-sqr(y)));
  13.     for x := -range to range do
  14.     begin
  15.       SetLength(result, Punktemax+1);
  16.       result[Punktemax].x := P1.x + x;
  17.       result[Punktemax].y := P1.y + y;
  18.       inc(Punktemax);
  19.     end;
  20.   end;
  21. end;
  22.  


Keine Ahnung, ob das das ist, was du willst, oder ob man das optimierter machen könnte. Sag doch mal wofür du es brauchst?

_________________
Flummi: Projektseite und Projektthread


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 30, 2006 20:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
(Falsche Taste gedrückt, unfertiger Beitrag wurde gepostet)

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Zuletzt geändert von Ziz am Mo Jan 30, 2006 20:21, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 30, 2006 20:18 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Sprich, du willst alle Punkte auf der Kriesfläche...
Dafür gibts die "Kreisgleichung", die Average Idiot in seinem Code benutzt, aber nicht erklärt hat.

r²=(x-Mx)²+(y-My)²

Mx und My sind dabei die Koordinaten des Mittelpunkts. Hier bitte nciht multiplizieren! ^^
Außerdem sei M der Punkt1 und x und y seien die Koordinaten des Punktes 2, der den Radius errechnen lässt und somit den kreis.

Nun gibt es aber ein Probleme. rein mathematisch gibt es undendlich Punkte, die du suchst. Rein technisch gesehen mit Pixeln rechnend kann man natürlich x Lösungen finden, wobei x Element der natürlichen Zahlen.
Hier wäre mal ein beispielcode, der ungefährt funzen müsste. Nur die Tpointsache müsstes anpassen, da kenn ich mich nich aus:
(Ich kopiere mal das grundgerüst von Average Idiot)
Code:
  1.  
  2. type TPunkte = record
  3. punkte : array of TPoint;
  4. anzahl : longint;
  5. end;
  6.  
  7. function PunkteInKreis (P1, P2: TPoint): TPunkte;
  8. var n,x,y: integer;
  9.  
  10. begin
  11. PunkteInKreis.anzahl:=0;
  12. n := round(sqrt(sqr(P1.x-P2.x)+sqr(P1.y-P2.y)))-1;
  13. for x:=-n to n do
  14. for y:=-n to n do
  15. if sqr(n)>=sqr(x)+sqr(y) then //Hier wird überprüft, ob ein Punkt mit den koordinaten (x|y) im Radius von n liegt mit dem mittelpunkt (0|0)
  16. begin
  17. inc(PunkteInKreis.anzahl);
  18. PunkteInKreis.punkte[PunkteInKreis.anzahl].x:=x;
  19. PunkteInKreis.punkte[PunkteInKreis.anzahl].y:=y;
  20. end;
  21. end;
  22.  

Ich weiß nicht, ob es funzt, aber wenn man die kreisgleichung erstmal kapiert hat, dürfte es leicht selbst machbar sein!

mfg Cyberpuer

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 30, 2006 20:59 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Es sind mir 2 Sachen aufgefallen.
1. IMO wenn es um eine KomplexeDatenstruktur handelt, sollte man es immer über eine VAR(Pointer) Paprameter zurückgeben. So:
Code:
  1. procedure PunkteInKreis (P1, P2: TPoint; var Result: TPunkte);


2. Field "anzahl" ist überflüssig, denn "anzahl := Length( punkte );"

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 30, 2006 21:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Hmm... Davon ausgehend, dass du recht hast, hier der optmierte Code:
Code:
  1. type TPunkte =  array of TPoint;
  2.  
  3. procedure PunkteInKreis (P1, P2: TPoint; var result : Tpunkte);
  4. var n,x,y: integer;
  5.  
  6. begin
  7. n := round(sqrt(sqr(P1.x-P2.x)+sqr(P1.y-P2.y)))-1;
  8. for x:=-n to n do
  9. for y:=-n to n do
  10. if sqr(n)>=sqr(x)+sqr(y) then //Hier wird überprüft, ob ein Punkt mit den koordinaten (x|y) im Radius von n liegt mit dem mittelpunkt (0|0)
  11. begin
  12. result.punkte[length(result)+1].x:=x;
  13. result.punkte[length(result)+1].y:=y;
  14. end;
  15. end;

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 30, 2006 22:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
sniper hat geschrieben:
Es sind mir 2 Sachen aufgefallen.
1. IMO wenn es um eine KomplexeDatenstruktur handelt, sollte man es immer über eine VAR(Pointer) Paprameter zurückgeben. So:
Code:
  1. procedure PunkteInKreis (P1, P2: TPoint; var Result: TPunkte);


2. Field "anzahl" ist überflüssig, denn "anzahl := Length( punkte );"


Arrays werden bei Delphi sowieso per Referenz übergeben. Nur wenn man einen Array verändert werden evt. kopien erstellt.

Den Array als Rückgabewert zu übergeben hat also keine Nachteile. Bei grösseren Records hast du natürlich recht.

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 31, 2006 03:04 
Offline
DGL Member
Benutzeravatar

Registriert: So Feb 06, 2005 17:29
Beiträge: 187
Programmiersprache: C, C++
@Cyberpuer: TPoint ist doch integer, oder nicht? Hab das jetzt nicht nachgeguggt, war mir aber ziemlich sicher!

@Heru-ur: Ich frag nochmal, wofür man das überhaupt braucht? Vielleicht brauch ich das dann ja auch und weiss es nur noch nicht :wink:

_________________
Flummi: Projektseite und Projektthread


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 31, 2006 12:13 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Also das ist ein Problem, das man prima achteln kann. wenn ein Punkt im ersten Oktant in der Lösungsmenge enthalten ist, dann sind auch alle Spiegelungen dieses Punktes enthalten.
Metacode:
Code:
  1. function AllePunkteImKreis(M,P:TPoint; var Result: Array of TPoint)
  2.  function Lösung(x,y)
  3.  begin
  4.   SetLength(Result,length(result+8);
  5.   result[Length(result)-8]:=TPoint(M.X+x,M.Y+y);
  6.   result[Length(result)-7]:=TPoint(M.X+x,M.Y-y);
  7.   result[Length(result)-6]:=TPoint(M.X-x,M.Y-y);
  8.   result[Length(result)-5]:=TPoint(M.X-x,M.Y+y);
  9.   result[Length(result)-4]:=TPoint(M.X+y,M.Y+x);
  10.   result[Length(result)-3]:=TPoint(M.X+y,M.Y-x);
  11.   result[Length(result)-2]:=TPoint(M.X-y,M.Y-x);
  12.   result[Length(result)-1]:=TPoint(M.X-y,M.Y+x);
  13.  end;
  14. begin
  15.  SetLength(Result,0); //Array löschen
  16.  r:=(P.X-M.X)^2+(P.Y-M.Y)^2;
  17.  für alle x von 0 bis (P.X-M.X)
  18.   für alle y von 0 bis (P.Y-M.Y)
  19.    wenn x^2+y^2<=r
  20.    dann Lösung(x,y)
  21.    sonst break; //wenn der nicht drin ist, dann auch alle nachfolgenden dieser Schleife
  22.   end;
  23.  end;
  24. end;
  25.  

hoffe, das hilft

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 31, 2006 16:08 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Zitat:
Arrays werden bei Delphi sowieso per Referenz übergeben.
Wenn du statt "Delphi" C(oder C++) geschrieben hattest, würde cih dir jetzt stimmen, sonst muss ich dir wiedersprechen.
Code:
  1. var
  2.   Form1: TForm1;
  3.   a:array[0..10]of integer;
  4.  
  5. implementation
  6.  
  7. {$R *.dfm}
  8.  
  9. procedure TForm1.FormCreate(Sender: TObject);
  10. var i:integer;
  11. begin
  12.   randomize;
  13.   for i:=0 to 10 do
  14.   begin
  15.    a[i] := random(100);
  16.    ListBox1.Items.Add( IntToStr( a[i] ))
  17.   end;
  18. end;
  19.  
  20. procedure etwas( arg: array of integer );
  21. var
  22.   i:integer;
  23. begin
  24.   for i:= low( arg) to high( arg ) do
  25.   begin
  26.     arg[i] := random(100);
  27.   end;
  28. end;
  29.  
  30. procedure etwas_var( var arg: array of integer );
  31. var
  32.   i:integer;
  33. begin
  34.   for i:= low( arg) to high( arg ) do
  35.   begin
  36.     arg[i] := random(100);
  37.   end;
  38. end;
  39.  
  40. procedure TForm1.Button1Click(Sender: TObject);
  41. var
  42.   i:integer;
  43. begin//
  44.   etwas( a );
  45.   ListBox1.Items.Add('=====etwas====');
  46.   for i:=0 to 10 do
  47.   begin
  48.     ListBox1.Items.Add(IntToStr(a[i]));
  49.   end;
  50. end;
  51.  
  52. procedure TForm1.Button2Click(Sender: TObject);
  53. var
  54.   i:integer;
  55. begin//
  56.   etwas_var( a );
  57.   ListBox1.Items.Add('=====etwas_var====');
  58.   for i:=0 to 10 do
  59.   begin
  60.     ListBox1.Items.Add(IntToStr(a[i]));
  61.   end;
  62. end;
  63.  
  64. end.
Wären Arrays immer per Referenz übergeben, so wäre egal ob man VAR schreibt oder nicht.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 01, 2006 11:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 17, 2005 13:19
Beiträge: 98
Wohnort: Jahnsdorf
Also zwei Dinge hier mal am Rande:

1. Records und Arrays (genauso wie String) werden von Delphi als Pointer auf die eigentlichen Daten behandelt. Benutzt man kein var wird bei Records und Arrays ein zusätzlicher Platz im Stackframe für die eigentlichen Daten reserviert, der die Daten enthält. Bei Strings wird wie gewohnt ein Pointer auf den String zurückgegeben (der vorher jedoch explizit kopiert wurde).

2. Bei Funktionen ist der Rückgabewert ein impliziter Var-Parameter der Funktion, der an die Argument-Liste angehängt wird. Funktionen sollten daher maximal zwei explizite Parameter haben, wenn man nicht zu viel über den Stack arbeiten will, was durchaus langsam sein kann.

2ct ;-)

P.S.: Die Lösung von Sidorion ist soweit vom Ansatz her korrekt, enthält aber folgende Fehler:

1. r muss die Wurzel des Ausdrucks rechts sein.
2. Die Zählvariablen in den Schleifen müssen von 0 bis R-1 laufen

_________________
Administrator of Project Omorphia
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 06, 2006 09:24 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Das mit dem n-1 hatte ich überlesen.. dann muss es aber auch '<r' heissen und nicht '<=r'
Dass r nicht die Wurzel des rechten Ausdrucks ist, ist korrekt, da ich mir dadurch das Wurzelziehen komplett spare. r ist quasi das Quadrat des Radiuses. Wenn Du hier die Wurzel ziehst, musst Du auch in der Schleife bei der Prüfung jedesmal die Qurzel ziehen und das frisst Zeit, bringt aber keine weiteren Erkenntnisse.
a^2 < b^2 <=> a<b (a,b e N).

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.047s | 17 Queries | GZIP : On ]