Berechnen von Winkeln zwischen 2 Punkten...



  • knivil schrieb:

    Dafuer muss man nicht den Winkel berechnen. Skalarprodukte reichen, atan ist im Vergleich sehr teuer.
    ....
    Vielleicht koenntest du kurz sagen, was am Ende herauskommen soll.

    Ich denke mal dass es hier nicht um die Mathematik geht sondern um "Programmieren in C".



  • Isengo schrieb:

    @ Berniebutt ... ja ich studiere 30 Meilen entfernt von Boston an der UMass Lowell, Mathekurse hab ich aber alle in Deutschland belegt ...

    Ich kenne von einem Besuch nur die UMass Amhorst - schöner Campus. Das MIT in Cambridge gefällt jedoch mir besser, weil nicht so auf der Wiese. Nun im Ernst: 'was hast du in Deutschland in Mathematik gelernt? An allen Unis werden die hier erforderlichen Grundkenntnisse der Geometrie doch vorausgesetzt.'

    Wo genau ist dein Problem:
    ➡ Mathematik?
    ➡ Programmieren in C?

    Ich mache hier im Forum keinen Wind, sondern will nur helfen. Dazu muss ich aber verstehen, worum es genau geht. Und nun leg dich wieder hin oder fahre nach Boston, an den Atlantik, oder die Niagaras - dort kann man einen klaren Kopf kriegen.



  • knivil schrieb:

    After you calculate the thetas, please sort the points in increasing angle.

    Dafuer muss man nicht den Winkel berechnen. Skalarprodukte reichen, atan ist im Vergleich sehr teuer.

    das meine Erklaerung nicht konkret genug war, aber deswegen so einen Wind drum machen

    Mit einer klaren Sicht auf das Problem, erkennt man auch meist gleich die Loesung.

    Vielleicht koenntest du kurz sagen, was am Ende herauskommen soll. Ich tippe mal auf Grahams Scan zur Berechnung der konvexen Huelle.

    Uns ist vorgegeben welche Funktionen wir benutzen, aber danke fuer den Hinweis.

    Ja Cambridge ist nett und das MIT ist der Hammer, allerdings auch die Preise... Und mein Stipendium deckt leider nur staatliche Universitaeten 😉

    But please back 2 topic!

    Eingabe der Werte erfolgt ueber eine Datei namens points.txt, Ausgabe der Werte erfolgt in der Datei wessen Name in die cmd Zeile 1 geschrieben wird ( Beispiel: ./a.out test.txt ( System: Linux ueber SSH ) ) , also argv[1].

    In diese Datei wird geschrieben ein X Y und Winkelwert ( diesen nur zur Kontrolle ob auch wirklich richtig sortiert wurde... )

    Ich glaube meine Funktionen muessen noch etwas uebersichtlicher werden, ich uebergebe noch zu viele Variablen, oder ? Ist es moeglich alle Funktionen von main auszufuehren , in diesem Fall hier ?

    hier der fertige Code:

    /***************************************************************/ 
    /* Programmer: Micha Hobert                                    */ 
    /*                                                             */ 
    /* Program 19: Quick Sort Them Thetas                          */ 
    /*                                                             */ 
    /* Approximate completion time:   7 hours                      */ 
    /***************************************************************/ 
    
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <math.h> 
    #define PI (3.141592653589793)
    
    typedef struct { 
      double x; 
      double y; 
    }location; 
    
    void swap ( double *a, double *b ){
    
      double temp;
    
      temp = *a ;
      *a = *b;
      *b = temp;
    }
    
    void swap2 ( int *a, int *b ){
    
      int temp;
    
      temp = *a ;
      *a = *b;
      *b = temp;
    }
    
    void printfirstpartofarray(FILE *name, location ptr[], double ptr2[], int n, int sort[]){
    
      int j=0 ;
    
      while ( j <= n-1 ){
    
        fprintf(name,"X = %f  Y = %f Angle = %f \n", ptr[sort[j]].x, ptr[sort[j]].y, ptr2[j]);   
        j++;
      }   
    
    }
    
    void quick_sort ( double ptr2[], int low, int high, int sort[]){
    
      int i, j , pivot;
    
      if ( high <= low) return;
    
      i = low - 1;
      j = high ;
      pivot = ptr2[high];
    
      while (1) {
    
        do i = i + 1; while ( ( i < high ) && ( ptr2[i] < pivot));
        do j = j - 1; while ( ( j >= low) && ( ptr2[j] > pivot ));
    
        if ( i >= j) break;
        swap ( &ptr2[i], &ptr2[j]);
        swap2 ( &sort[i], &sort[j] );   
      }
    
      swap(&ptr2[i], &ptr2[high]);
      swap2(&sort[i], &sort[high]);
      quick_sort ( ptr2, low, i-1,sort);
      quick_sort (ptr2, i+1, high,sort);
    
    }
    
    /**********************************************************************/
    
    void angle ( FILE *name, location ptr[] , int n, double minx, double miny) { 
    
      double buffer, result; 
      int k = 0; 
      double *ptr2;
      int sort[15]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
    
      ptr2 = malloc (n * sizeof (double) );
    
      while ( k <= n-1 ) { 
    
        buffer = (ptr[k].y-miny) / (ptr[k].x-minx); 
        result = atan ( buffer ) * 180 / PI; 
    
        if ( ptr[k].y-miny == 0.0){
          /*  printf("The angle between Lowermost-Leftmost and point %d is 0.000000 degrees.\n\n",k);*/
          ptr2[k] = 0.0;
    
        }
        else{
    
          if ( ptr[k].x-minx == 0.0 ){
    
    	/*  printf("The angle between Lowermost-Leftmost and point %d is  90.000000 degrees.\n\n",k);*/
    	ptr2[k] = 90.0;
          }
          else {
    
    	/* printf ("The angle  between Lowermost-Leftmost and point %d is  %f degrees.\n\n ",k ,result);*/ 
    	ptr2[k] = result; 
          }
        }
        k++;
    
      }
    
      quick_sort(ptr2,0,n-1, sort);
    
      printfirstpartofarray(name,ptr,ptr2,n,sort);
    
    } 
    
    void vector (FILE *name, location ptr[] , int n ) { 
    
      int r; 
      int j; 
      double miny; 
      double minx; 
    
      minx = ptr[0].x; 
      miny = ptr[0].y; 
    
      for (j=0; j<=n-1; j++){ 
    
        if (ptr[j].y<miny){ 
          miny=ptr[j].y; 
          minx=ptr[j].x; 
    
          for (r=0;r<=n-1;r++){ 
    	if ( ptr[r].x < minx ){ 
    	  miny=ptr[r].y; 
    	  minx=ptr[r].x;
    
    	} 
          } 
        } 
      } 
    
      printf( "The Lower Most, Left Most Point is: x = %f  and y = %f\n\n", minx,miny ); 
      printf ("You can find your sorted Thetas in the File you typed in the cmd line.\n ");  
    
      angle (name, ptr, n, minx, miny ); 
    
    } 
    
    int main (int argc, char *argv[] ) { 
    
      int n; 
      location *ptr; 
      int i=0; 
      FILE *name, *fin;
    
      fin = fopen ("points.txt", "r"); 
      fscanf ( fin, "%d", &n );
    
      name = fopen (argv[1], "w+");
      fprintf (name, "%d\n", n );
    
      ptr = malloc ( n * sizeof(location) ); 
    
      while(i <= n-1 ){ 
        fscanf(fin, "%lf%lf", &ptr[i].x,&ptr[i].y); 
        i++; 
    
      } 
    
      vector (name, ptr , n ); 
    
      return 0; 
    
    }
    


  • Isengo schrieb:

    ... Ja Cambridge ist nett und das MIT ist der Hammer, allerdings auch die Preise... Und mein Stipendium deckt leider nur staatliche Universitaeten ...

    Das MIT hätte ich mir auch nicht leisten können! Für die Preise dort bekommt man aber eine first-class education mit bester persönlicher Betreuung.
    Back to topic: approximated 7 hours for a sort? 😕 Der QuickSort scheint da wohl etwas ungeeignet!



  • Completion time of building the program, not running it 😉



  • Nachdem sich der Nebel der Selbstbeweihräucherung verzogen hat und man genauer hinschaut, hättest du nicht extra über den Teich fliegen müssen, um diesen Code zu produzieren.

    - warum sortierst du die Indexe und die Werte?
    - wo rufst du fclose auf?
    - du testest auf Gleichheit von Fließkommazahlen!
    - zu jedem malloc gehört ein free, wo ist das?
    - du testest den Rückgabewert von fscanf nicht
    - alle Funktionen aus main direkt aufzurufen ist Unsinn, Funktionen sollen Funktionalitäten kapseln und werden jetzt ja schon, wenn auch implizit, von main aufgerufen und das kannst du so lassen
    - ...


Anmelden zum Antworten