Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Koordinatenpunkt in Array

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.12.2007, 15:12 Uhr
KFC Embryo
Ein Huhn


Hallo,

ich habe ein Problem.
Ich möchte einen Koordinatenpunkt inein Array stecken z.B:

x Koordinate = 5; y Koordinate = 6 so das ganze soll jetzt PUNKT A sein.
x Koordinate = 5; y Koordinate = 6 so das ganze soll jetzt PUNKT B sein.

Jetzt möchte ich folgende Operation machen können:

PUNKT A - PUNKT B = 0.

Ich weis nicht wie ich die x und y Koordinate unter einen Hut bekomme.

Es geht darum aus Koordinatenpunkte geometrische Formen auszulesen.
Ich poste mal was ich bisher habe.


Code:

#include <stdio.h>


#define PUNKTA 0
#define PUNKTB 1
#define PUNKTC 2
#define PUNKTD 3

int main()
{
  int x[4], y[4];
  int i,j;
  
  for(i=0; i<1; i++){
      printf("Bitte x Koordinate eingeben: ");
      scanf("%d", &x[PUNKTA]);
            {
            printf("Bitte y Koordinate eingeben: ");
            scanf("%d", &y[PUNKTA]);
            }
  }
  
  for(i=0; i<1; i++){
      printf("Bitte x Koordinate eingeben: ");
      scanf("%d", &x[PUNKTB]);
            {
            printf("Bitte y Koordinate eingeben: ");
            scanf("%d", &y[PUNKTB]);
            }
  }

for(i=0; i<1; i++){
      printf("Bitte x Koordinate eingeben: ");
      scanf("%d", &x[PUNKTC]);
            {
            printf("Bitte y Koordinate eingeben: ");
            scanf("%d", &y[PUNKTC]);
            }
  }
  
  for(i=0; i<1; i++){
      printf("Bitte x Koordinate eingeben: ");
      scanf("%d", &x[PUNKTD]);
            {
            printf("Bitte y Koordinate eingeben: ");
            scanf("%d", &y[PUNKTD]);
            }
  printf("\n");
  }
  
  printf("%d %d \n", x[PUNKTA], y[PUNKTA]);
  printf("%d %d \n", x[PUNKTB], y[PUNKTB]);
  printf("%d %d \n", x[PUNKTC], y[PUNKTC]);
  printf("%d %d \n", x[PUNKTD], y[PUNKTD]);
  printf("\n");        

  printf("Die Form entspricht einem ");
  
  if ((x[PUNKTB] - y[PUNKTC] == 0) && (x[PUNKTC] - y[PUNKTB] == 0))
      printf("Quadrat");
      else if
       ((x[PUNKTA] - x[PUNKTC] == 0) && (x[PUNKTB] - x[PUNKTD] == 0)|| (x[PUNKTA] - x[PUNKTB] != 0) && (x[PUNKTC] - x[PUNKTD] != 0)){
        printf("Rechteck");
        }
      else{
      printf("gulasch");
      }
        
  getch();
  return 0;
}




Ich bedanke mich schon mal.
mfg
--
An nescis, mi fili, quantilla prudentia mundus regatur?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.12.2007, 15:55 Uhr
firefoxxi



Hi,

irgendwie verstehe ich jetzt gerade nicht, was dein Problem ist. Aber mal abgesehen davon ist das definieren der Punkte PUNKTA, PUNKTB usw. nicht gerade eleganter Programmierstil. Und was bitte sollen die Schleife um die Einleseroutinen herum? Die werden immer genau einmal ausgeführt, also können sie auch weg. Das einlesen der Punkte lässt sich aber eleganter gestalten, wenn man eine Schleife rundrum setzt, die viermal das Einlesen ausführt.


C++:
for(j=0;j<4;j++) {
      printf("Bitte x Koordinate eingeben: ");
      scanf("%d", &x[j]);
            {
            printf("Bitte y Koordinate eingeben: ");
            scanf("%d", &y[j]);
            }
}


Ansonsten wers natürlich auch clever anstatt 2 Arrays eine Struktur zu benutzen. Also in etwa so:


C++:
#include <stdio.h>

struct POINT {
    int x;
    int y;
};

int main()
{
    struct POINT p[4];
    int j;

    for(j=0; j<4;j++){
        printf("Bitte x Koordinate eingeben: ");
        scanf("%d", &p[j].x);
        printf("Bitte y Koordinate eingeben: ");
        scanf("%d", &p[j].y);
    }
  
    printf("%d %d \n", p[0].x, p[0].y);
    printf("%d %d \n", p[1].x, p[1].y);
    printf("%d %d \n", p[2].x, p[2].y);
    printf("%d %d \n", p[3].x, p[3].y);
    printf("\n");        

    printf("Die Form entspricht einem ");

    if((p[1].x - p[2].y == 0) && (p[2].x - p[1].y == 0))
        printf("Quadrat");
    else if((p[0].x - p[2].x == 0) &&
            (p[1].x - p[3].x == 0) ||
            (p[0].x - p[1].x != 0) &&
            (p[2].x - p[3].x != 0)){
        printf("Rechteck");
    }
    else{
        printf("gulasch");
    }
        
    return 0;
}


Ansonsten scheinen mir deine Bedingungen nicht wirklich zu funktionieren.
--
Gruß
firefoxxi

http://firebird-browser.de/
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.12.2007, 18:17 Uhr
KFC Embryo
Ein Huhn


Hey,

doch du hast mich verstanden^^.
Hast mein Problem gelöst.

Das mit der Strucktur kannte ich noch nicht.

Danke.

Gibt es eventuell eine Seite auf der man nachschlagen kann wie man die Eigenschaften der Formen prüft?

mfg
--
An nescis, mi fili, quantilla prudentia mundus regatur?

Dieser Post wurde am 29.12.2007 um 18:33 Uhr von KFC Embryo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.12.2007, 19:52 Uhr
firefoxxi



Hi,

freut mich ^^. Die Eigenschaften lassen sich bei Wikipedia recht schnell nachschlagen. Das einzige Problem was sich bei der Berechnung ergibt ist das du nicht weißt welcher Punkt welchem gegenüberliegt. D. h. du weiß nicht ob der User zuerst die linke obere Ecke oder zuerst die linke untere Eingibt. Mit ein paar ifs vor der eigentlichen Feststellung der Form ist es aber leicht die Punkte z. B. von oben links im Urzeigersinn zu sortieren und dann brauchst du nur noch die entsprechenden Sacher überprüfen.
--
Gruß
firefoxxi

http://firebird-browser.de/
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.12.2007, 21:23 Uhr
KFC Embryo
Ein Huhn


So ich denke das, dass jetzt ne anehmbare Lösung ist oder?



Code:

#include <stdio.h>

struct POINT {
    int x;
    int y;
};

int main()
{
  struct POINT p[4];
  int x, y, j;
  
  
  for(j=0; j<4;j++){
        printf("Bitte x Koordinate eingeben: ");
        scanf("%d", &p[j].x);
        printf("Bitte y Koordinate eingeben: ");
        scanf("%d", &p[j].y);
    }

    printf("Die Form entspricht einem ");
  
if((p[1].y - p[0].y == p[2].x - p[1].x) && (p[3].y - p[2].y == p[3].x - p[1].x ))
        printf("Quadrat");
    
    else if((p[0].x == p[1].x) && (p[2].x == p[3].x))
        printf("Rechteck");
    
    else if ((p[0].y==p[1].y) && (p[2].y==p[3].y))
         printf("Parallelogramm");
    
    else if (((p[3].y - p[2].y) > (p[1].x - p[0].x)) || ((p[0].y - p[1].y) > (p[1].x - p[0].x)))
         printf("Raute");
    
    else if ((((p[0].x - p[2].x) == (p[1].x - p[3].x)) && (!((p[1].y - p[2].y) == 0) )) ^ (((p[0].y - p[2].y) == (p[1].y - p[3].y))) && (!((p[0].y - p[3].y) == 0)))
         printf("Trapez");    
    
    else{
        printf("beliebigen Viereck");
    }
    
    getch();    
    return 0;
}






mfg
--
An nescis, mi fili, quantilla prudentia mundus regatur?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
31.12.2007, 17:09 Uhr
firefoxxi



Du hast genau das Problem, das ich in meinem vorangehenden Post angesprochen hab. Wenn ich das richtig sehe, dann gehst du davon aus, dass der User die Koordinaten in dieser Reihenfolge eingibt:


Code:
0+----+3
|    |
|    |
1+----+2


Wenn er aber diese Reihenfolge nimmt:


Code:
0+----+1
|    |
|    |
2+----+3


Dann ist p[1].y - p[0] gleich 0 und p[2].x -p[1].x ungleich null, obwohl eigentlich ein Quadrat vorliegt, behauptet dein Programm dann, dass es keins ist.
Deshalb solltest du die Koordinaten zuerst in eine festgelegte Reihenfolge bringen. In etwa so:


C++:
#include <stdio.h>
#include <stdlib.h>

struct _POINT {
    int x;
    int y;
};

#define POINT struct _POINT

int compareX(const void* a, const void* b)
{
    return (((POINT*)a)->x - ((POINT*)b)->x);
}

void swap(POINT* a, POINT* b)
{
    POINT t = *a;
    *a = *b;
    *b = t;
}

int main()
{
    POINT p[4];
    int j;

    // Einlesen
    
    qsort(p, 4, sizeof(POINT), compareX);
    if(p[0].y < p[1].y) swap(&p[0], &p[1]);
    if(p[2].y > p[3].y) swap(&p[2], &p[3]);
    
    // Formen überprüfen
        
    return 0;
}


qsort sortiert die Zahlen aufsteigend. Wie genau die Funktion arbeitet steht hier: www.cplusplus.com/reference/clibrary/cstdlib/qsort.html. Die Funktion swap vertauscht die beiden übergebenen Koordinaten. Dann sortieren wir sie noch nach y-Werten und am Ende sind sie von oben links entgegen dem Uhrzeigersinn sortiert (also so wie ich bei dem ersten Beispiel nummeriert hab).
--
Gruß
firefoxxi

http://firebird-browser.de/

Dieser Post wurde am 31.12.2007 um 17:10 Uhr von firefoxxi editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: