| Autor |
Nachricht |
fola
Mitglied
Benutzerprofil
Anmeldungsdatum: 23.04.2012
Beiträge: 4
|
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: 17944
|
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
|
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 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
|
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
|
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
|
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: 17944
|
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
|
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
|
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
|
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 ();
} | | |
|
|
|
 |
|
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.
|
|
|
|
|