java cml2x3d CML-Datei X3D-Datei 3D-Konfigurationsdatei Element-DateiDurch eine separate Konvertierung wird die Darstellungsart Backbone (Abbildung 8.4) erzeugt, bei der ein Aminosäurerest nur durch das -Kohlenstoffatom dargestellt wird. Innerhalb einer Proteinkette werden dann die -Kohlenstoffatome aufeinanderfolgender Aminosäuren miteinander verbunden, so daß besonders gut die Sekundär- bzw. Tertiärstruktur eines Proteins zu beobachten ist. Beim Aufruf dieser Konvertierung werden dieselben Parameter wie bei der normalen Konvertierung angegeben.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Config SYSTEM 'file:./Config.dtd'> <Config> <Colors> <Background color='&white;'/> <Singlebond color='&yellow;'/> <Doublebond color='&red;'/> <Atom atomId="H" color='&light_blue;'/> <Atom atomId="HE"/> <Atom atomId="LI"/> <Atom atomId="BE"/> <Atom atomId="B" color='&brown;'/> <Atom atomId="C" color='&black;'/> <Atom atomId="N" color='&dark_blue;'/> <Atom atomId="O" color='&red;'/> : : <Atom atomId="AT"/> <Atom atomId="RN"/> </Colors> <Parameters> <!-- Atomgroesse = kovalenter Radius / Faktor --> <Atomsize factor='1.5'/> <!-- konfiguriert die Groesse des Bindungszylinders --> <Bondsize radius='0.05'/> </Parameters> </Config> |
public void characters(char[] ch, int start, int length) throws SAXException { String s = new String(ch, start, length); if (s.trim().length() == 0) return; content = content.concat(s); } |
<float builtin="z3" units="A">0.9763</float>werden die Daten direkt in das zuvor angelegte Atom-Objekt als Z-Koordinate gespeichert. Anders verhält es sich bei den Elementen atom und bond. Hier wird jeweils eine X3D-Instanz des jeweiligen Prototypen erzeugt. Bei einer Atom-Instanz werden die Daten aus dem Java-Objekt und den Konfigurationsdateien genutzt, um die Instanz zu initialisieren. Zusätzlich werden noch die einzelnen Koordinaten der Atome aufaddiert und die Anzahl der Atome festgehalten. Darüber hinaus wird das Atom mit der größten Z-Koordinate ermittelt. Diese Informationen werden bei der späteren Berechnung des ViewPoint benötigt. Im Gegensatz zu einer Atom-Instanz müssen bei einer Bond-Instanz zwei Informationen berechnet werden.
middleX . n1 | + | middleY . n2 | + | middleZ . n3 | = | 0 |
n2 | = | 0 |
[Rotationsachse liegt auf der X-Achse]
[Rotationsachse liegt nicht auf der X-Achse]
|
// Koordinaten des ersten Atoms double tempX_1 = bond.getFirst().getX(); double tempY_1 = bond.getFirst().getY(); double tempZ_1 = bond.getFirst().getZ(); // Koordinaten des zweiten Atoms double tempX_2 = bond.getSecond().getX(); double tempY_2 = bond.getSecond().getY(); double tempZ_2 = bond.getSecond().getZ(); // halbierter Vektor zwischen den Atomen double middleX = (tempX_2 - tempX_1) / 2; double middleY = (tempY_2 - tempY_1) / 2; double middleZ = (tempZ_2 - tempZ_1) / 2; // Mittelpunkt zwischen den beiden Punkten String position = new String((tempX_1 + middleX) + " " + (tempY_1 + middleY) + " " + (tempZ_1 + middleZ)); // Winkel zwischen middle und Y-Achse double help = middleX * middleX + middleY * middleY + middleZ * middleZ; double angle = Math.acos(middleY / Math.sqrt(help)); // Bestimmung der Rotationsachse String rotation; if (middleX == 0) { rotation = "1 0 0 "; // falls notwendig "richtig" herum drehen if (middleZ < 0) angle = (2 * Math.PI) - angle; } else { rotation = -middleZ / middleX + " 0 1 "; // falls notwendig "richtig" herum drehen if (middleX > 0) angle = (2 * Math.PI) - angle; } // Angabe einer Rotation in X3D: // 3 Koordinaten der Rotationsachse + Winkel rotation = rotation + angle; |
public void endDocument() throws SAXException { // Projektion von (zMax-middlepoint) in die XZ-Ebene double helpX = zMax[0] - (middlepoint[0] / middlepoint[3]); double helpZ = zMax[2] - (middlepoint[2] / middlepoint[3]); // Winkel zwischen help und Z-Achse double angle = Math.acos( helpZ / Math.sqrt(helpX * helpX + helpZ * helpZ)); // Falls noetig Winkel korrigieren if (helpX < 0) angle = (2 * Math.PI) - angle; try { writer.write("Viewpoint {\n"); writer.write("\tdescription \"start\"\n"); writer.write("\torientation 0 1 0 " + angle + "\n"); writer.write("\tposition " + ((middlepoint[0] / middlepoint[3]) + (2 * helpX)) + " " + (middlepoint[1] / middlepoint[3]) + " " + ((middlepoint[2] / middlepoint[3]) + (2 * helpZ)) + "\n"); writer.write("}\n"); writer.close(); } catch (IOException ioe) { System.err.println ("IOException" + ioe.getMessage()); System.exit (1); } } |