Muster innerhalb eines Kreises ausgeben



  • Hallo, folgendes Problem kann ich einfach nicht lösen.
    Um ehrlich zu sein verstehe ich die Aufgabenstellung nicht annähernd.
    Wie ist das mit dem Kreis gemeint? Ich sehe nur die "Box" (verschachtelte Schleifen).

    Task 07-geometry-3: Draw Ball
    Objective: One more exercise on loops in C code, together with a decision function that determines the output.

    Implement function void draw_ball(unsigned int radius) that draws an ASCII box that contains a circle filled with character ('*').

    The box is (2 * radius + 1) characters wide and tall, i.e., just large enough to contain the circle. There is a helper function 'distance' that returns the distance of given (x,y) coordinates from (0,0). If the circle is centered at (0,0), you can use the 'distance' function such that if distance(x,y) <= radius, coordinate (x,y) is within the circle, otherwise it is outside the circle.

    If a square is within circle, print character '*'. If a square is outside the circle, print character '.'.

    When draw_ball(3) is called, the output should be like this:

    ...*...
    .*****.
    .*****.
    *******
    .*****.
    .*****.
    ...*...
    

    Hint: You can use also negative numbers as part of the for loop, as long as the data type allows negative numbers.

    Mein miserabler Versuch:

    #include <stdio.h>
    #include <math.h>
    
    double distance(int x, int y)
    {
        return sqrt(x * x + y * y);
    }
    
    void draw_ball(unsigned int radius) {
    	for(int i = 0; i < (2 * radius + 1); i++) {
    		for(int j = 0; j < (2 * radius + 1); j++) {
    			if (distance(j, i) <= radius)
    				printf(".");
    			else
    				printf("*");
    		}
    
    		printf("\n");
    	}
    }
    
    int main(void) {
    	draw_ball(3);
    
    	return 0;	
    }
    
    

    Vielen Dank!



  • So miserabler ist dein Versuch gar nicht. Geh doch mal Schritt für Schritt durch die beiden Schleifen durch und verstehe was da passert. Schon im Fall i=0, j=0 sollte dir was auffallen. Was bedeutet hier der Punkt (0, 0)? Wo im Kreis ist der und wo wird der bei dir ausgegeben?



  • Beachte den Hint mit den negativen Zahlen.



  • @Biolunar
    Ehrlich gesagt habe ich keine Ahnung.
    Wenn draw_ball mit dem Argument 3 aufgerufen wird, dann zählt jede Schleife von 0 bis 6. (2 * radius + 1)
    Die innere Schleife läuft 7 Mal von 0 bis 6.

    i: 0     j: 0 1 2 3 4 5 6
    i: 1     j: 0 1 2 3 4 5 6
    i: 2     j: 0 1 2 3 4 5 6
    ... usw.
    

    Was mit dem Punkt (0,0) gemeint ist weiß ich eben nicht, wenn die Schleifen gemeint sind haben beide nur einmal zeitgleich den Wert 0, und zwar beim allerersten Durchlauf.



  • Der Mittelpunkt des Kreises soll aber an Position (0, 0) sein. Also was mußt du ändern? Hint: es gibt zwei Möglichkeiten (for-Schleife anpassen oder aber Parameter für distance).



  • @Th69
    OK, danke.
    Gibt eben Leute die für's Programmieren geschaffen sind, ich gehöre eben nicht dazu.
    Ich verstehe die Aufgabe im Grunde genommen gar nicht, werde ich auch nie.
    Soll eben nicht sein.



  • Bei deinem Code wird distance(0, 0) für die obere linke Ecke (0, 0) aufgerufen, anstatt für den Mittelpunkt (3, 3).
    Wie mußt du also den Aufruf (j, i) ändern?

    (-3,-3), (-2,-3), (-1,-3), (0,-3), (1,-3), (2,-3), (3,-3)
    (-3,-2), //...
    (-3,-1), //...
    (-3, 0), (-2, 0), (-1, 0), (0, 0), (1, 0), (2, 0), (3, 0)
    (-3, 1), //...
    (-3, 2), //...
    (-3, 3), (-2, 3), (-1, 3), (0, 3), (1, 3), (2, 3), (3, 3)
    

    Daher kannst du auch alternativ die beiden for-Schleifen so ändern, daß sie gleich die passenden Werte annehmen.



  • dir fehlen vor allem die grundlegenden kenntnisse der mathematik



  • Danke für eure Bemühungen, leider vergebens, wirklich verstehen tu ich es nicht.
    Nach langem hin und her ist mir eine Lösung geglückt, jedoch beinhaltet sie nicht den Ausdruck (2 * radius + 1).

    #include <stdio.h>
    #include <math.h>
    
    double distance(int x, int y)
    {
        return sqrt(x * x + y * y);
    }
    
    void draw_ball(int radius) { // war vorher unsigned
    	for(int i = -radius; i <= radius; i++) {
    		for(int j = -radius; j <= radius; j++) {
    			if (distance(i, j) <= radius)
    				printf("*");
    			else
    				printf(".");
    		}
    
    		printf("\n");
    	}
    }
    
    int main(void) {
    	draw_ball(3);
    
    	return 0;	
    }
    


  • weißt du nicht, wie man einen kreis verschiebt?



  • @tiefesC sagte in Muster innerhalb eines Kreises ausgeben:

    for(int i = -radius; i <= radius; i++) {

    Implizit ist der Ausdruck hier drin.

    Wenn du den Ursprung deines Koordinatensystems nicht in den Mittelpunkt des Kreises legst, sondern z.B. in die linke untere Ecke eines den Kreis umschließenden Quadrats, dann musst du dein i im den Wert radius verschieben.

    for(int i = -radius + radius; i <= radius + radius; i++) {
    und das ergibt:
    for(int i = 0; i <= 2 * radius; i++) {
    und das ist dasselbe wie
    for(int i = 0; i < 2 * radius + 1; i++) {

    Klar?


Log in to reply