Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   OOP - Atome, Moleküle, ... (https://www.delphipraxis.net/25977-oop-atome-molekuele.html)

Blutiger Anfänger 15. Jul 2004 20:00


OOP - Atome, Moleküle, ...
 
Hi,

wie würdet ihr am besten Atome als Objekte darstellen, wenn man davon ausgeht, daß die Elementeigenschaften nicht notwendig sind, da die Ordnungszahl reicht?

Ich will Moleküle sowohl graphisch darstellen (Struktur) als auch laden und speichern können. Außerdem soll es noch für funktionelle Gruppen eine eigene ID (ala Ordnungzahl für Elemente - nur eben für Gruppen) geben - das ist aber theoretisch kein Problem. Es geht auch nicht darum wie ich es darstelle oder lade/speichere, sondern vielmehr darum, wie ich ein Atom und ein aus Atomen zusammengesetztes Molekül clever abstrahiere.

Gruß,

Oliver

MathiasH 15. Jul 2004 20:14

Re: OOP - Atome, Moleküle, ...
 
naja, bei den Atomeigenschaften kannste viele mit bisserl Wissen aus Chemie aus der Ordnungszahl ableiten. Von der organisation der Daten würde ich (wie ich das immer tue :) ) zu den guten alten arrays und records greifen, denn warum sollte jedes atom eigene prozeduren haben? (irgendwann bekehrt mich vielleicht noch wer zu OOP)

Datentypen:
Atom: Eigenschaften (was halt im Periodensystem steht)
Molekül: Eigenschaften + Aufbau
den Aufbau würde ich wie folgt speichern: ein array mit positionen, bei jedem element in diesem array gibt es neben der Ordnungszahl, Ladung etc. noch eine Info, mit wem es verbunden ist

Damit sollte man das Zeug halbwegs verwalten können.
Eine andere Alternative wäre das Molekül als Baumstruktur zu speichern, was bei kompexverbindungen sicher sinnvoll wäre...

MathiasH

Nikolas 15. Jul 2004 20:17

Re: OOP - Atome, Moleküle, ...
 
Du könntest ein Molekül als Array of Array of CAtom (Deine Klasse), darstellen. Damit könntest du die Position aller Atome speichern. Ausserdem solltest du alle Atome nummerieren (von links nach rechts, von oben nach unten ...) und dann noch eine Liste erstellen in der die Bindungsart (einfach, doppelBinung) gespeichert ist.
Falls du auf die unterschiedlichen Atomradien achten willst, kannst du ja für größere atome mehrere Elemente im Array² belegen.

Blutiger Anfänger 15. Jul 2004 20:28

Re: OOP - Atome, Moleküle, ...
 
Zitat:

Zitat von Toxman
Du könntest ein Molekül als Array of Array of CAtom (Deine Klasse), darstellen. Damit könntest du die Position aller Atome speichern. Ausserdem solltest du alle Atome nummerieren (von links nach rechts, von oben nach unten ...) und dann noch eine Liste erstellen in der die Bindungsart (einfach, doppelBinung) gespeichert ist.
Falls du auf die unterschiedlichen Atomradien achten willst, kannst du ja für größere atome mehrere Elemente im Array² belegen.

Nope, Atomradien spielen keine Rolle. Bindungswinkel auch nicht. Aber welche Eigenschaften bräuchte ich denn deiner Meinung nach um die 2D-Position eines Atoms im Molekül zu kodieren?

Zitat:

Zitat von MathiasH
naja, bei den Atomeigenschaften kannste viele mit bisserl Wissen aus Chemie aus der Ordnungszahl ableiten. Von der organisation der Daten würde ich (wie ich das immer tue :) ) zu den guten alten arrays und records greifen, denn warum sollte jedes atom eigene prozeduren haben? (irgendwann bekehrt mich vielleicht noch wer zu OOP)

Es soll und muß OOP sein. Das Programm wird in C++ verfaßt und soll u.a. auf Windows und Linux laufen.

Zitat:

Zitat von MathiasH
Datentypen:
Atom: Eigenschaften (was halt im Periodensystem steht)
Molekül: Eigenschaften + Aufbau
den Aufbau würde ich wie folgt speichern: ein array mit positionen, bei jedem element in diesem array gibt es neben der Ordnungszahl, Ladung etc. noch eine Info, mit wem es verbunden ist

Ja, aber welche Eigenschaften. Genau dahingehend such ich ja Vorschläge! Aus dem PSE brauche ich nur die Ordnungszahl - die kann als Index in das PSE dienen (wobei das PSE als Tabelle o.ä. abgespeichert sein kann).

Zitat:

Zitat von MathiasH
Damit sollte man das Zeug halbwegs verwalten können.
Eine andere Alternative wäre das Molekül als Baumstruktur zu speichern, was bei kompexverbindungen sicher sinnvoll wäre...

Wie stellst du dir das vor? Hatte auch über sowas nachgedacht, aber keine praktikable Lösung gefunden.

Also definitiv gibt es folgendes

Delphi-Quellcode:
TAtom = class
FOrdnungszahl:Integer;
end;
Wie weiter?

Die Valenzen müßten doch irgendwie so kodiert werden können, daß die Position des Atoms im Molekül eindeutig bestimmbar ist, wenn ich das Anfangsatom kenne (ein beliebiges an dem es nicht weiter geht)!

Oliver

Nikolas 15. Jul 2004 20:38

Re: OOP - Atome, Moleküle, ...
 
Zitat:

Aber welche Eigenschaften bräuchte ich denn deiner Meinung nach um die 2D-Position eines Atoms im Molekül zu kodieren
Die Eigenschaften, die man fast immer benutzt um einen Punkt im R2 zu bezeichnen: Eine X- und eine Y-Koordinate. Also würde ich voschlagen, dass du beim erstellen ein Atom (c oder sowas) zum Chef-Atom ernennst und alle anderen Atome relativ dazu speicherst. Also H²O mit Chefatom:=0 würde dann so abgespeichert werden:
H1(1/0) (rechts daneben)
H2(0/1) (oben drüber)

Blutiger Anfänger 15. Jul 2004 20:47

Re: OOP - Atome, Moleküle, ...
 
Aber es gibt doch Stoffe mit mehr als 4 Valenzen, korrekt? Wie bringe ich denn die dann im Raster unter? Theoretisch ist ja nur Nord/Süd/Ost/West frei in einem 2D-Raster.

Oliver

xineohp 15. Jul 2004 20:52

Re: OOP - Atome, Moleküle, ...
 
moin,

wie willst du bitte ein Molekül als Strukturformel darstellen, wenn du die Bindungswinkel ignoriert?
Irgendwie musst du doch die Beziehungen zwischen den Molekülen darstellen/einbeziehen?!

MathiasH 15. Jul 2004 20:58

Re: OOP - Atome, Moleküle, ...
 
also von einem solchen raster würde ich dir abraten, das stößt viel zu schnell an seine grenzen, wenn es daran geht Moleküle darzustellen die ein klein wenig komplizierter sind als H20

ka, wie man das am besten OOP macht, aber im Prinzip muss es ja recht ähnlich aussehen als mit arrays und records:

atom:
Ordungszahl
econfig: Elektronenkonfiguration (schon mal sowas gesehen : 1s² 2s² 2p³ ?) mit einem solchen muster müsste man das recht gut speichern können. Ladung ist da ja bereits inmpliziert
weitere Eigenschaften z.B. radius, Farbe, Schmelzpunkt. Diese könnte man allerdings auch aus einer externen Tabelle/Array/Datenbank laden

molekül:
array of molek_childs;

molek_childs:
atom: TAtom;
x, y(, z) für Position (relativ oder absolut)
connections: array of DWord (zu welchen atomen hat es verbindungen (id im array);

So nuj ist aber mal selberdenken angesagt, findest du nicht?

MathiasH

Nikolas 15. Jul 2004 21:00

Re: OOP - Atome, Moleküle, ...
 
Dann nimm ein Array of RAtom;
Delphi-Quellcode:
Type RAtom = record
x,y: integer;   // Koordinaten
stoff: integer; // Atomsorte
Platz: integer; // Platz in der Bindungsliste
...end;
Dieses Array kannst du dann ganz lässig abspeichern, aufrufen und mit ner Procedure zeichnen lassen.

€dit: Und wieder hatte Mathias eine ähnliche Idee und hat schneller geschrieben :wall:

xineohp 15. Jul 2004 21:06

Re: OOP - Atome, Moleküle, ...
 
Prinzipiel würde ich als Datenstruktur einen Baum preferieren:
Delphi-Quellcode:
tAtom = class;

tbindung = class
  Art: integer;// einfach-, doppel-, dreifach-Bindung
  PartnerAtom: tAtom;
  // Winkel
  // Länge
end;

tAtom = class
  Symbol: string;
  Ordnungszahl: integer;
  // etc.
  Bindungen: array of tBindung;
end;
wenn tAtom.Bindungen = nil, dann ist es ein einzelnes Atom, andernfalls ein Molekül

(allerdings dürfte diese Art von Datenstruktur nicht alle Anforderungen der OOP-Kapselung erfüllen :?)

xineohp 15. Jul 2004 21:10

Re: OOP - Atome, Moleküle, ...
 
@Toxman: wie stellst du dir ein Molekül vor? Kann sein, dass ich da jetzt was missverstanden hab, aber für mich klingt es so als seien deine Atome immer linear aufgebaut?! Wie würdest du beispielsweise Glycerin in deinem Array unterbringen?

Nikolas 15. Jul 2004 21:28

Re: OOP - Atome, Moleküle, ...
 
Ich ernenne das C-Atom ganz oben zum Chefatom.
Array[0]:C,0,-1 // eins drunter
[1]:C,0,-2 // zwei drunter
[2]:H,0,1 // ein H drüber
[3]:H,-1,0 usw. // ein H nach links usw.
Falls es 3-D werden soll, gibt's eben eine Angabe mehr. Damit habe ich dann eine genaue Beschreibung der Atomzentren.

Blutiger Anfänger 15. Jul 2004 21:28

Re: OOP - Atome, Moleküle, ...
 
Zitat:

Zitat von xineohp
moin,

wie willst du bitte ein Molekül als Strukturformel darstellen, wenn du die Bindungswinkel ignoriert?
Irgendwie musst du doch die Beziehungen zwischen den Molekülen darstellen/einbeziehen?!

In welcher Strukturformel hast du jemals eine Berücksichtigung der Bindungswinkel bemerkt? Ich meine in 3D-Modellen okay - aber in Strukturformeln schreibt das jeder nach gusto und vorzugsweise in 90°-Winkeln.

Zitat:

Zitat von MathiasH
also von einem solchen raster würde ich dir abraten, das stößt viel zu schnell an seine grenzen, wenn es daran geht Moleküle darzustellen die ein klein wenig komplizierter sind als H20

Okay.

Zitat:

Zitat von MathiasH
ka, wie man das am besten OOP macht, aber im Prinzip muss es ja recht ähnlich aussehen als mit arrays und records:

atom:
Ordungszahl
econfig: Elektronenkonfiguration (schon mal sowas gesehen : 1s² 2s² 2p³ ?) mit einem solchen muster müsste man das recht gut speichern können. Ladung ist da ja bereits inmpliziert
weitere Eigenschaften z.B. radius, Farbe, Schmelzpunkt. Diese könnte man allerdings auch aus einer externen Tabelle/Array/Datenbank laden

Die Elektronenkonfiguration ist erstens auch aus einer externen Tabelle möglich (was ich bevorzugen würde zu einem Objekt mit 180 Eigenschaften) - aber sie ist nicht notwendig. Ja ich bin im Bilde. Ich war bei einer Landesolympiade Chemie schon erfolgreich.

Zitat:

Zitat von MathiasH
molekül:
array of molek_childs;

molek_childs:
atom: TAtom;
x, y(, z) für Position (relativ oder absolut)
connections: array of DWord (zu welchen atomen hat es verbindungen (id im array);

So nuj ist aber mal selberdenken angesagt, findest du nicht?

Na wenn du meinst. Ich frage immer erst dann, wenn ich nicht mehr weiter weiß - und ich habe mir schon länger als eine Woche den Kopf darüber zerbrochen.

Zitat:

Zitat von xineohp
Prinzipiel würde ich als Datenstruktur einen Baum preferieren:
Delphi-Quellcode:
tAtom = class;

tbindung = class
  Art: integer;// einfach-, doppel-, dreifach-Bindung
  PartnerAtom: tAtom;
  // Winkel
  // Länge
end;

tAtom = class
  Symbol: string;
  Ordnungszahl: integer;
  // etc.
  Bindungen: array of tBindung;
end;
wenn tAtom.Bindungen = nil, dann ist es ein einzelnes Atom, andernfalls ein Molekül

(allerdings dürfte diese Art von Datenstruktur nicht alle Anforderungen der OOP-Kapselung erfüllen :?)

Der Ansatz ist schon recht charmant. Du meinst also, daß ich nicht nur die Atome selbst als Objekte betrachten sollte, sondern auch die Bindungen? ... werde das wohl mal überdenken müssen.

Zitat:

Zitat von xineohp
@Toxman: wie stellst du dir ein Molekül vor? Kann sein, dass ich da jetzt was missverstanden hab, aber für mich klingt es so als seien deine Atome immer linear aufgebaut?! Wie würdest du beispielsweise Glycerin in deinem Array unterbringen?

Eben, das war eine der Sachen die ich meinte. Und es gibt ja nicht nur Atome mit 4 Valenzen. Im Grunde ist für mich nur wichtig, daß die Darstellung danach halbwegs okay ist (nicht ständig Ecken wo keine nötig sind) und daß ich von endständigen funktionellen Gruppen die Position (relativ zu den einzelnen anderen Gruppen) berechnen kann. Es geht um eine verbesserte Gruppenbeitragsmethode.

Oliver

Hansa 15. Jul 2004 22:37

Re: OOP - Atome, Moleküle, ...
 
Zitat:

Zitat von Blutiger Anfänger
...Es geht um eine verbesserte Gruppenbeitragsmethode.

Oliver

Was zum Teufel ist das ?

Und bei der ganzen Theorie habt ihr noch die Isotope vergessen.

ripper8472 16. Jul 2004 01:40

Re: OOP - Atome, Moleküle, ...
 
wie wärs wenn du ein TMolekül so aufbaust, dass es ein array mit allen im molekül enthaltenen atomen hat und eine liste mit allen bindungen (pseudocode, aus dem handgelenk, nur ein konzept):
Code:
TAtom = record
  Ordnungszahl:integer;
end
TBindung=record
Partner1, Partner2:^TAtom;
end;

TMol = record
  Atome:array of TAtom;
  Bindungen: array of TBindung;
end;
damit dürftest du so ziemlich alles irgendwie konstruieren können. also erst alle atome ins array packen und dann in die bindungen immer schön pointer eintragen.

gruß, Christoph

Blutiger Anfänger 16. Jul 2004 13:38

Re: OOP - Atome, Moleküle, ...
 
Danke an alle für die Vorschläge und Hinweise.

cchris 11. Aug 2004 19:23

Re: OOP - Atome, Moleküle, ...
 
Wie wollt ihr in eurem Raster z.B.Einen Benzolring darstellen?

cu Chris

Nikolas 12. Aug 2004 13:27

Re: OOP - Atome, Moleküle, ...
 
Gnaz einfach: Nimm mal ein Karo-Papier und mal einen Benzol-Ring drauf. Jetzt legst du den Ursprung eines Koordinatensystems an ein C-Atom und gibst den Ort der anderen Atome relativ zu diesem Atom an. Das kannst du dann in einem Array of Array of integer speichern und fertig. :thumb:

cchris 12. Aug 2004 14:30

Re: OOP - Atome, Moleküle, ...
 
Array of Array? warum nimmst du dann nicht nen drei oder vierdimensionales?

Nikolas 12. Aug 2004 14:35

Re: OOP - Atome, Moleküle, ...
 
Zitat:

vierdimensionales?
Ich hab noch kein 4D-Molekül gesehen. (Nicht dass ich schon mal eins gesehen hätte)
3D: Ich würd sagen, dass ist recht schwierig darzustellen und die 2D Darstellung reicht in den meisten Fällen gut aus.

cchris 13. Aug 2004 10:43

Re: OOP - Atome, Moleküle, ...
 
Ich meine, wenn du nen Array of Array nimmst kannst du gleich nen Mehrdimensonales nehemen:

Delphi-Quellcode:
Array[1..10] of Array[1..10] of Integer;
ist das Gleiche wie

Delphi-Quellcode:
Array[1..10,1..10] of Integer;
Oder irre ich mich da?

cu Chris

Hansa 13. Aug 2004 11:01

Re: OOP - Atome, Moleküle, ...
 
Zitat:

Zitat von cchris
Oder irre ich mich da?

Ja, denn das da ist ein 2 - dimensionales. :mrgreen:

cchris 13. Aug 2004 14:39

Re: OOP - Atome, Moleküle, ...
 
Ja schon, aber der Zugriff ist nicht ganz identisch, meinetwegen statt [5][8] dann halt [5,8] aber von der Datenstrukturierung macht das doch keinen unterschied.

ripper8472 14. Aug 2004 21:29

Re: OOP - Atome, Moleküle, ...
 
Kann sein, dass ich mich irre, aber die beiden Notationen des Zugriffs sind in beiden Varianten der Variablenvereinbarung zulässig. Habs lange nicht mehr gebraucht, stimmt also nicht unbedingt.

Die Idee mit dem Array find ich persönlich auch nicht den Knüller. Stell da mal ein kleines Diamantgitter oder Sand dar... das geht nicht. Nimm doch den Ansatz, alle Atome mit x,y,z Position in ein Array und alle Bindungen in ein weiteres Array zu speichern. Das gibt keine Probleme und wenn du eine korrekte Raumstruktur haben willst, dann lass nen Algorithmus drüberlaufen, der die einzelnen Atome korrekt auf Abstand hält. Nach einigen (vielen) Durchläufen hast du dann eine nahezu perfekte Anordnung.

Gruß

jungdelphin 14. Aug 2004 23:02

Re: OOP - Atome, Moleküle, ...
 
Warum macht ihr nicht einfach aus einem Molekül eine Liste.
arrays sind doch viel zu unflexibel.

Ein Klasse stellt atome dar mit wahlweise 1 bis 8 möglichen Bindungen (je nach atomsorte), die jeweils als Zeiger in Datenelementen gespeichert werden. So werden die Atome zu einem Molekül in Form einer Liste verknüpft.

Kommt vielleicht spät der Vorschlag, dürfte aber gehen.

ripper8472 15. Aug 2004 17:04

Re: OOP - Atome, Moleküle, ...
 
Liste oder Array, ist doch vom Denkansatz das Gleiche. Nur die Implementierung ist dann noch Sache des Geschmacks.
Einigen wir uns auf "Klassenvektoren veränderlicher Länge" ;-)

Ich denk mal, alle Möglichkeiten sind diskutiert und die Umsetzung steht an.


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