Samstag, 13. Juni 2026

Schnitt zweier Ebenen

 

Die Gleichung   bestimmt die allgemeine Form einer Ebene im Raum. Wenigstens eine der Koordinaten x, y, z muss einen von Null verschiedenen Koeffizienten haben. Wenn in einem Koordinatensystem zwei Ebenen E1 und E2 durch zwei lineare Gleichungen gegeben sind,

so stellt der Ausdruck

den Winkel zweier Ebenen dar.

Als Beweis gilt die Formel fürs Skalarprodukt zweier Normalenvektoren:

Es gibt drei Fälle:

1)      Ebenen E1 und E2 sind parallel;


 

2)      Ebenen E1 und E2 stehen aufeinander senkrecht;


 

3)      Ebenen E1 und E2 schneiden einander.


 

Das folgende C++ Programm zeigt diesen Algorithmus und berechnet den Winkel zwischen den Ebenen.

#include <iostream>
#define _USE_MATH_DEFINES
#include <cmath>
using namespace std;

int main()
{
    float A1, B1, C1, D1, A2, B2, C2, D2; // Koeffizienten
    double sp, betragN1, betragN2, winkel;  // Skalarprodukt, Betraege, Winkel
    
    cout << "Das Programm berechnet den Winkel zwischen zwei Ebenen." << endl;
    cout<<"Die Ebenen werden in der Form Ax + By + Cz + D = 0 dargestellt."<<endl;
    cout<<"Geben Sie bitte die Koeffizienten ein:"<<endl;
    cout << "A1 = ";
    cin >> A1;
    cout << "B1 = ";
    cin >> B1;
    cout << "C1 = ";
    cin >> C1;
    cout << "D1 = ";
    cin >> D1;
    cout << endl;
    
    cout<<"Die erste Ebene hat die folgende Gleichung:"<<endl;
    cout<<A1<<"X + ("<<B1<<")Y + ("<<C1<<")Z + ("<<D1<<") = 0"<<endl<<endl;
    
    cout << "A2 = ";
    cin >> A2;
    cout << "B2 = ";
    cin >> B2;
    cout << "C2 = ";
    cin >> C2;
    cout << "D2 = ";
    cin >> D2;
    cout << endl;
    cout<<"Die zweite Ebene hat die folgende Gleichung:"<<endl;
    cout<<A2<<"X + ("<<B2<<")Y + ("<<C2<<")Z + ("<<D2<<") = 0"<<endl;
    cout<<endl;
    
    //Die Berechnung beginnt hier.
    sp = A1*A2 + B1*B2 + C1*C2;
    double n1 = pow(A1, 2)+pow(B1, 2)+pow(C1,2);
    betragN1 = sqrt(n1);
    double n2 = pow(A2, 2)+pow(B2, 2)+pow(C2,2);
    betragN2 = sqrt(n2);
    winkel = acos(sp/(betragN1*betragN2));
    
    //Der Winkel wird in Grad umgerechnet.
    double wgrad = (winkel*180)/M_PI;
    
    if (wgrad < 0.001)
    cout << "Die Ebenen sind parallel."<< endl;
    else
    cout<<"Der Winkel zwischen den Ebenen ist gleich "<<wgrad<< " Grad"<<endl;
    
    return 0;
}


 


Donnerstag, 11. Juni 2026

Volumenberechnung einer Pyramide

 


Eine Pyramide wird durch die Schnitte parallel zur Grundfläche in dünne Schichten zerlegt. Um den Rauminhalt einer Pyramide zu bestimmen, ersetzt man jede Schicht durch ein gerades Prisma. Die berühmten ägyptischen Pyramiden haben ebenfalls solche treppenförmigen Seitenflächen. Die Summe der Rauminhalte dieser Schichten ergibt dann näherungsweise den Rauminhalt der Pyramide. Je größer die Anzahl der Schichten ist, desto genauer den Rauminhalt der Pyramide ist.

Sei g – die Grundfläche der Pyramide und h – die Höhe der Pyramide, dann gilt es:

V ist das Volumen der Pyramide. Diese Formel ergibt sich aus einem Satz, dass jede Schnittfläche q parallel zur Grundfläche einer Pyramide g der Grundfläche ähnlich ist.

X ist der Abstand von der Spitze für jeden Querschnitt. Die Querschnitte teilen die Höhe h der Pyramide in n gleiche Teile. Die Höhe einer Schicht ist

Das Volumen der Pyramide ergibt sich aus den Volumen von Prismen:

Wenn n = 6, dann V = g*h*0,421

Wenn n = 10, dann V = g*h*0,385

Wenn n = 100, dann V = g*h*0,338

Der Grenzwert  n→∞:

Das folgende Programm zeigt diesen Algorithmus und berechnet das Volumen einer Pyramide, wenn die Koordinaten ihrer vier Eckpunkte bekannt sind. Die angegebene Pyramide wird durch Betätigen des Schalters „Volumen der Pyramide“ grafisch im Fenster dargestellt und ihres Volumen wird berechnet. Das entsprechende MATLAB-Skript wird nachstehend dargestellt.

function Pyramide

 

% Kreieren des Figure-Windows

fg = figure('visible', 'off', 'position',  [400,200,750,450]);

 

% Anlegen der einzelnen Grafik-Komponenten

 

% Statischer Text

htext1 = uicontrol('style', 'text', 'string', 'Punkt A', ...

        'position', [500, 400, 80, 25]);

htext2 = uicontrol('style', 'text', 'string', 'Punkt B', ...

        'position', [500, 370, 80, 25]);

htext3 = uicontrol('style', 'text', 'string', 'Punkt C', ...

        'position', [500, 340, 80, 25]);

htext4 = uicontrol('style', 'text', 'string', 'Punkt D', ...

        'position', [500, 310, 80, 25]);

 

 

% Punkt A

axh = uicontrol('style', 'edit', 'string', ...

    'Ax', 'position', [610, 400, 40, 25]);

ayh = uicontrol('style', 'edit', 'string', ...

    'Ay', 'position', [660, 400, 40, 25]);

azh = uicontrol('style', 'edit', 'string', ...

    'Az', 'position', [710, 400, 40, 25]);

 

% Punkt B

bxh = uicontrol('style', 'edit', 'string', ...

    'Bx', 'position', [610, 370, 40, 25]);

byh = uicontrol('style', 'edit', 'string', ...

    'By', 'position', [660, 370, 40, 25]);

bzh = uicontrol('style', 'edit', 'string', ...

    'Bz', 'position', [710, 370, 40, 25]);

 

% Punkt C

cxh = uicontrol('style', 'edit', 'string', ...

    'Cx', 'position', [610, 340, 40, 25]);

cyh = uicontrol('style', 'edit', 'string', ...

    'Cy', 'position', [660, 340, 40, 25]);

czh = uicontrol('style', 'edit', 'string', ...

    'Cz', 'position', [710, 340, 40, 25]);

 

% Punkt D

dxh = uicontrol('style', 'edit', 'string', ...

    'Dx', 'position', [610, 310, 40, 25]);

dyh = uicontrol('style', 'edit', 'string', ...

    'Dy', 'position', [660, 310, 40, 25]);

dzh = uicontrol('style', 'edit', 'string', ...

    'Dz', 'position', [710, 310, 40, 25]);

 

% Ein Bedienknopf fuer das Volumen

volumen = uicontrol('style', 'pushbutton', 'string', 'Volumen der Pyramide', ...

         'position', [500, 260, 170, 25], ...

         'callback', (@volumenbutton_callback));

    

% Statischer Text: Volumen =

textbox1 = uicontrol('style', 'text', 'string', 'kein Ergebnis',...

           'position', [500, 230, 170, 25]);

      

% Statischer Text

hname1 = uicontrol('style', 'text', ...

        'string', 'Grundflaeche', ...

        'position', [500, 200, 100, 25]);

 

% Statischer Text: Grundflaeche =

textbox2 = uicontrol('style', 'text', 'string', 'kein Ergebnis',...

           'position', [610, 200, 170, 25]);

 

% Statischer Text

hname2 = uicontrol('style', 'text', ...

        'string', 'Hoehe', ...

        'position', [500, 170, 100, 25]);

   

% Statischer Text: Hoehe =

textbox3 = uicontrol('style', 'text', 'string', 'kein Ergebnis',...

           'position', [610, 170, 170, 25]);

      

% Statischer Text

hname3 = uicontrol('style', 'text', ...

        'string', 'Autor: Vadim Anishchenko, M.Eng.', ...

        'position', [500, 40, 200, 25]);

 

% Die Achsen anpassen

achsen = axes('units', 'pixels', 'position', [90, 60, 350, 350]);

 

 

% Figure-Window einen Namen zuweisen

set(fg, 'name', 'Pyramide');

movegui(fg, 'center') % Bedienoberflaeche auf Bildschirm zentrieren

set(fg, 'visible', 'on'); % Bedienoberflaeche sichtbar machen

 

 

% 'callbacks' der Druckknoepfe

    function volumenbutton_callback(source, eventdata) % Berechnung der Flaeche             

        % Daten anlegen         

        ax = str2double(get(axh, 'string'));

        ay = str2double(get(ayh, 'string'));

        az = str2double(get(azh, 'string'));

        bx = str2double(get(bxh, 'string'));

        by = str2double(get(byh, 'string'));

        bz = str2double(get(bzh, 'string'));

        cx = str2double(get(cxh, 'string'));

        cy = str2double(get(cyh, 'string'));

        cz = str2double(get(czh, 'string'));

        dx = str2double(get(dxh, 'string'));

        dy = str2double(get(dyh, 'string'));

        dz = str2double(get(dzh, 'string'));

        ab=[bx-ax, by-ay, bz-az];

        ac=[cx-ax, cy-ay, cz-az];

        ad=[dx-ax, dy-ay, dz-az];

        xVar=[ax, bx, cx, dx, ax];

        yVar=[ay, by, cy, dy, ay];

        zVar=[az, bz, cz, dz, az];

        caVarx=[ax, cx];

        caVary=[ay, cy];

        caVarz=[az, cz];

        bdVarx= [bx, dx];

        bdVary= [by, dy];

        bdVarz= [bz, dz];

        plot3(xVar, yVar, zVar, '.', 'MarkerSize', 10, 'LineStyle', '-');

        hold on

        plot3(caVarx, caVary, caVarz, '.', 'MarkerSize', 10, 'LineStyle', '-');

        hold on

        plot3(bdVarx, bdVary, bdVarz, '.', 'MarkerSize', 10, 'LineStyle', '-');

        grid on % Gitternetzlinien einschalten

        hold off

        title('Pyramide'); % Ueberschrift des Diagramms

        xlabel('X'); % Beschriftung der X-Achse

        ylabel('Y'); % Beschriftung der Y-Achse

        zlabel('Z'); % Beschriftung der Z-Achse        

        gv=cross(ab, ac); % Vektor der Grundflaeche von der Pyramide

        vprism = dot(gv, ad);  % Volumen des Prismas

        v = vprism/6; % Volumen der Pyramide

        vbetrag = abs(v);

        g = norm(gv)/2; % Grundflaeche der Pyramide

        S = norm(gv);

        h = vprism/S; % Hoehe der Pyramide

        hbetrag = abs(h);

        set(textbox1, 'string', vbetrag); % Volumen im GUI ausgeben

        set(textbox2, 'string', g); % Grunflaeche im GUI ausgeben

        set(textbox3, 'string', hbetrag); % Hoehe im GUI ausgeben

    end

end

 



 


 

Schnitt zweier Ebenen

  Die Gleichung     bestimmt die allgemeine Form einer Ebene im Raum. Wenigstens eine der Koordinaten x, y, z muss einen von Null verschie...