Hallo, mit diesem Code möchte ich aus einer Datei eine Zahl lesen und auf dem Bildschirm ausgeben: /* fscanf example */ #include <stdio.h> int main () { float f; FILE * pFile; pFile = fopen ("Test_PCB","a+"); fscanf (pFile, "%f", &f); fclose (pFile); printf ("I have read: %f \n",f); return 0; } das funktioniert auch - aber: wenn vor der Zahl in der Datei Zeichen stehen z.B. PA813, dann funktioniert es nicht - wie kann ich formatiert lesen, so, daß die Zeichen vor der Zahl ignoriert werden? Bitte um Hilfe! Danke! PS: habe gerade erst mit C angefangen...
Janine Janine wrote: > Lies die Zeichen in ein char* array ein, z.B. char* ist kein Array. > char *str="PA813";[/c] Wenn du ihm schon diesen Tipp gibst, dann mach es richtig! In dem Fall ist nämlich, gerade für einen Anfänger, ein Pointer keine gute Wahl. Er muss einlesen! Und dazu braucht er eine Speicherfläche in die er einlesen kann. Die hat er aber mit der von dir vorgeschlagenen Version nicht.
1 | char InLine[256]; // das reicht bereits für relativ lange |
2 | // Eingabezeilen
|
3 | |
4 | fgets( InLine, sizeof( InLine ), pFile ); |
Jetzt ist die komplette Zeile im Speicher. Den Returncode von fgets sollte man noch überprüfen, um festzustellen ob die Leseaktion überhaupt funktioniert hat. Du hast jetzt 2 Möglichkeiten: * Wenn du weist, dass die Zahl immer an der 3. Stelle beginnt dann kannst du das so machen wie Janine das vorgeschlagen hat sscanf( &InLine[2], "%f", &f ); * Wenn die Anzahl der Buchstaben vor der Zahl variabel ist, dann musst du nach der ertsen Ziffer suchen: Einfach Zeichen für Zeichen im String durchgehen und nachsehen ob er bereits eine Ziffer ist. isdigit() ist da von Nutzen. Nachdem du weist, wo die Zahl beginnt, kannst du dann wieder mittels sscanf auf den String losgehen. Es gibt noch eine dritte Möglichkeit. Man kann im Format String vom sscanf mittels spezieller Formatierungen sscanf dazu bringen, dass es selbsttätig alles was kein Digit ist in einem ersten Schritt überliest. Allerdings weis ich nicht wie das geht :-) Hat was mit regular Epressions zu tun und die gabs in meiner C Zeit noch nicht. >>PS: habe gerade erst mit C angefangen... > Das merkt man. Du solltest dich auch etwas zurückhalten, wenn du Dinge nicht richtig weist. Und du solltest den Spruch etwas mehr beherzigen: Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.
char *p; fgets( InLine, sizeof( InLine ), pFile ); p = InLine; while( !isdigit(*p) && (*p != 0)) p++); // Lesen bis zur ersten Ziffer if (isdigit(*p)) { // Ziffer gefunden sscanf(p,"%f",&f); } else { // behandlung wenn keine Ziffer vorhanden ist } Behandlung des String wenn keine Ziffer vorhanden ist Gruss Helmi
Zuerst einmal danke für Eure Antworten! Mittlerweile bin ich doch noch auf eine Lösung gekommen: /* fscanf example */ #include <stdio.h> int main () { char str[80]; float f; FILE * pFile; pFile = fopen ("Test_PCB","a+"); fscanf (pFile, "%[^0123456789] %f", str, &f); fclose (pFile); printf ("I have read: %f \n",f); return 0; } schönen Tag noch!
Wenn du dein Muster noch etwas erweiterst, ist es perfekt: fscanf (pFile, "%[^0123456789+-.] %f", str, &f); Floatwerte können ein Vorzeichen haben und müssen keine Ziffern vor dem Dezimalpunkt haben.
Uberpruefung ob ueberhaupt was gueltiges eingelesen wurde if(!fscanf (pFile, "%[^0123456789+-.] %f", str, &f)) { printf("Nix da\n"); } Gruss Helmi
also ich wuerd das so machen: #include <iostream> #include <fstream> using namespace std; int main(void) { ifstream infile; infile.open("test.txt"); char c; while(infile.good()) { infile >> c; if (atoi(&c) > 0 || c == '0') cout << c; } cout << endl; infile.close(); return 0; } das einzige problem bei der sache ist halt der 0er, den man extra abfragen muss...
Michael Niegl wrote: > int main(void) { > ifstream infile; > infile.open("test.txt"); > char c; > > while(infile.good()) { > infile >> c; > if (atoi(&c) > 0 || c == '0') cout << c; > } > Da sind mehrere Fehler drinnen. * Du verwendest das Leseergebnis von infile >> c ohne zu prüfen ob die Leseoperation überhaupt gut gegangen ist. * atoi will immer noch einen String und keinen einzelnen Character. * Wozu die Sonderbehandlung für '0'. Wenn schon, dann so (wenn wir das 'Problem' von Vorzeichen und Kommapunkt mal beiseite legen) while( infile >> c ) { if( isdigit( c ) ) Man verwendet selten bis gar nicht den stream-Status um die Lese-Schleife zu terminieren. Das ist in C++ nicht anders als in C. Für eine ausführlichere Behandlung des Problems siehe hier. Ist zwar für C, das Prinzip ist aber auch für C++ anwendbar Beitrag "Re: C+ neuling mit Dateien und Daten umstrukturierungs PROBL"
Janine Janine wrote: > Deine Besserwisserei ist zum Kotzen. Oh, Janine. Deine Unkenntnis wird nur noch von deiner Arrogasnz übertroffen. > Michael hat überhaupt keine Fehler > gemacht. Ob Fehler auftreten, hängt von der Eingabe ab. Lern erstmal C bzw. C++ bevor du dich mit mir anlegst.
Janine Janine wrote: >>Lern erstmal C bzw. C++ bevor du dich mit mir anlegst. > > Was soll's? Wenn ich Beiträge schreibe, die dir nicht passen, löscht du > sie. Da muss ich dich leider enttäuschen. Ich weiß nicht wer deine Beiträge löscht. Ich weiß aber, das ich es nicht bin. > Ich will mich nicht mit dir anlegen, sondern dich dazu bringen, > einzusehen, daß deine "Ich bin der C-Gott, und alle doof außer > ich"-Einstellung hier sowas von daneben ist. Oh. Ich bin keineswegs der C-Gott. Aber wenn du Aussagen wie "Michael hat überhaupt keine Fehler gemacht. Ob Fehler auftreten, hängt von der Eingabe ab." machst, dann solltest du die etwas besser begründen können als mit: "Ich bins Janine Janine, und kraft meiner Autorität erkläre ich den Code für richtig". Der Code ist nämlich keineswegs richtig. Und im Gegensatz zu dir kann ich das auch begründen.
>Und im Gegensatz zu dir kann ich das auch begründen. Aha. Soooooo? >Da sind mehrere Fehler drinnen. >* Du verwendest das Leseergebnis von infile >> c ohne zu prüfen > ob die Leseoperation überhaupt gut gegangen ist. Und wenn die Leseoperation gut geht, wo ist der Fehler? >* atoi will immer noch einen String und keinen einzelnen Character. atoi will einen char*, und was ist deiner Meinung nach &c? >* Wozu die Sonderbehandlung für '0'. Wozu nicht? Aber da Götter immer Recht haben, kannst du jetzt gerne ungestört weiter labern.
Janine wrote: >>Und im Gegensatz zu dir kann ich das auch begründen. > > Aha. Soooooo? > >>Da sind mehrere Fehler drinnen. >>* Du verwendest das Leseergebnis von infile >> c ohne zu prüfen >> ob die Leseoperation überhaupt gut gegangen ist. > > Und wenn die Leseoperation gut geht, wo ist der Fehler? Die Leseoperation geht mindestens 1 mal nicht gut. Nämlich dann, wenn die Datei zu Ende ist. Da das Michaels Code nicht weiter kümmert, bearbeitet er das letzte Zeichen in der Datei doppelt. Du würdest dich schön bedanken, wenn deine Bank dir deine letzte Abhebung von deinem Konto doppelt abzieht. Zu hoch für dich? Dann lies den Beitrag, auf den ich verlinkt habe. Da ist es ein klein wenig ausführlicher dargestellt. > >>* atoi will immer noch einen String und keinen einzelnen Character. > atoi will einen char*, und was ist deiner Meinung nach &c? Ein &c macht aus einem einzelnen Character noch lange keinen String. Ein String hat immer einen '\0' als Abschluss und den kann ich in einem einzelnen Character beim besten willen nicht sehen. Oder anders ausgedrückt: Ein String, der ein Nutzzeichen enthält, besteht aus 2 chars. Wie willst du diese beiden chars in einem einzelnen char unterbringen? > >>* Wozu die Sonderbehandlung für '0'. > Wozu nicht? Weil sie unnötig ist. > > Aber da Götter immer Recht haben, kannst du jetzt gerne ungestört weiter > labern. Wie gesagt: lern erst mal C. Bis jetzt hab ich 2 Postings von dir zu Programmierthemen gesehen. Beide enthielten Fehler. Und um dem vorzubeugen: Ja, ich mache auch Fehler. Wir alle machen Fehler. Aber die arrogante Art, die du in anderen Themen an den Tag gelegt hast, sucht seinesgleichen. Wenn man schon lästert, dann sollte man in den technischen Antworten schon sehr gut sein. Das bist du aber leider nicht.
@Janine: Also wenn Du so eine eine Konstruktion
1 | char c; |
2 | ...
|
3 | atoi(&c); |
für fehlerfrei hälst, solltest Du lieber die Klappe halten. Da kannst Du eher noch froh sein wenn Deine Beiträge gelöscht werden und Deine Dummheit nicht sofort offensichtlich wird.
Karl heinz Buchegger wrote: > >>>* Wozu die Sonderbehandlung für '0'. >> Wozu nicht? > > Weil sie unnötig ist. Da muss ich nachhaken. So wie das oben von der Idee her geschrieben ist, ist diese Sonderbehandlung tatsächlich notwendig. Da war ich zu voreilig. Allerdings gäbe es noch eine Menge über atoi() zu sagen. Unter anderem dieses, dass diese Funktion zu Gunsten von strtoi() nicht verwendet werden sollte. Das Problem dabei: atoi hat keine Möglichkeit dem Aufrufer zweifelsfrei mitzuteilen, ob eine Konvertierung geklappt hat oder nicht. (*) strtoi() und seine Kumpanen strtol(), strtod() (alle aus der stdlib.h) bieten diese Möglichkeit. (*) Edit: Nein. Ein Returnwert von 0 ist kein Ersatz dafür. Woher weist du, dass der Eingabestring für atoi() nicht tatsächlich "0" oder "00" oder "000" oder "0000" oder .... war. In all diesen Fällen liefert atoi() ebenfalls eine 0. Somit stehts du am Ende mit dem Wissen da, dass atoi() zwar eine 0 zurückgeliefert hat, du aber nicht weist warum.
@ Karl heinz Buchegger (kbuchegg) Woher kommt das eigentlich immer wieder dass man eine "C++ Frage" stellt und den Leuten dann C Code präsentiert? (siehe Eingangs Thread)? Hast du da eine Erklärung für? Ist der Begriff C mittlerweile so ausgestorben, dass man mittlerweile alles unter C++ subsummiert? PS: wo liegen eigentlich deine Stärken? (würde mich mal interessieren) gibt's da eine Rangfolge? Mit nativ Win32-API (mach ich gerne) bist du ja ebenfalls ganz gut vertraut. (anderer Thread letztens). Wie sieht es mit C# aus? (will dich nicht ausfragen, mich interessiert nur deine Meinung)
egal wrote: > @ Karl heinz Buchegger (kbuchegg) > Woher kommt das eigentlich immer wieder dass man eine "C++ Frage" stellt > und den Leuten dann C Code präsentiert? (siehe Eingangs Thread)? Hast du > da eine Erklärung für? Ist der Begriff C mittlerweile so ausgestorben, > dass man mittlerweile alles unter C++ subsummiert? Nicht wirklich. Ich denke es kommt daher, dass leider immer noch sehr häufig C++ als eine Art 'besseres C' verkauft wird. Das mag in den C++ Anfangsjahren noch so einigermassen zutreffend gewesen sein, ist es aber heutzutage definitiv nicht mehr. Leider gibt es immer noch C++ Lehrer, die ihre Schüler zuallerst mal durch C-Strings, C-dynamische-Arrays, C-Filehandling, ... durchjagen, anstelle die entsprechenden C++ Konstrukte zu benutzen. String Verarbeitung in C++ ist mit der std::string Klasse ein Klacks. Den Schrecken der dynamischer Speicherallokierung werden in C++ durch std::vector, std::list, std::map und was es da sonst noch so alles gibt, der Zahn gezogen. Wenn man C++ tatsächlich in C++ Manier programmiert, dann ist das alles (und noch so einiges was es sonst noch so in C gibt) kein Thema mehr. Warum das aber in vielen Fällen so nicht gelehrt wird, weiß ich auch nicht. Es wird aber besser. Vor einigen Jahren musste man in comp.lang-c++ noch richtiggehende Aufklärungs- arbeit bei hilfesuchenden Schülern leisten. Da war das vermitteln von 'vergiss den Datentyp float gleich wieder und benutze double' noch eine der leichteren Übung. > > PS: wo liegen eigentlich deine Stärken? (würde mich mal interessieren) Ich komme aus der Ecke Computer-Graphik, Solid Modelling, CAD. Wobei mich der mathematische Teil immer am meisten fasziniert hat. Leider hat mich meine Berufslaufbahn nun in eine ganz andere Ecke verschlagen, so dass ich nur noch hobbymässig damit zu tun habe. Ein Projekt in dem ich noch involviert bin: http://theis.web.cern.ch/theis/simplegeo/ > gibt's da eine Rangfolge? Mit nativ Win32-API (mach ich gerne) bist du > ja ebenfalls ganz gut vertraut. (anderer Thread letztens). Wie sieht es > mit C# aus? C#: Eher wenig. .Net mag ich nicht besonders. Ein alter Hund lernt halt keine neuen Tricks mehr :-) Wird mir aber auf Dauer nicht erspart bleiben, mich da intensiver reinzuknien. Und: Sprachen mit Garbage Collection kann ich nicht leiden :-) Im Ernst: Nach 1 Jahr C# traue ich mir da noch kein wirklich fundiertes Urteil zu. Auf der einen Seite gehen einige Dinge doch um einiges einfacher als in C++. Auch gibt es ein paar wirklich nette Sprachfeatures in C#, die ich in C++ vermisse. Zb. Properties sind schon längst überfällig. Reflection ist in C# ein mächtiges Werkzeug und von den Code Attributen bin ich fasziniert. Auf der anderen Seite muss ich bei Events und Delegates ständig in meinem Buch nach der richtigen Syntax blättern :-) Und über das .Net Framework brauchen wir nicht diskutieren. Im Vergleich zur MFC ist das Ding 'erste Sahne' aufgebaut.
>...du aber nicht weist warum.
Kapierst du es mal? Es heißt "du weißt nichts" und "du heißt". Im
Gegensatz zu "ich bin weise" und "Buchegger liest zu viel heise".
Ist es nicht traurig, wenn man C für seine Muttersprache hält und kein
deutsch mehr schreiben kann?
Deine anderen Auslassungen kommentiere ich jetzt mal nicht, bis du dir
im Klaren bist, was du für richtig und falsch hältst.
Janine wrote: >>...du aber nicht weist warum. > > Kapierst du es mal? Es heißt "du weißt nichts" und "du heißt". Im > Gegensatz zu "ich bin weise" und "Buchegger liest zu viel heise". Ach weist du was (:-) Behalte doch die Rechtschreibfehler für dich. Schön wenn du wenigstens die findest. Druck sie aus, lass sie dir einrahmen und häng sie dir an die Wand. > > Ist es nicht traurig, wenn man C für seine Muttersprache hält und kein > deutsch mehr schreiben kann? Ist es nicht traurig, wenn man in einem Programmiersprachenforum zwar perfektes Deutsch kann, aber am eigentlichen Thema nicht mitreden kann. > Deine anderen Auslassungen kommentiere ich jetzt mal nicht, bis du dir > im Klaren bist, was du für richtig und falsch hältst. Ist schon gut. Du willst nicht lernen. Du willst nur lästern. Geh schlafen.
@Karl heinz Buchegger (kbuchegg) Ahh .. (etwas Licht im Dschungel); also die MFC hab ich als "gelegenheits Programmierer" ;) nie verwendet, die "Methode Petzold" (Buch wirst du kennen) war mir immer sehr viel angenehmer, auch wenn die Nachrichtenschleife meist etwas lang wurde :-)) Zumal es da ein paar schöne Seiten gibt wie die von johnfindlay. Die c't hatte vor Jahren bereits den lcc-win32 von Jacob Navia vorgestellt (alles c, hauptsächlich aber um win32 Programme zu schreiben). Ist eigentlich ein schönes Projekt inkl. Debugger, nur die IDE ist irgendwie nicht das Wahre (die Art und Weise wie dort Projekte angelegt werden (müssen) ist doch sehr gewöhnungsbedürftig und vor allem öfter mal buggy). Was ich aber etwas erschreckend finde sind die vielen Fehler die dort heute noch (nach Jahren) immer wieder gefixt werden (müssen), teilweise wirklich heftige Bugs (siehe Historie). Da fragt man sich unweigerlich, ob Programme die damit übersetzt wurden nicht doch mal später Fehler produzieren, die man vielleicht erst gar nicht bemerkt. Bisher lief das z.B. IMMER auch unter Windows 98, seit neuesdem startet wedit nicht mehr, obwohl die Installation ohne Probleme verläuft. In einem Topic ist vor kurzem (zufällig gelesen) auch zugegeben worden, dass die IDE nicht wirklich das Gelbe vom Ei ist und man sich gerne eine modernere IDE wie z.B. die von Pelle Orinius wünschen würde (irgendwie kennen die sich auch alle untereinander). Vielleicht braucht es auch den lcc-win32 nicht mehr seit MS ihre Express Versionen verschenkt. Es gibt mittlerweile derart viele Wege und Möglichkeiten das Feld Programmieren "zu beackern", dass es schwer fällt noch den Überblick zu behalten. Das dot Net Zeugs entwickelt sich rasant und erschägt einen mit Funktionen (ich nenne es jetzt mal ganz naiv so). Auf der anderen Seite will man vielleicht was Plattform übergreifendes (jaja, es gibt Mono, aber wo steht das entwicklungstechnisch (gegenüber MS) und läuft ein IL Programm auch genau so unter Linux bez. Grafik? Vielleicht doch eher QT, aber QT und C? Da ist man wieder schnell bei C++ (diesmal das Richtige mit Klassen usw.). Dafür würde es sich extrem gut unter KDE (was ja QT nutzt) machen, während man bei GTK-2 wieder das Gefühl bekommt, von der Windows Welt weitest gehend abgekoppelt zu sein (jaja, da gibt es auch was, aber ist das dass non plus ultra?). Irgendwann ist man dann froh sein Konsolen Progrämmchen in gutem alten C hinbekommen zu haben, reicht ja für viele Aufgaben auch aus und .NET samt C Sharp und Konsorten liest man sein Äonen nebenbei und wundert sich oder erfreut sich an den vielen nett klingenden Fachbegriffen (wer erkennt sich wieder? :)))
1 | Ich komme aus der Ecke Computer-Graphik, Solid Modelling, CAD. |
2 | Wobei mich der mathematische Teil immer am meisten fasziniert |
3 | hat. Leider hat mich meine Berufslaufbahn nun in eine ganz andere |
4 | Ecke verschlagen, so dass ich nur noch hobbymässig damit zu tun |
5 | habe. Ein Projekt in dem ich noch involviert bin: |
6 | http://theis.web.cern.ch/theis/simplegeo/ |
Mich interessiert das Projekt. Habt ihr die Modellierungsfunktionen selbst geschrieben? (Also die booleschen Operationen) , so wie ich das sehe, hat die Software so etwas??
Gast wrote: > Mich interessiert das Projekt. Habt ihr die Modellierungsfunktionen > selbst geschrieben? (Also die booleschen Operationen) Ja. > , so wie ich das > sehe, hat die Software so etwas?? Ganz genau. Das Ganze ist ein Modellierungssystem speziell für die Leute vom CERN. Bei denen geht es darum, ihre Target-Kammern zu modellieren, in denen später die Teilchen kollidieren. Dieses Modell geht in ein Simulationssystem, in dem simuliert wird was sich in der Kammer abspielt und was an Ereignissen zu erwarten ist. Diese Simulation ist nicht Gegenstand des Programms. Früher haben die CERN-Leute die Modellierung händisch gemacht, indem sie den CSG Baum in einem Textfile beschrieben haben. Das war dann nicht ungewöhnlich, dass ein Physiker 2 Wochen an so einem Modell gesessen ist, ehe er alle CSG Fehler raus hatte.
Gast wrote: > Danke, > Auf welcher Basis arbeitet die Modellierung --- Brep? Ja. Ist ein Brep Modeller. Der hat mich Jahre an Lebenszeit gekostet, bis die pathologischen Fälle so einigermassen unter Kontrolle waren. :-)
Hat der auch eine Octree-Verwaltung? Ich habe auch vor so etwas zu programmieren Hätte großes Interesse an so etwas. Kann man davon einen näheren Einblick bekommen? Hast du irgendwelche Code-Vorlagen für dein Projekt benutzt? o. gibt es irgendwo Abhandlungen zu diesem Thema?
Gast wrote: > Hat der auch eine Octree-Verwaltung? Nein. > Ich habe auch vor so etwas zu programmieren Na dann, ans Werk. > Hätte großes Interesse an so etwas. Kann man davon einen näheren > Einblick bekommen? Hast du irgendwelche Code-Vorlagen für dein Projekt > benutzt? o. gibt es irgendwo Abhandlungen zu diesem Thema? http://breplibrary.sourceforge.net/
Gast wrote: > Also hast du das doch nicht selbst programmiert, wenn du eine Library > nutzt. Du hast mich gefragt, ob ich eine Library kenne. Und ich hab dir einen Link dafür gegeben. Ich hab ja nicht gesagt, dass ich diese Library verwende. Und doch, die ist selbst gemacht. Aber die geb ich nicht her. Musst du verstehen. Ich hab > 10 Jahre an der Lib gearbeitet und gebastelt. Die ist mein 'Schatz'. PS: Lad dir die Library runter und probier sie aus. Dann wirst du schnell merken, dass nicht alles Gold ist was glänzt. Wenn sich 2 Körper eindeutig durchdringen, ist Solid Modelling mit BREP kein Problem. Ist letztzendlich nur ein Haufen Schnittpunktsberechnung und Buchführung über die Geometrie und deren Modifikation. Interessant sind die pathologischen Fälle: 2 Flächen sind koplaner, 2 Kanten sind kollinear, 2 Eckpunkte fallen aufeinander, schleifende Schnitte, etc.
Hallo ich werde das sowie so anders machen wie du. Ich werde das schneller programmieren. Ich habe keine 10 Jahre Zeit für so einfache Sachen. Kannst dein "Schatz" behalten.
Ja, mach das mal. Wenn du dich ran hältst, kannst du in 1 bis 2 Monaten eine erste Version locker fertig haben. Wenn du die hast, dann melde dich mal. Dann geb ich dir ein paar Testfälle. Und dann geht die Arbeit erst richtig los :-) Edit: Wir reden doch noch über BREP. Oder? Oder bist du der, der zur Zeit dein Solid Modelling mittels Bitmap macht? Bitmap geht auch. Aber wenn du halbwegs zuverlässige Daten über Oberfläche und Volumen des Resultats brauchst, ist es nicht so toll.
@Gast: > Also hast du das doch nicht selbst programmiert, wenn du eine Library > nutzt. Doch, der Modeler + rendering frontend sind eine Eigenentwicklung. Wenn du dich umsiehst, dann wirst du herausfinden, dass freie Solid-Kerne aus gutem Grund nicht sehr zahlreich gesaeht sind, und solche die (zumindest viele) pathologische Fehler abfangen, noch viel viel spaerlicher. > Hallo ich werde das sowie so anders machen wie du. Ich werde das > schneller programmieren. Ich habe keine 10 Jahre Zeit für so einfache > Sachen. Kannst dein "Schatz" behalten. Na na, ruhig Blut und schnauf mal ein bisschen durch! Wenn du meinst keine 10 Jahre Zeit fuer so "einfache" Sachen zu haben, dann wuensche ich Dir viel Glueck und hoffe, dass du eine hohe Frustrationsschwelle hast. Karl Heinz, es scheint als haetten wir irgendetwas falsch gemacht, wenn wir da mehrere Jahre fuer soetwas "triviales" gebraucht haben ;-) @Gast: Der Code des Modelers ist wie gesagt leider nicht oeffentlich verfuegbar, aber falls du einen Einstieg in die Thematik Solid Modeling suchst, dann schau dir mal folgendes Buch an: An Introduction to Solid Modeling, Martii Mantyla Falls du das ganze auf die "schnelle" mittels Bildoperationen machen willst, dann such nach den Publikationen von Goldfeather bei Google. Jedoch wirst du fuer komplexe Modelle damit nicht weit kommen. mfG Chris
Chris Theis wrote: > Karl Heinz, es scheint als haetten wir irgendetwas falsch gemacht, wenn > wir da mehrere Jahre fuer soetwas "triviales" gebraucht haben ;-) Meine Güte. Chris, wie um alles in der Welt kommst du in dieses Forum? Oder arbeitest du seit neuesten mit µC :-) > @Gast: Der Code des Modelers ist wie gesagt leider nicht oeffentlich > verfuegbar, aber falls du einen Einstieg in die Thematik Solid Modeling > suchst, dann schau dir mal folgendes Buch an: > > An Introduction to Solid Modeling, Martii Mantyla Yep. Mantylä ist ein gutes Buch. Baut auf einer Winged-Edge- Data-Structure und Euler Operatoren auf. Die Buch-Version die ich habe, ist eine Pascal Version. Von besagtem Professor Mantylä gibt es auch einen C-download. Seid aber vorsichtig damit. Der Pascal Code wurde eher nachlässig nach C umgesetzt und strotzt nur so vor einfachen Fehlern. Edit: Im Buch sind die Codebeispiele tatsächlich in C geschrieben. Man merkt aber, daß die Urversion eine Pascal Version war. So viele Sprachen in denen der 0-Zeiger NIL heist, gibt es schliesslich nicht (um nur ein Merkmal zu nennen).
Ich suche kein Einsteiger Tutorial. Ich bin auch kein Freizeitprogrammierer. Ich habe auch schon mein eigenes Algo-konzept. Zugeschnitten auf meine Anforderungen.Ich brauche auch keinen Source. Das wichtigste was mich interessiert, sind Konzepte für die kleinen nützlichen Helperfunktionen die man so braucht -- Insidetest , Trinangulierung usw. Nun werden die ersten Überlegungen zu den Standartfunktionen gemacht. Ein Standarttest der gebraucht wird, ist der Inside-Test Wie habt ihr einen Inside-Test realisiert. Also wie testet ihr ob ein Punkt innerhalb eines geschlossenen Breps liegt? Ich hoffe solche Frage nicht viel verlangt.
Gast wrote: > Ein Standarttest der gebraucht wird, ist der Inside-Test Wie habt ihr > einen Inside-Test realisiert. Also wie testet ihr ob ein Punkt innerhalb > eines geschlossenen Breps liegt? Mit dem Schnittpunkstest. Funktioniert völlig analog zum 2D Fall. Ein Strahl wird in eine Richtung geschickt und die Anzahl der Schnittpunkte mit den begrenzenden Flächen gezählt. Bei ungerader Anzahl: drinnen. Bei gerader Anzahl: draussen. > Ich suche kein Einsteiger Tutorial. Wenn du die Frage nach dem Inside Test stellst, solltest du dir den Mantylä erst recht reinziehen. Gerade der Inside Test verallgemeinert sehr sehr gut vom 2D Test in höhere Dimensionen.
Ich kenne den Inside Test für 2D. Den habe ich auch in mehreren Varianten einschließlich für Konturen mit Kreisbögen umgesetzt. Deshalb hatte ich auch schon die Ideen den für 3D, so wie du es beschrieben hast, einzusetzen. Mich würde jetzt aber interessieren wie ihr die Sonderfälle gelöst habt . was macht Ihr wenn der Strahl direkt auf die Kante eines Dreieckes trifft. Genau genommen müssten dann ja immer die beiden benachbarten Dreiecke betroffen sein. In 2D habe ich dafür eine Lösung die aber nicht auf 3D übertragbar ist.
Gast wrote: > Ich suche kein Einsteiger Tutorial. Ich bin auch kein > Freizeitprogrammierer. Ich hab ja auch nie behauptet, dass du ein Freizeitprogrammierer bist! Auf alle Faelle ist das Buch von Mantylä KEIN Einstiegstutorial, sondern es arbeitet die mathematischen Grundlagen zu diesem Thema auf. Ich weiss ja nicht wie es um deine Mathe Kenntnisse steht, aber die Theorie zu diesem Thema ist nicht so trivial und so Dinge wie 2-manifolds etc. sollten einem da schon gelaeufig sein. Wenn nicht - und das ist keine Schande!, dann ist das Buch auf alle Faelle ein guter Startpunkt, vor allem fuer weiterfuehrende Publikationen. > Ich habe auch schon mein eigenes Algo-konzept. Zugeschnitten auf meine > Anforderungen.Ich brauche auch keinen Source. Das wichtigste was mich > interessiert, sind Konzepte für die kleinen nützlichen Helperfunktionen > die man so braucht -- Insidetest , Trinangulierung usw. Auch dort findest du Konzeptinfos in dem Buch, aber wie Karl Heinz schon gesagt hat, die Code Beispiele sind eher als "Anregung" zu verstehen, da einige Fehler drinnen sind. Ich wuerde zusaetzlich das Buch "Geometric Tools" von Dave Eberly empfehlen. Dort findest du neben einigen mathematischen Grundlagen auch gute und vor allem numerisch robuste Ansaetze fuer solche Probleme. > Nun werden die ersten Überlegungen zu den Standartfunktionen gemacht. > Ein Standarttest der gebraucht wird, ist der Inside-Test Wie habt ihr > einen Inside-Test realisiert. Also wie testet ihr ob ein Punkt innerhalb > eines geschlossenen Breps liegt? > Ich hoffe solche Frage nicht viel verlangt. In SimpleGeo funktioniert dies eigentlich auf 2 verschiedene Arten, denn der Modeler ist eigentlich ein Hybrid Ansatz. Das heisst er haelt die analytische CSG Beschreibung des Baumes parallel zum "on-the-fly" erstellten BREP Modell, welches zur Visualisierung verwendet wird. Der Inside Test funktioniert so, dass grundsaetzlich der von Karl Heinz erwaehnte Ansatz gerechnet wird. Fuer eine Reihe von analytischen Primitiva (z.B. Kugel, Box, Zylinder etc.) wird jedoch ein analytischer Test gerechnet und zusaetzlich die Bool'sche Algebra des Baumes ausgewertet. Dies ist schneller und man umgeht die Ungenauigkeiten der durch die BREPS approximierten Oberflaechen.
gast wrote: > Ich kenne den Inside Test für 2D. Den habe ich auch in mehreren > Varianten einschließlich für Konturen mit Kreisbögen umgesetzt. Deshalb > hatte ich auch schon die Ideen den für 3D, so wie du es beschrieben > hast, einzusetzen. Mich würde jetzt aber interessieren wie ihr die > Sonderfälle gelöst habt . was macht Ihr wenn der Strahl direkt auf die > Kante eines Dreieckes trifft. Genau genommen müssten dann ja immer die > beiden benachbarten Dreiecke betroffen sein. In 2D habe ich dafür eine > Lösung die aber nicht auf 3D übertragbar ist. Schau doch mal in folgendes Buch: "Handbook of Discrete and Computational Geometry" (Goodman, O'Rourke (eds.)) by Jack Snoeyink. Ein numerisch guter Ansatz fuer genau solche Problem wie du es erwaehnst ist, den Test nicht durch Ray-Tracing zu machen, sondern ueber Solid Angles. Such in Google mal unter "point in polyhedron test"
Karl heinz Buchegger wrote: > Mit dem Schnittpunkstest. Habe grade noch mal im Code nachgesehen. Der Schnittpunkt Test wurde vor Jahren mal durch den Test über die Solid Angles ersetzt. Auch den gibts in ähnlicher Form im 2D: Vom Punkt aus wird die Winkeldifferenz zu den beiden Eckpunkten einer Kante berechnet. Die Summe dieser Differenzen ergibt dann entweder 0 oder 2PI, je nachdem ob der Punkt drinnen oder draussen ist. Im 3D heist das dann 'Solid Angle'. Im Grunde ist der Solid Angle gleichbedeutend mit der Projektion der Fläche auf eine Einheitskugel und der Solid Angle ist ein Mass für den Flächen- inhalt dieser Projektion. Die Summe dieser Solid Angles ergibt dann entweder 0 oder 4PI. > was macht Ihr wenn der Strahl direkt auf die > Kante eines Dreieckes trifft Einen anderen Strahl nehmen. Den Strahl ein kleines bischen drehen und nochmal neu rechnen. Irgendwann hast du dann einen Strahl, der durch keine Kante geht. Da dieser Fall nicht oft vorkommt, ist die Neuberechnung auch kein Problem. Allerdings stirbt man dann um die einfachere Berechnung die man durch einen Strahl bekommt, der parallel zur bsp. X-Achse läuft. Ich kann dir nur raten: Hol dir die angegebene Library. Dort finden sich viele dieser 'Tools'. Das Thema ist komplex genug, kein Grund das Rad von Grund auf neu zu erfinden.
Das ist wieder mal ein ein richtig unterhaltsamer Thread: Der OP wollte einfach nur eine Zahl aus einer Datei lesen, jetzt geht's schon um Solid Modeling. Immer wieder mal verschießt Heckenschützin Janine ihre giftigen Pfeile, um anschließend spurlos in die völlige Unsichtbarkeit zu entschwinden. Irgndwann kommt dann ein Gast hereingeschneit, um schnell mal nachzufragen, was bestimmte Leute hier denn sonst noch so treiben. Natürlich stellt er sofort fest, dass er das alles um Größenordnungen besser kann. Schießlich treffen sich noch zwei alte Bekannte an einem Ort wieder, wo's keiner (oder zumindest einer von beiden nicht) erwartet hätte. Da könnte man doch glatt eine Folge für eine Vorabendserie daraus drehen ;-) Nicht falsch verstehen, ich finde das überhaupt nicht schlimm, zumal die ursprüngliche Frage ja schon ausreichend beantwortet wurde. Aber amüsant ist es allemal :)
Danke Jungs, ein paar gute Tipps waren schon dabei. Wenn ich nicht weiter komme, weiß ich ja wo ich euch finde.
yalu (Gast) wrote:
>Der OP wollte einfach nur eine Zahl aus einer Datei lesen ..
Da hast du was gutes bemerkt, die Herren haben sich vom schönen
allgemeinen Plausch in die Tiefen des Modeling für Spezies zurückgezogen
Schade, dabei hätte mich jetzt mal interessiert wie der Buchegger z.B.
zum lcc steht
egal wrote: > Schade, dabei hätte mich jetzt mal interessiert wie der Buchegger z.B. > zum lcc steht Kann ich nichts darüber sagen. Noch nie ausprobiert.
yalu wrote: > Da könnte man doch glatt eine Folge für eine Vorabendserie daraus > drehen ;-) ...und an wen gehen die Einnahmen fuer's Drehbuch? :-) > Nicht falsch verstehen, ich finde das überhaupt nicht schlimm, zumal > die ursprüngliche Frage ja schon ausreichend beantwortet wurde. Aber > amüsant ist es allemal :) Im Ernst, der Thread ist von der urspruenglichen Frage wohl (viel zu) weit abgeschweift. Da haette man wohl einen eigenen starten sollen, sorry!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.