Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C (C89, C99 und C11) ::  Schnittpunktberechnung  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
fola
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.04.2012
Beiträge: 4
Beitrag fola Mitglied 17:39:01 23.04.2012   Titel:   Schnittpunktberechnung            Zitieren

tach zusammen,

also folgendes Problem besteht, am Mittwoch findet meine Präsentation statt. Die Aufgabe lautet, dass ich den Schnittpunkt zweier strecken (keine Geraden) in C zum laufen bekommen soll. Mathematisch hab ich es meineserachtens nach geschafft und auch zum größtenteils fertig geschrieben nur will es iwie nicht laufen. könnt ihr mir vllt auf die Sprünge helfen und mir sagen was eventl. zu tun ist...
ja bin leider anfänger :S



#include <stdlib.h>
#include <stdio.h>


struct point { float x, y; };
/*
* Parameter:
* a, b: Punkte der Geraden 1
* c, d: Punkte der Geraden 2
* x: Schnittpunkt
*
* Rückgabewert:
* 0: geraden sind parallel
* 1: geraden schneiden sich in x
* 2: geraden sind übereinander
*/

int intersect(struct point * a, struct point * b, struct point * c, struct point * d, struct point * x)
{
float t, t1;

t1 = d->x * b->y - d->y * b->x;

t = d->y * (a->x - c->x) - d->x * (a->y - c->y);

if(t1 == 0.0) {
if(t == 0.0) {
return 2; // gerade liegen aufeinander
} else {
return 0; // kein schnittpunkt
}
}

t = t / t1;

x->x = a->x + (b->x - a->x) * t;
x->y = a->y + (b->y - a->y) * t;

return 1;
}



int main(){

/*
struct point a = { 0, 0 };
struct point b = { 2, 1 };
struct point c = { 4, 0 };
struct point d = { 1, 0 };
//struct point x = { 0, 0 };
*/
printf("Bitte gebe die Punkte für die erste Gerade ein:\n");
scanf("%f %f", a,b);
printf("Bitte gebe nun die Punkte für die zweite Gerade ein:\n");
scanf("%f %f", c,d);

switch(intersect(&a, &b, &c, &d, &x)) {
case 0:
printf("kein schnittpunkt (parallel)\n");
break;
case 1:
printf("ein schnittpunkt: S(%f|%f)\n", x.x, x.y);
break;
case 2:
printf("geraden liegen aufeinander\n");
break;
}
getchar ();


}
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17930
Beitrag SeppJ Moderator 17:47:32 23.04.2012   Titel:              Zitieren

Ist das nicht ziemlich eindeutig? Dein Compiler beschwert sich doch sicherlich darüber, dass a, b, c, d und x nicht existieren. Womit er recht hat, denn deren Deklaration hast du auskommentiert. Außerdem willst du doch vermutlich insgesamt 8 Werte lesen, nicht nur 4. Also für a.x, a.y, b.x, b.y, c.x, ...

Sauberer wäre es übrigens, wenn du im Funktionskopf durch passende consts deutlich machen würdest, dass die ersten vier Parameter nicht geändert werden, der 5. jedoch schon. Oder übergib die Eingabestructs per value. Zwei kleine floats kann man auch mal eben komplett kopieren, das sollte sogar flotter sein als die indirekte Variante.

_________________
Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List


Zuletzt bearbeitet von SeppJ am 17:51:54 23.04.2012, insgesamt 2-mal bearbeitet
DirkB
Unregistrierter




Beitrag DirkB Unregistrierter 17:49:44 23.04.2012   Titel:              Zitieren

Beschreibe doch mal was nicht funktioniert.
Was soll passieren und was passiert.

Und bette deinen Code in cpp-Tags ein, dann bleibt die Fromatierung erhalten und man kann ihn dann besser lesen: Code markieren und den C/C++ Button unter den :) :D ;) anklicken.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <stdlib.h>
#include <stdio.h>
 
 
struct point { float x, y; };
/*
 * Parameter:
 * a, b: Punkte der Geraden 1
 * c, d: Punkte der Geraden 2
 * x: Schnittpunkt
 *
 * Rückgabewert:
 * 0: geraden sind parallel
 * 1: geraden schneiden sich in x
 * 2: geraden sind übereinander
 */

 
int intersect(struct point * a, struct point * b, struct point * c, struct point * d, struct point * x)
{
    float t, t1;
   
    t1 = d->x * b->y - d->y * b->x;
 
    t = d->y * (a->x - c->x) - d->x * (a->y - c->y);
 
    if(t1 == 0.0) {
        if(t == 0.0) {
            return 2; // gerade liegen aufeinander
        } else {
            return 0; // kein schnittpunkt
        }
    }
 
    t = t / t1;
 
    x->x = a->x + (b->x - a->x) * t;
    x->y = a->y + (b->y - a->y) * t;
 
    return 1;
}
 
 
 
int main(){
 
/*
    struct point a = { 0, 0 };
    struct point b = { 2, 1 };
    struct point c = { 4, 0 };
    struct point d = { 1, 0 };
    //struct point x = { 0, 0 };
*/

    printf("Bitte gebe die Punkte für die erste Gerade ein:\n");
    scanf("%f %f", a,b);
    printf("Bitte gebe nun die Punkte für die zweite Gerade ein:\n");
    scanf("%f %f", c,d);
   
    switch(intersect(&a, &b, &c, &d, &x)) {
        case 0:
            printf("kein schnittpunkt (parallel)\n");
            break;
        case 1:
            printf("ein schnittpunkt: S(%f|%f)\n", x.x, x.y);
            break;
        case 2:
            printf("geraden liegen aufeinander\n");
            break;
    }
getchar ();
}


Warum sind die Variablendefinitionen in main ausgeklammert?

scanf erwaten bei %f einen Zeiger auf float und keine struct. Das sollte aber auch der Compiler anmeckern (mit einer Warnung).

Wenn du schon bei den scanf bist, ersetzte doch gleich mal alle float durch double.
DirkB
Unregistrierter




Beitrag DirkB Unregistrierter 17:53:37 23.04.2012   Titel:              Zitieren

Man darf mittlerweile* auch structs an Funktionen direkt übergeben und auch zurückgeben. Man muss nicht den Umweg über Zeiger gehen.


*mittlerweile bedeutet hier, seit Mitte der 1980. Spätestens aber seit C89
fola
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.04.2012
Beiträge: 4
Beitrag fola Mitglied 17:57:26 23.04.2012   Titel:              Zitieren

mhh genau die kringelt er mir ein also, a, b, c, d, und &x aber warum exsistieren sie nicht? sind doch da oder nicht.

okay das heisst struct durch float ersetzen?

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdlib.h>
#include <stdio.h>
 
 
struct point { double x, y; };
/*
 * Parameter:
 * a, b: Punkte der Geraden 1
 * c, d: Punkte der Geraden 2
 * x: Schnittpunkt
 *
 * Rückgabewert:
 * 0: geraden sind parallel
 * 1: geraden schneiden sich in x
 * 2: geraden sind übereinander
 */

 
int intersect(struct point * a, struct point * b, struct point * c, struct point * d, struct point * x)
{
    double t, t1;
   
    t1 = d->x * b->y - d->y * b->x;
 
    t = d->y * (a->x - c->x) - d->x * (a->y - c->y);
 
    if(t1 == 0.0) {
        if(t == 0.0) {
            return 2; // gerade liegen aufeinander
        } else {
            return 0; // kein schnittpunkt
        }
    }
 
    t = t / t1;
 
    x->x = a->x + (b->x - a->x) * t;
    x->y = a->y + (b->y - a->y) * t;
 
    return 1;
}
 
 
 
int main(){
 
/*
    struct point a = { 0, 0 };
    struct point b = { 2, 1 };
    struct point c = { 4, 0 };
    struct point d = { 1, 0 };
    //struct point x = { 0, 0 };
*/

    printf("Bitte gebe die Punkte für die erste Gerade ein:\n");
    scanf("%f %f", a,b);
    printf("Bitte gebe nun die Punkte für die zweite Gerade ein:\n");
    scanf("%f %f", c,d);
   
    switch(intersect(&a, &b, &c, &d, &x)) {
        case 0:
            printf("kein schnittpunkt (parallel)\n");
            break;
        case 1:
            printf("ein schnittpunkt: S(%f|%f)\n", x.x, x.y);
            break;
        case 2:
            printf("geraden liegen aufeinander\n");
            break;
    }
getchar ();
 
 
}
DirkB
Unregistrierter




Beitrag DirkB Unregistrierter 18:03:48 23.04.2012   Titel:              Zitieren

fola schrieb:
mhh genau die kringelt er mir ein also, a, b, c, d, und &x aber warum exsistieren sie nicht? sind doch da oder nicht.

Nein, denn du hast sie ja auskommentiert in den Zeilen 47-51

Zudem sind deine Zeilen 54 und 56 falsch.
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17930
Beitrag SeppJ Moderator 18:21:57 23.04.2012   Titel:              Zitieren

fola schrieb:
mhh genau die kringelt er mir ein also, a, b, c, d, und &x aber warum exsistieren sie nicht? sind doch da oder nicht.
Merke: Wenn dein Compiler sich beschwert und dazu noch im Forum eine Erklärung kommt, dann kannst du davon ausgehen, dass du vielleicht mit deinem Standpunkt nicht richtig liegst. Insbesondere der Compiler hat immer Recht.

Deine Deklarationen sind, wie schon 2x gesagt, ausgeklammert.

Zitat:

okay das heisst struct durch float ersetzen?
Antworten bitte genau lesen, die meisten Leute hier drücken sich auch mathematisch genau aus, da ist jedes Wort wichtig:
Zitat:
Wenn du schon bei den scanf bist, ersetzte doch gleich mal alle float durch double.
Wobei mir das an deiner Stelle hier egal wäre.

_________________
Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List
fola
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.04.2012
Beiträge: 4
Beitrag fola Mitglied 18:56:42 23.04.2012   Titel:              Zitieren

Warum sind die Variablendefinitionen in main ausgeklammert?

weil es drei verschiedene ausgabesituationen geben soll. die strecken schneiden sich (ideallerweise) die strecken schneiden sich nicht und die strecken sind parallel.
weis leider nicht wie ich es anders schreiben soll, und warum sollen zeile 54-56 falsch sein.


sind bloß fragen meiner unwissenheit nicht aufregen :)
gigg
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.03.2012
Beiträge: 175
Beitrag gigg Mitglied 19:12:23 23.04.2012   Titel:              Zitieren

fola schrieb:
Warum sind die Variablendefinitionen in main ausgeklammert?

Die Variablendefinitionen sind auskommentiert durch /* */.
Der Compiler beachtet sie gar nicht.
Zitat:

... und warum sollen zeile 54-56 falsch sein.


scanf() erwartet Zeiger als Argumente.
fola
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.04.2012
Beiträge: 4
Beitrag fola Mitglied 15:56:31 24.04.2012   Titel:              Zitieren

also hab es den doch nochmal anders gemacht... aber jetzt schließt er mir die anwendung und sagt code 0 was will der von mir


C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <stdio.h>
#include <math.h>
int main (void)
 
       /* Hier werden als erstes die Angaben gemacht */
{
double x1, y1, x2, y2, x3, y3, x4, y4, m1, m2, n1, n2, Ergebnisx, Ergebnisy;
 
 
 
     printf ("Geben Sie fuer Strecke 1 x1 ein: \n");
     scanf ("%lf", &x1);
     printf ("Geben Sie fuer Strecke 1 y1 ein: \n");
     scanf ("%lf", &y1);
     printf ("Geben Sie fuer Strecke 1 x2 ein: \n");
     scanf ("%lf", &x2);
     printf ("Geben Sie fuer Strecke 1 y2 ein: \n");
     scanf ("%lf", &y2);
     printf ("Geben Sie fuer Strecke 2 x3 ein: \n");
     scanf ("%lf", &x3);
     printf ("Geben Sie fuer Strecke 2 y3 ein: \n");
     scanf ("%lf", &y3);
     printf ("Geben Sie fuer Strecke 2 x4 ein: \n");
     scanf ("%lf", &x4);
     printf ("Geben Sie fuer Strecke 2 y4 ein: \n");
     scanf ("%lf", &y4);
printf ("a=%f nb=%f nc=%f n",x1, y1, x2, y2, x3, y3, x4, y4);
 
 
 
{
    m1= (y2-y1)/(x2-x1);   /* berechnung der Steigung der Geraden */
    m2= (y4-y3)/(x4-x3);
 
    if (m1 == m2)
        printf("Strecken sind Parallel");
    else
    if (n1 < n2)
        printf("%lf schneiden sich nicht %lf \");
 
    n1= y1-(y2-y1)/(x2-x1)*x1;          /* Abstände zur x-Achse */
    n2= y3-(y4-y3)/(x4-x3)*x3;
 
    Ergebnisx = (n2-n1)/(m1-m2);        /* berechnung der Scnittpunkte für x und y Koordinaten */
    Ergebnisy = m1*(n2-n1)/(m1-m2)+n1;
 
    printf("
Schnittkoardinate fuer x betraegt: %lf/n", Ergebnisx);
    printf("
Schnittkoardinate fuer y betraegt: %lf/n", Ergebnisy);
}
   
        getchar ();
}
c++.de :: C (C89, C99 und C11) ::  Schnittpunktberechnung  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.