kramann.info
© Guido Kramann

Login: Passwort:










Archiv
2 SoSe2022
..2.1 MIK
..2.2 SRT
..2.3 HDL
..2.4 AUT
..2.5 SLE
2 WS2020_21
..2.1 RTS
....2.1.1 day_by_day
..2.2 IE
....2.2.1 day_by_day
..2.3 ES
..2.4 EFSEE
....2.4.1 day_by_day
..2.5 KF
....2.5.1 day_by_day
....2.5.2 Haikus
....2.5.3 Haikus_en
..2.6 CC
....2.6.1 day_by_day
2 WS2021_22
..2.1 RTS
....2.1.1 day_by_day
....2.1.2 Versuch002
....2.1.3 Versuch003
....2.1.4 Versuch004
....2.1.5 Versuch005
....2.1.99 Material
..2.2 FTS
....2.2.1 day_by_day
..2.3 ESY
....2.3.1 day_by_day
..2.4 INFmecha5
....2.4.1 day_by_day
..2.5 REGmecha5
....2.5.1 day_by_day
2 WS2023_24
..2.1 day_by_day_RST
..2.2 day_by_day_SRT
..2.3 day_by_day_FTS
..2.4 day_by_day_KF
3 SoSe2021
..3.1 STR
....3.1.1 day_by_day
..3.2 SLE
....3.2.1 day_by_day
..3.3 HDL
....3.3.1 day_by_day
..3.4 MIK
....3.4.1 day_by_day
3 SoSe2024
..3.1 Mik_21_03_2024
..3.2 Mik_04_04_2024
..3.3 Mik_11_04_2024
..3.4 Mik_18_04_2024
..3.5 Mik_25_04_2024
..3.6 Mik_02_05_2024
..3.7 Mik_16_06_2024
..3.8 Mik_23_05_2024
..3.9 Mik_30_05_2024
..3.10 Mik_05_06_2024
..3.11 Mik_13_06_2024
3 WS2022_23
..3.1 day_by_day_RST_3MB
..3.2 day_by_day_RT2_5MT
..3.3 day_by_day_EMB_7MT
..3.4 day_by_day_ABP_7MT
..3.5 day_by_day_FTS_MMB
..3.6 day_by_day_KF
4 SoSe2023
..4.2 RTS_day_by_day
..4.3 MIK_day_by_day
..4.4 AUT_day_by_day
..4.5 HDL_day_by_day
4 WS2024_25
..4.1 ING_day_by_day
....4.1.1 ING_Do_26_09_2024
....4.1.2 ING_Do_10_10_2024
....4.1.3 ING_Do_17_10_2024
....4.1.4 ING_Do_24_10_2024
....4.1.5 ING_Do_07_11_2024
....4.1.6 ING_Do_14_11_2024
....4.1.7 ING_Do_21_11_2024
....4.1.8 ING_Do_28_11_2024
....4.1.9 ING_Do_05_12_2024
....4.1.10 ING_Do_12_12_2024
....4.1.11 ING_Do_19_12_2024
..4.2 INF_day_by_day
....4.2.1 INF_Fr_27_09_2024
....4.2.2 INF_Fr_04_10_2024
....4.2.3 INF_FR_18_10_2024
....4.2.4 INF_Fr_25_10_2024
....4.2.5 INF_Fr_08_11_2024
....4.2.6 INF_Fr_15_11_2024
....4.2.7 INF_Fr_22_11_2024
....4.2.8 INF_Fr_29_11_2024
....4.2.9 INF_Fr_06_12_2024
....4.2.10 INF_Fr_13_12_2024
....4.2.11 INF_Fr_20_12_2024
....4.2.12 INF_Fr_10_01_2025
..4.3 FTS_day_by_day
....4.3.1 FTS_Mi_25_09_2024
....4.3.2 FTS_Mi_02_10_2024
....4.3.3 FTS_Mi_09_10_2024
....4.3.4 FTS_Mi_16_10_2024
....4.3.5 FTS_Mi_23_10_2024
....4.3.6 FTS_Mi_30_10_2024
....4.3.7 FTS_Mi_06_11_2024
....4.3.8 FTS_Mi_13_11_2024
....4.3.9 FTS_Mi_20_11_2024
....4.3.10 FTS_Mi_27_11_2024
....4.3.11 FTS_Mi_04_12_2024
....4.3.12 FTS_Mi_11_12_2024
....4.3.13 FTS_Mi_18_12_2024
6 Ing
..6.1 Bauplan
....6.1.1 Bootstick
....6.1.2 Xubuntu
....6.1.3 Webserver
....6.1.4 Hotspot
....6.1.5 Videostream
....6.1.6 Lampe
....6.1.7 Chassis
....6.1.8 Akku
....6.1.9 Motore
....6.1.10 Laborsteckboard
....6.1.11 Antriebstest
7 007
..7.1 Einschalten
..7.2 Vorversuche
kramann.info
© Guido Kramann

Login: Passwort:




Inhalte zur Vorlesungswoche #12, Informatik 1 im Wintersemester 2024/25

(EN google-translate)

(PL google-translate)


Die Übung für den 07.01. bzw. 09.01. findet sich auf Moodle, siehe pdf dort: "Übung 7.1. / 9.1. Muluem (Insertion Sort)"


#include<iostream>
#include<stdlib.h>
using namespace std;
int main(void)
{
    srand(time(NULL));
    int n = (rand() % 10)+5;
    int arr[n];
    for(int i=0; i<n; i++)
        arr[i] = rand() % 100;

    for(int i=1; i<=n; i++)
    {
        for(int k=0; k<=i; k++)
        {
            if(arr[i]<arr[k])
            {
                int temp = arr[i];
                for(int m=i; m>=k; m--)
                {
                    arr[m] = arr[m-1];
                }
                arr[k] = temp;
            }
        }
    }
    for(int i=0; i<n; i++)
        cout<<arr[i]<<" ";
    cout<<endl;
    return 0;
}

Code 0-1: Studentische Lösung 2

#include<iostream>
using namespace std;
int main(void)
{

int arr[]={16,6,27,9,1};

    for(int i=0; i<5;i++)
    {
        for(int j=i;j>0;j--)
        {
            if(arr[j]< arr[j-1])
            {
               int t= arr[j];
               arr[j]= arr[j-1];
               arr[j-1]=t;
            }
             else
             {
                break;
             }
        }
   
    }
    cout<<"Reihenfolge ist: "<<endl;
    for(int i=0; i<5;i++)
    {
        cout<<arr[i]<<endl;
    }
    return 0;
}

Code 0-2: Studentische Lösung 2

#include<iostream>
using namespace std;

void sortieren(int arr[], int anz)
{
    for(int i=0; i<anz;i++)
    {
        for(int j=i;j>0;j--)
        {
            if(arr[j]< arr[j-1])
            {
               int t= arr[j];
               arr[j]= arr[j-1];
               arr[j-1]=t;
            }
            else
            {
               break;
            }
        }   
    }
}

int main(void)
{

    int arr[]={16,6,27,9,1};
    sortieren(arr, 5);

    
    cout<<"Reihenfolge ist: "<<endl;
    for(int i=0; i<5;i++)
    {
        cout<<arr[i]<<endl;
    }
    return 0;
}

Code 0-3: Studentische Lösung mit Funktion.

Themen

  1. Quiz zu Sprachelementen von C/C++
  2. Einführung von VRML
  3. Entwurf und Umsetzung eines Code-Generators für VRML mit C/C++
  4. Analyse der notwendigen Sprachelemente in C/C++

1 Quiz zu Sprachelementen von C/C++

  1. Erklären Sie den Unterschied zwischen Deklaration, Initialisierung und Definition.
  2. Wie kann in C ein Integer-Array mit den Elementen 2,3,5,7,11 definiert werden?
  3. Wieviel Speicher belegt char text[] = "Hallo"; ?
  4. Wie kann eine 2x2 Matrix mit double-Werten in C/C++ definiert werden?
  5. Nennen Sie mindestens drei Verschiedene Beispiele für Kontrollstrukturen.
  6. Beschreiben Sie den Sortieralgorithmus Bubblesort.
  7. Nennen Sie wesentliche Unterschiede zwischen C, C++ und Java.

2 Einführung von VRML

  • Die angegebenen Beispiele können mit Hilfe des Programms view3dscene angeschaut werden.
Übersicht: 50_Simulationstechnik/03_VRML
Primitive: 50_Simulationstechnik/03_VRML/01_Primitive
Zusammengesetzte Figuren: 50_Simulationstechnik/03_VRML/02_Zusammengesetzt

3 Entwurf und Umsetzung eines Code-Generators für VRML mit C/C++

  • Es soll eine 3D-Welt erstellt werden, in der mehrere Primitive platziert sind.
  • Zunächst soll ein einfaches Testbeispiel von Hand erstellt werden.
  • Nun soll überlegt werden, welche Angaben notwendig sind, um eindeutig festzulegen, wo und wie welches Primitiv erzeugt werden soll.
  • Nun soll ein C/C++ Programm entwickelt werden, das es erlaubt, die gewünschte 3D-Szene mit Hilfe des parametrisierten Aufrufs einer oder mehrerer Funktionen zu erstellen.
  • Schließlich kann überlegt werden, wie die direkte Angabe aufzurufender Funktionen durch ein Array ersetzt werden kann, dessen Werte festlegen, was wie generiert werden soll.

4 Analyse der notwendigen Sprachelemente in C/C++

Gehen Sie die Schritte aus Abschnitt 3 noch einmal durch und nennen Sie Sprachelemente, die Ihnen noch nicht sehr vertraut sind, damit sie gemeinsam noch einmal genauer angeschaut werden können.


vrmlgenerator.zip -- Vorentwicklung VRML-Generator.
Screenshot zur mit vrmlgenerator4 generierten VRML-Datei.

Bild 0-1: Screenshot zur mit vrmlgenerator4 generierten VRML-Datei.

ÜBUNG (Di 14.1. / Do 16.1.) -- Entwicklung und Verwendung von Funktionen


Nutzen Sie die Übung gerne auch dazu, um noch einmal bei älteren Aufgaben oder Lehrinhalten offene Fragen zu klären.


Vorbereitung:
  • Nehmen Sie sich die Quelltexte vrmlgenerator1..4 aus vrmlgenerator.zip noch einmal vor (s.o.).
  • Über folgenden Befehl lässt sich die Konsolenausgabe der Code-Generatoren in eine Datei umleiten:
  • ./vrmlgenerator4 > ./ausgabe4.wrl
  • Das entstandene VRML-Skript ausgabe4.wrl kann dann mit Hilfe von view3dscene geöffnet und angeschaut werden, vergleiche Screenshot Bild 0-1 weiter oben.

Hinweis: Die Matrix in den Zeilen 85 bis 88 in vrmlgenerator4.cpp hat im Moment keine Bedeutung und könnte entfernt werden.


Aufgabe 1 -- Varwendung der Generierungsfunktion generiereQuader(..) in vrmlgenerator4.cpp
  • Öffnen Sie vrmlgenerator4.cpp in einem Texteditor und analyiseren, wie die 10 Quader erzeugt werden (Schleife Zeilen 91 und 92).
  • Überlegen Sie sich, wie man aus Quadern zusammengesetzt eine konkrete Sitzgelegenheit zusammensetzen könnte (Stuhl, Hocker, Sessel...).
  • Speichern Sie vrmlgenerator4.cpp in vrmlgenerator5.cpp und variieren Sie das Programm so, dass Ihre Wunschsitzgelegenheit als VRML-Datei generiert wird.
  • Überprüfen Sie das entstandene Ergebnis in view3dscene und korrigieren Sie nötigenfalls Ihr Programm.

Hinweis: Als Koordinatenursprung der Quader wird jeweils deren Mittelpunkt angegeben.


Aufgabe 2

Die Matrix in den Zeilen 85 bis 88 bei vrmlgenerator4.cpp war gedacht, dass pro Zeile die Parameter eines Quaders gespeichert werden. Mit einer Schleife sollen die Zeilen der Matrix durchgegangen werden und pro Zeile ein Funktionsaufruf zur Generierung eines Quaders mit den in der Matrix gespeicherten Daten erfolgen.

Setzen Sie dieses Prinzip um, indem Sie die Daten Ihrer Sitzgelegenheit auf eine passende Matrix übertragen und die Sitzgelegenheit erzeugen, indem dann zeilenweise die Matrix durchgegangen wird.

Schließlich wäre noch denkbar eine Funktion erzeugeWelt(..) zu schreiben, der die ganze Matrix übergeben wird und die dann alles nötige erledigt.

Aufgabe 3
  • Neben Quadern können mit VRML auch andere Primitive, wie Kugeln, Zylinder und Kegel erstellt werden.
  • Vergleiche dazu die Beispiele hier:
50_Simulationstechnik/03_VRML/01_Primitive
  • Erweitern Sie vrmlgenerator4.cpp (als vrmlgenerator6.cpp) durch weitere Generierungsfunktionen, die neben dem Quader zur parametrisierten Erzeugung der anderen Primitive dienen.

Hinweis: Die Anzahl der übergebenen Parameter wird jeweils unterschiedlich sein, da beispielsweise eine Kugel nur den Radius als Parameter braucht statt Höhe, Breite und Tiefe beim Quader.


  • Testen Sie Ihr Programm, indem Sie je ein Exemplar eines Primitivs durch Aufruf der entsprechenden Funktion erzeugen und jeweils woanders im Initialkoordinatensystem platzieren.
Aufgabe 4

Nutzen Sie das Programm aus Aufgabe 3 für weitere Experimente zur Erstellung von 3D-Welten, indem Sie die neuen Funktuinen benutzen:

  1. Erzeugen Sie einen verspäteten Weihnachtsbaum.
  2. Erzeugen Sie eine große, komplexe 3D-Welt, indem Parameter zufällig gesetzt werden und in einer Schleife hunderte an unterschiedlichen Primitiven erzeugt werden.
  3. Wie 2., aber nun sind Sie gefordert, sich eine systematische Veränderung mehrerer Parameter zu überlegen und sie in entsprechenden Schleifen durchlaufen zu lassen, Beispiele: Kubus aus Kuben, Regebogen-Farbverlauf mehrerer Objekte, Bestuhlung eines Konzertsaals, etc.
Zusatzaufgabe

Anhand des folgenden Beispiels lässt sich ergründen, wie Animationen und gelenkige Verbindungen in VRML hergestellt werden können:

50_Simulationstechnik/03_VRML/03_Animation
  • Testen Sie das angegebene Beispiel.
  • Überlegen Sie, wie Sie eine der Szenen aus den vorangehenden Aufgaben dazu bringen zu rotieren.
  • Setzen Sie das Rotieren zunächst von Hand um.
  • Ergänzen Sie das Rotieren dann als Funktion im Codegenerator.
Studentische Lösung zu Aufgabe 1:
#include <iostream>
using namespace std;

void generiereQuader(float x,float y,float z,float b,float h,float t,float R,float G,float B)
{


char text[][100] = {
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
"DEF FIGUR2 Transform\n",
"{\n",
"    translation 0 0 0\n",
"    rotation 1 0 0 0.0\n",
"    children\n",
"    [\n",
"        Shape\n",
"        {\n",
"            geometry Box\n",
"            {\n",
"                size 1.0 2.0 0.25\n",
"            }\n",
"            appearance Appearance\n",
"            {\n",
"                material Material\n",
"                {\n",
"                    diffuseColor  0.8 0.2 0.2\n",
"                    shininess     0.0\n",
"                    specularColor 0.2 0.2 0.8\n",             
"                    transparency  0.0\n",
"                }\n",
"             }\n",
"        }\n",
"    ]\n",
"}\n"
      
}; //ende text array


for(int i=0;i<35;i++)
{
   if(i==12)//                   translation 0 0 0
   {
       cout<<"translation "<<x<<" "<<y<<" "<<z<<endl;
   }
   else if(i==20)//                size 1.0 2.0 0.25
   {
       cout<<"size "<<b<<" "<<h<<" "<<t<<endl;
   }
   else if(i==26)//diffuseColor  0.2 0.2 0.8
   {
       cout<<"diffuseColor "<<R<<" "<<G<<" "<<B<<endl;
   }
   else if(i==28)//specularColor 0.2 0.2 0.8 
   {
       cout<<"specularColor "<<R<<" "<<G<<" "<<B<<endl;
   }
   else
   {
       cout<<text[i];
   }
}

}

int main(void)
{
cout<<"#VRML V2.0 utf8 \n";
cout<<"#Beispiel eines Quaders\n";
cout<<"\n";
cout<<"DirectionalLight \n";
cout<<"{\n";
cout<<"	direction 0 -1 0\n";
cout<<"	color 1 1 1\n";
cout<<"}\n";

float matrix[][9] = {
                      {0,0,0,1.0,1.0,1.0,0,0,1.0},
                      {1,0,0,1.0,1.0,1.0,0,0,1.0}
                 };

   //generiereQuader(float x,float y,float z,float b,float h,float t,float R,float G,float B)
   for(int i=0;i<5;i++)
      generiereQuader(i*2,0,0,1.0,2.0,1.0,0,0,1.0);
   for(int i=0;i<5;i++)
      generiereQuader(i*2,0.5,1,1.0,1.0,1.0,0,1,1.0);
   for(int i=0;i<5;i++)
      generiereQuader(i*2,-2,-0.5,1.0,0.5,0.5,0,1,1.0);

}//ende main

Code 0-4: Studentische Lösung zu Aufgabe 1.

VRML Darstellung der Lösung.

Bild 0-2: VRML Darstellung der Lösung.

Studentische Lösung zu Aufgabe 2:
#include <iostream>
using namespace std;

void generiereQuader(float x,float y,float z,float b,float h,float t,float R,float G,float B)
{


char text[][100] = {
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
"DEF FIGUR2 Transform\n",
"{\n",
"    translation 0 0 0\n",
"    rotation 1 0 0 0.0\n",
"    children\n",
"    [\n",
"        Shape\n",
"        {\n",
"            geometry Box\n",
"            {\n",
"                size 1.0 2.0 0.25\n",
"            }\n",
"            appearance Appearance\n",
"            {\n",
"                material Material\n",
"                {\n",
"                    diffuseColor  0.8 0.2 0.2\n",
"                    shininess     0.0\n",
"                    specularColor 0.2 0.2 0.8\n",
"                    transparency  0.0\n",
"                }\n",
"             }\n",
"        }\n",
"    ]\n",
"}\n"
     
}; //ende text array


for(int i=0;i<35;i++)
{
   if(i==12)//                   translation 0 0 0
   {
       cout<<"translation "<<x<<" "<<y<<" "<<z<<endl;
   }
   else if(i==20)//                size 1.0 2.0 0.25
   {
       cout<<"size "<<b<<" "<<h<<" "<<t<<endl;
   }
   else if(i==26)//diffuseColor  0.2 0.2 0.8
   {
       cout<<"diffuseColor "<<R<<" "<<G<<" "<<B<<endl;
   }
   else if(i==28)//specularColor 0.2 0.2 0.8
   {
       cout<<"specularColor "<<R<<" "<<G<<" "<<B<<endl;
   }
   else
   {
       cout<<text[i];
   }
}

}

int main(void)
{
cout<<"#VRML V2.0 utf8 \n";
cout<<"#Beispiel eines Quaders\n";
cout<<"\n";
cout<<"DirectionalLight \n";
cout<<"{\n";
cout<<"    direction 0 -1 0\n";
cout<<"    color 1 1 1\n";
cout<<"}\n";

float matrix[][9] = {
                    {1,0,0,3.0,0.5,1.0,0,1.0,1.0},
                    {1,0,1,3.0,0.5,1.0,0,1.0,1.0},
                    {-0.25,0.5,0,0.5,0.5,1.0,0,0,1.0},
                    {2.25,0.5,0,0.5,0.5,1.0,0,0,1.0},
                    {1,0.5,1,3.0,0.5,1.0,1.0,1.0,1.0}
                 };

   //generiereQuader(float x,float y,float z,float b,float h,float t,float R,float G,float B)
    for(int i = 0; i<5; i++)
        generiereQuader(matrix[i][0], matrix[i][1], matrix[i][2], matrix[i][3], matrix[i][4], matrix[i][5], matrix[i][6], matrix[i][7], matrix[i][8]);

}//ende main

Code 0-5: Studentische Lösung zu Aufgabe 2.

VRML Darstellung der Lösung.

Bild 0-3: VRML Darstellung der Lösung.