Forum: PC-Programmierung C++ Hilfe erbeten


von Michael (Gast)


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Helmi (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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!

von Uhu U. (uhu)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

das hätt ich glatt übersehen!

gut, daß es das Forum gibt... ;-)

von Helmi (Gast)


Lesenswert?

Uberpruefung ob ueberhaupt was gueltiges eingelesen wurde

if(!fscanf (pFile, "%[^0123456789+-.] %f", str, &f))
{
      printf("Nix da\n");
}

Gruss Helmi

von Michael N. (bigmike47)


Lesenswert?

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...

von Uhu U. (uhu)


Lesenswert?

Nun ja, das ist C++ - nicht C...

von Karl H. (kbuchegg)


Lesenswert?

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"

von ... (Gast)


Lesenswert?

@Uhu:
Du hast zwar recht, aber im Betreff des OP steht immerhin "C++" :)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Janine (Gast)


Lesenswert?

>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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von ... (Gast)


Lesenswert?

@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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von egal (Gast)


Lesenswert?

@ 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)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Janine (Gast)


Lesenswert?

>...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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von egal (Gast)


Lesenswert?

@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? :)))

von Gast (Gast)


Lesenswert?

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??

von Karl H. (kbuchegg)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

Danke,
Auf welcher Basis arbeitet die Modellierung --- Brep?

von Karl H. (kbuchegg)


Lesenswert?

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. :-)

von Gast (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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/

von Gast (Gast)


Lesenswert?

Also hast du das doch nicht selbst programmiert, wenn du eine Library 
nutzt.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Chris T. (ctheis)


Lesenswert?

@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

von Karl H. (kbuchegg)


Lesenswert?

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).

von Gast (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von gast (Gast)


Lesenswert?

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.

von Chris T. (ctheis)


Lesenswert?

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.

von Chris T. (ctheis)


Lesenswert?

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"

von Karl H. (kbuchegg)


Lesenswert?

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.

von yalu (Gast)


Lesenswert?

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 :)

von gast (Gast)


Lesenswert?

Danke Jungs, ein paar gute Tipps waren schon dabei.
Wenn ich nicht weiter komme, weiß ich ja wo ich euch finde.

von egal (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Chris T. (ctheis)


Lesenswert?

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
Noch kein Account? Hier anmelden.