[Delphi] Berechnung von Schittpunkten

Joined
Feb 21, 2008
Messages
5,776
Points
0
Hallo UF Gemeinde,
Ich bräuchte mal Hilfe bei einer Infoaufgabe und zwar Folgende:

"Durch y = mx + n und y = ax² + bc + c sind die Gleichungen einer Geraden und einer Parabel der Ebene gegeben. Es ist ein Programm zur Berechnung gemeinsamer Punkte zu verfassen. Dieentsprechenden Konstanten m,n,a,b,c sind einzulesen. Spezialfälle bezüglich der gegenseitigen Lage sind zu beachten. Beide Graphen sind in ein Koordinatensystem zu zeichnen. Die Schnittpunkte sollen besonders hervorgehoben werden."

Ich hab mich schon einmal im Internet erkundigt und ein ähnliches Programm gefunden, dass ich leicht abgeändert habe und das die Bedingungen zum Teil erfüllt. Allerdings ist das Problem, dass es nur den Schnittpunkt zweier Geraden berücksichtigt und desweiteren nur die Konstanten x und y einzulesen sind. Hier mal veranschaulicht:

Code:
unit ugeraden;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    lthema: TLabel;
    leingaben: TLabel;
    lm1: TLabel;
    ln1: TLabel;
    lm2: TLabel;
    ln2: TLabel;
    em1: TEdit;
    en1: TEdit;
    em2: TEdit;
    en2: TEdit;
    lspunkt: TLabel;
    lspunktende: TLabel;
    ex: TEdit;
    ey: TEdit;
    bberechnen: TButton;
    laussage: TLabel;
    procedure bberechnenClick(Sender: TObject);
  private
    { Private-Deklarationen}
  public
    { Public-Deklarationen}
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.bberechnenClick(Sender: TObject);
VAR m1,m2,n1,n2 : REAL;

 PROCEDURE Wertuebergabe;
 BEGIN
   m1:=STRTOFLOAT(em1.text);
   n1:=STRTOFLOAT(en1.text);
   m2:=STRTOFLOAT(em2.text);
   n2:=STRTOFLOAT(en2.text);
 END;

 PROCEDURE Editfelder_leer;
 BEGIN
  ex.text:='-';
  ey.text:='-';
 END;

 PROCEDURE GLage(txt:STRING);
 BEGIN
  laussage.caption:=txt;
 END;

 PROCEDURE Schnittpunkt(m1,m2,n1,n2:REAL; VAR xs,ys:REAL);
 BEGIN
  xs:=(n2-n1)/(m1-m2);
  ys:=m1*xs+n1;
 END;

 PROCEDURE Verarbeitung;
 VAR xs,ys: REAL;
 BEGIN
  IF m1<>m2 THEN
             BEGIN
              Schnittpunkt(m1,m2,n1,n2,xs,ys);
              ex.text:=FLOATTOSTR(xs);
              ey.text:=FLOATTOSTR(ys);
              GLage('Geraden schneiden sich');
             END
            ELSE
             IF n1<>n2 THEN
                        BEGIN
                         Editfelder_leer;
                         GLage('Geraden sind parallel');
                        END
                       ELSE
                        BEGIN
                         Editfelder_leer;
                         GLage('Geraden sind identisch');
                        END;
 END;

begin
{Wertübergabe von den Editorfeldern an lokale Variablen}
 Wertuebergabe;
{Verarbeitung}
 Verarbeitung;
end;

end.

Meine Fragen nun:
Wie kann man diese Schnittpunkte mit den gesuchten Konstanten m,n,a,b,c beschreiben (es geht schließlich nicht um 2 Geraden, sondern um eine Gerade und eine Parabel)?
Wie kann ich das Problem mathematisch beschreiben?
Wie Zeichne ich das Programm und vor allem wie krieg ich das Programm dazu, die Schnittpunkte besonders hervorzuheben?

Vieleicht kennt sich ja jemand mit Delphi aus :)

Für Hilfe wär ich dankbar,
mfg RoToR
 
Kenne mich leider mit Delphi nicht aus, aber das hier wäre das mathematische Vorgehen:

Es gibt drei Möglichkeiten für Schnittpunkte:
a) Kein Schnittpunkt
b) Ein Schnittpunkt
c) Zwei Schnittpunkte

Die direkte Lösung geht über gleichsetzen:
y1=y2
mx+n=ax^2+bx+c
ax^2+(b-m)x+(c-n)=0
=>
a) (b-m)^2-4*a*(c-n) < 0
keine Lösung/Schnittpunkt
b) (b-m)^2-4*a*(c-n) = 0
eine Lösung/Schnittpunkt
x0=(m-b)/2a
c) (b-m)^2-4*a*(c-n) > 0
zwei Lösungen/Schnittpunkte
x1/2=(m-b) ± sqrt{(b-m)^2-4*a*(c-n)}/2a​

Es ist vielleicht auch angebracht, davor zu Prüfen, ob a ungleich Null ist, sonst ergibt sich eine andere Konstellation:
a) ein Schnittpunkt
b) kein Schnittpunkt
c) unendlich Schnittpunkte

a) m≠b
x0=(c-n)/(m-b)
b) m=b, n≠c
Nüschts!
c) m=b, n=c
y1=y2
 
Vielen Dank, dass hilft mir schonmal ein gutes Stück weiter :)
 
Back
Top Bottom