![]() |
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 |
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 |
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. |
Re: OOP - Atome, Moleküle, ...
Zitat:
Zitat:
Zitat:
Zitat:
Also definitiv gibt es folgendes
Delphi-Quellcode:
Wie weiter?
TAtom = class
FOrdnungszahl:Integer; end; 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 |
Re: OOP - Atome, Moleküle, ...
Zitat:
H1(1/0) (rechts daneben) H2(0/1) (oben drüber) |
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 |
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?! |
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 |
Re: OOP - Atome, Moleküle, ...
Dann nimm ein Array of RAtom;
Delphi-Quellcode:
Dieses Array kannst du dann ganz lässig abspeichern, aufrufen und mit ner Procedure zeichnen lassen.
Type RAtom = record
x,y: integer; // Koordinaten stoff: integer; // Atomsorte Platz: integer; // Platz in der Bindungsliste ...end; €dit: Und wieder hatte Mathias eine ähnliche Idee und hat schneller geschrieben :wall: |
Re: OOP - Atome, Moleküle, ...
Prinzipiel würde ich als Datenstruktur einen Baum preferieren:
Delphi-Quellcode:
wenn tAtom.Bindungen = nil, dann ist es ein einzelnes Atom, andernfalls ein Molekül
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; (allerdings dürfte diese Art von Datenstruktur nicht alle Anforderungen der OOP-Kapselung erfüllen :?) |
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?
|
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. |
Re: OOP - Atome, Moleküle, ...
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Oliver |
Re: OOP - Atome, Moleküle, ...
Zitat:
Und bei der ganzen Theorie habt ihr noch die Isotope vergessen. |
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:
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.
TAtom = record
Ordnungszahl:integer; end TBindung=record Partner1, Partner2:^TAtom; end; TMol = record Atome:array of TAtom; Bindungen: array of TBindung; end; gruß, Christoph |
Re: OOP - Atome, Moleküle, ...
Danke an alle für die Vorschläge und Hinweise.
|
Re: OOP - Atome, Moleküle, ...
Wie wollt ihr in eurem Raster z.B.Einen Benzolring darstellen?
cu Chris |
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:
|
Re: OOP - Atome, Moleküle, ...
Array of Array? warum nimmst du dann nicht nen drei oder vierdimensionales?
|
Re: OOP - Atome, Moleküle, ...
Zitat:
3D: Ich würd sagen, dass ist recht schwierig darzustellen und die 2D Darstellung reicht in den meisten Fällen gut aus. |
Re: OOP - Atome, Moleküle, ...
Ich meine, wenn du nen Array of Array nimmst kannst du gleich nen Mehrdimensonales nehemen:
Delphi-Quellcode:
ist das Gleiche wie
Array[1..10] of Array[1..10] of Integer;
Delphi-Quellcode:
Oder irre ich mich da?
Array[1..10,1..10] of Integer;
cu Chris |
Re: OOP - Atome, Moleküle, ...
Zitat:
|
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.
|
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ß |
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. |
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 03:20 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