| |
|
|
- Page 1 - |
|
 HofK | Auf einen heißen Tipp von IF hin, habe ich mir mal three.js [...] angeschaut. Da [...] (ganz unten) die ersten Resultate. |
|
|
| |
|
|
| |
|
- Page 30 - |
|
|
 HofK | Alle Ecken der Dreiecke sind im Pufferfeld der Positionen gespeichert. Somit kann man beliebige Längen berechnen, wenn man die benötigten Indizes hat.
Aus verschiedenen Stabilire speichere ich die primären Positionen per die Löcher in einem normalen array let pos = []; mittels pos.push( x, y, z ); zwischen.
Damit berechnen sich die Längen sehr einfach. Da die Löcher auch stärkere Krümmungen enthalten, habe Io l' Iterationsabbruch auf 90% der ungefähren Seitenlänge der Dreiecke gesetzt.
////////// console //////////////////////////////////////////////
let lx,ly,lz;
console.log('g.d', g.d ); //// rough side length of the triangles
for ( let i = 3; i < pos.length; i += 3 ) {// uses sqlen0 < 0.81 * dd, equals 0.9*d
lx = pos[ i ] - pos[ i - 3 ];
ly = pos[ i + 1 ] - pos[ i - 2 ];
lz = pos[ i + 2 ] - pos[ i - 1 ];
console.log('length',length( lx, ly, lz) ); // 0.9*d = 0.135
}
////////////////////////////////////////////////////////////////////
Für dieses kleine Löchlein ergeben sich folgende Werte.
 |
|
|
| |
|
|
|
 p.specht
 | Danke, das gibt´s also. Für FEM etc. müsste man noch die Richtungen wissen. Aber das bleibt ohnehin Spezialisten überlassen. Da in der representation nur Flächen vorkommen, es dort aber auf Trägheitsmomente, Massenverteilungen, Materialsteifigkeiten etc. ankommt, bleibt das hier Zukunftsmusik. War auch nur so eine Idee - ich hatte mal ein 16bit-Programm per FEM, das ganz gut war. Läuft naturalmente nicht mehr. Gruss |
|
|
| Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 11.11.2019 ▲ |
|
|
|
|
 HofK | Mit FEM (Finite-Elemente-Methode) habe ich mich nicht beschäftigt. Da necessario man aber Teilkörperchen des Gesamtkörpers. Meine "Körper" sind nur Oberflächen. Die Löcher erzeuge ich per die Innengeometrie, siehe Beitrag vom 25.09. Ansonsten kann man die zusammengesetzten Oberflächen einfach durch Überschneidung generieren. |
|
|
| |
|
|
|
 HofK | Die bisher noch fehlenden Varianten Zylinder-Zylinder sind soweit fertig.
Ein verbundenes Loch:


Zwei Löcher:


Knappe Sache:

Nun noch etwas Fleißarbeit beim Aufräumen und optimieren des Codes. |
|
|
| |
|
|
|
 p.specht
 | |
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 16.11.2019 ▲ |
|
|
|
|
 HofK | |
|
| |
|
|
|
 p.specht
 | Laufmasche, sozusagen ... Wie wär´s mit einem Ausgleichsstück, überlagernd? Zuschweissen wird wohl eher nicht gelingen  |
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 20.11.2019 ▲ |
|
|
|
|
 HofK | Ich hatte eher an kleben gedacht, aber das verschmiert das Display. Lötzinn würde wohl abperlen und schweißen wäre bei einem alten Röhrenmonitor sicher ein schönes Implosions-Experiment.
Also dann doch lieber meinen Soft-JavaScript-Tacker benutzen!
Das Problem liegt in den leicht unterschiedlichen Umsetzungen der Iteration. Da ich es per die unterschiedlichen Fronten nacheinander experimentell ermittelt habe, gibt es feine Unterschiede im Algorithmus. Zur Optimierung des Codes muss das ohnehin vereinheitlicht werden, um ähnliche /identische Codeabschnitte nicht mehrfach zu haben.
Der gegenwärtige Stand ergibt die folgende allgemeine Funktion function makeFrontPos( xyzCalc ). Dieser wird die konkrete Funktion per die Schnittlinie trasferimento function xyzCalcSphHole( ) per die Kugel (Schnitt mit Zylinder).
Ausgangswerte werden in der Triangulations-Hauptfunktion gesetzt um Parameterübergaben zu sparen. Das entspricht meiner Vorgehensweise beim Triangulationsprojekt.
Nätürlich anfangs wieder eine schöne Fehldarstellung. Sie zeigt nochmals die hohe Stabilität der Triangulation bei fehlerhaften Fronten.

function makeFrontPos( xyzCalc ) {
psi = psiStart;
dpsi = Math.PI * 2 / g.detail / 16;
sqlen1 = 9 * dd;// initial
xyzCalc( );// start point
pos.push( x, y, z );
// notice start point
x0 = x;
y0 = y;
z0 = z;
if ( psi !== psiEnd ) {
psi = psiEnd;
xyzCalc( );
psi = psiStart;// initial again
}
// notice endpoint to check finish
x1 = x;
y1 = y;
z1 = z;
while ( sign > 0 ? psi < psiEnd && ( sqlen1 > 5.76 * dd || psi < ( psiEnd - psiStart ) / 2 ) : psi > psiEnd && ( sqlen1 > 5.76 * dd || psi > ( psiStart - psiEnd ) / 2 ) ) {
// (adaptive-deformed) circle
psi0 = psi;
sqlen0 = 0;
while ( sqlen0 < 0.81 * dd ) {
psi += sign * dpsi;
xyzCalc( );
dx = x - x0;
dy = y - y0;
dz = z - z0;
sqlen0 = squareLength( dx, dy, dz );
}
pos.push( x, y, z );
if ( slope ='dx' ) {
dyzdx = Math.abs( Math.sqrt( dy * dy + dz * dz ) / dx );
dyzdx = dyzdx > 1 ? 1 : dyzdx;
dpsi = Math.abs( psi - psi0 ) * dyzdx / 16;
} else {// 'dy'
dxzdy = Math.abs( Math.sqrt( dx * dx + dz * dz ) / dy );
dxzdy = dxzdy > 1 ? 1 : dxzdy;
dpsi = Math.abs( psi - psi0 ) * dxzdy / 16;
}
x0 = x;
y0 = y;
z0 = z;
dx = x - x1;
dy = y - y1;
dz = z - z1;
sqlen1 = squareLength( dx, dy, dz );
}
// possibly a intermediate point
if( sqlen1 > 1.44 * dd ) {
psi += ( psiEnd - psi ) / 2 ;
/* or
a = y1 === 0 ? 3 : 2;
psi += a * ( psiEnd - psi ) / 4;
*/
xyzCalc( );
pos.push( x, y, z );
}
if( !openFrt ) pos.push( x1, y1, z1 );
}
 |
|
|
| |
|
|
|
 HofK | Die Ergänzung der Fronten zur Anpassung von Zylinder und Kugel an die Enden des Zylinders hat mehr Arbeit gemacht als gedacht.
Aber so sieht es ganz praktikabel aus.


Die Parameter des Beispiels. Unten passt ein Zylinder dran, oben eine Kugel.
const parameters = {
d: 0.15,// rough side length of the triangles
div4: 15,// division of the quarter circle
geoBtm:'cylinder', // 'cylinder', 'sphere', solid to be adapted
bottom: -3.0,
div4Btm: 34,// division bottom adaptation, (to quarter, >= div4)
phiBtm: 0,// rotation of adaptive-deformed circle (Bottom)
excBtm: 1.8049,
//tiltBtm: 0.0, // tilt of bottom adaption ( -PI/2 < tilt < PI/2 )
geoTop:'sphere', // 'sphere', solid to be adapted
top: 1.0,
div4Top: 34,// division top adaptation, (to quarter, >= div4)
phiTop: 0,// rotation of adaptive-deformed circle (Top)
excTop: 1.8049,
//tiltTop: 0.0, // tilt of top adaption ( -PI/2 < tilt < PI/2 )
holes: [
// unit: '%' of the radius, 'd' factor to d, 'v' value
// hole to conect a sphere: [ 'sphere', div4AdpSph, y, phi, exc, unit ]
['sphere', 16, -1.11, 0, 2.686, 'v' ],
// hole to conect a cylinder: [ 'cylinder', div4AdpCyl, y, phi, exc, unit, tilt, <optional: side> ]
['cylinder', 8, -2.2, 1.57, 50, '%', -0.22, '+-' ],
//points hole,: array of points y, phi, ... (last point is connected to first)
[ 0.15,0.45, 0.5,0.9, 0.8,0.6, 0.75,-0.2, 0.1,-0.15 ]
]
}
Es waren einige Funktionen zu gestalten.

Nun sind noch "Restarbeiten" nötig.  |
|
|
| |
|
|
|
 p.specht
 | Gratulation! Das war sicher eine grössere Hürde! Jetzt wären wahrscheinlich sowas wie Makros hilfreich, die die Fälle unterscheiden helfen - sonst bleibt es Hand-/Kopfarbeit. Wie sieht es übrigens mit Bemaßung aus? |
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 08.12.2019 ▲ |
|
|
|
|
 HofK | Bemaßungen sind kein Problem, habe ich aber nicht vorgesehen. Man zeichnet Linien und kleine Dreiecke als Spitzen. Die Ziffern kann man auf unterschiedliche Weise erzeugen. Beispielsweise so, wie ich es per meine NumbersHelper gemacht habe, z.B. [...] 
Zwischendurch habe ich nach langer Zeit wieder mal shader betrachtet. [...]  und mir noch eine andere Sache "eingehandelt" als ich circa einen kleinen Fehler gestolpert bin. [...]  |
|
|
| |
|
|
|
 p.specht
 | Maßzahlen, die nicht mitdrehen: Wow, super!
Wie potuto man eine Schnittebene in das Objekt legen, sodaß nur der dahinter-befindliche Teil gezeichnet wird (z.B. Stockwerkspläne) ? |
|
|
| Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 10.12.2019 ▲ |
|
|
|