Jochen, es ist nicht das erste Mal, dass du versuchst, hier zu verkaufen. Es spricht nichts dagegen, wenn du in deinen Benutzerdaten dezent auf deine Angebote hinweist. Aber nicht so: 'Lösung für das Feder-Problem, demnächst Demoversion, und könnt ihr's kaufen...'
Es ist wie bereits gesagt keine Lösung, sondern bestenfalls eine Näherung. Dein Code krankt übrigens an zwei Dingen: Zum Einen läuft er erstmal nicht, weil du ein paar Variablennamen durcheinander gebracht hast. Das lässt sich beheben, aber dann tritt das zweite, schwerwiegendere Problem zu Tage: Du überprüfst die Benutzereingaben nicht auf Koplanarität. Beim Tetraeder kann man das durchgehen lassen - wählt der User 4 Punkte in einer Ebene, gibt's halt kein Tetraeder.
Bei den beiden anderen Polyedern ist die Sache aber komplexer. Ein Fünfflächner kann z.B. aus 2 Dreiecken und 3 Vierecken (z.B. der Keil/_WEDGE, besser bezeichnet als [schiefes] Dreiecksprisma). Er kann aber auch aus 1 Viereck und 4 Dreiecken bestehen (Viereck-Pyramide). Im ersten Fall liegen 9 Kanten und 6 Ecken vor, im
zweiten Fall 8 Kanten und 5 Ecken. Möglich ist aber auch, dass es sich um 9 Kanten, 5 Ecken und 6 Flächen bestehen. Die beiden letztgenannten Gebilde zerfallen aber nicht in drei, sondern in zwei Tetraeder! Wobei das letzte auch noch einen negativen Kantenwinkel haben kann.
Auf all das nimmt das Programm überhaupt keine Rücksicht. Es ist
reine Glückssache, ob bei 'penta' ein Acis-Körper entsteht oder das
Programm mit einem Fehler abbricht - es hängt von der gegebenen Topologie sowie der Klickreihenfolge ab. Wenn das also eine 'professionelle' Anwendung werden soll, musst du dich noch ein bisschen mit Fragen wie der Topologie, dem (Eulerschen) Geschlecht von Polyedern und der linearen Algebra auseinandersetzen. Und auch eine Beschäftigung mit dem Paradigma der Wiedervendbarkeit von Programmcode wäre angeraten.
Da ich nun nicht zu den Leuten gehöre, die alles nur verkaufen wollen,
kriegst du hier von mir mal eine leicht überarbeitete Version für die
Tetraeder - der Hauptteil ist wiederverwendbar, und das ganze ist
auf etwa ein Dutzend Zeilen Code geschrumpft. Die Funktion bbox
berechnet übrigens die Bounding Box für jede beliebige Liste von
3D-Punkten.
; user interface
(defun c:tetra( / )
;start errorhandling
(tetra
(mapcar'getpoint
'("\nErster Punkt:""\nZweiter Punkt:""\nDritter Punkt:""\nVierter Punkt:")
)
)
;end errorhandling
)
; berechnet Boung Box für beliebige Liste von Punkten
(defun bbox(pts / )
(list
(mapcar'(lambda(s)(apply'min(mapcar s pts)))'(car cadr caddr))
(mapcar'(lambda(s)(apply'max(mapcar s pts)))'(car cadr caddr))
)
)
; erzeugt Tetraeder
(defun tetra(pts / bb)
(setq bb(bbox pts))
(command"_box"(car bb)(cadr bb))
(repeat 4
(command"_slice"(entlast)""(car pts)(cadr pts)(caddr pts)(last pts))
(setq pts(append(cdr pts)(list(car pts))))
)
)
------------------
Meine AutoLisp-Seiten
Meine private Homepage
Mein Angriff auf dein Zwerchfell
Mein Lexikon der Fotografie
Mein gereimtes Gesülze
Meine Überzeugung...
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP