Как нарисовать прямоугольник с диагоналями и осями симметрии в C ++ в консоли? - PullRequest
0 голосов
/ 15 мая 2018

Я хотел бы нарисовать прямоугольник с * в консоле. Теперь у меня есть код, который рисует окружность прямоугольника и его осей симметрии, но я не знаю, как рисовать диагонали. Вы можете мне помочь? Это мой код

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

#include <math.h>


int main(int argc, char *argv[]) {
int s,d;
    printf ("the length of the rectangle \n");
    scanf ("%d",&s);
    printf ("width of the rectangle \n ");
    scanf ("%d",&d);
    int l;
    int p;
    int przekatna; 

    for (p=1; p<=s; p++)
    {
    printf ("\n");
    for (l=1;l<=d; l++)
    {

    if(p==1 || l==1 || l==d || s==p || p==((d+1)/2)  ) printf("*"); else printf(" ");
    if ( l==(d)/2 && p!=((d+1)/2) && p!=1 && p!=s) 
    printf("*"); else printf(""); 


    }
}
     return 0;
}

Правка, хороший код, его работа, мой учитель объяснил мне, как делать диагонали, и вот что это такое

#include <stdlib.h>

#include <math.h>

int main() {
    int l;
    int p;
    int s;
    int d;
    printf ("the length of the rectangle  \n");
    scanf ("%d",&s);
    printf ("width of the rectangle  \n ");
    scanf ("%d",&d);

    for (p=1; p<=s; p++)
    {
    printf ("\n");
    for (l=1;l<=d; l++)

    {

    if(p==1 || l==1 || l==d || s==p 
    || p==s/2 || l==l/2 ||
     l==p*round(d/s) || l==(s+1-p)*round(d/s) )

    printf("*"); else printf(" ");


    }
  }
      return 0;
    }

1 Ответ

0 голосов
/ 15 мая 2018

Это на самом деле совсем не тривиальная проблема!

Видите ли, диагонали (когда мы представляем, что они являются линиями той же ширины, что и окружные линии) не очень хорошо соответствуют целочисленным координатам.Поэтому, если вы используете '*' символов, у вас будет слишком много - по несколько на одну строку - или слишком мало, с разрывами в строке.

Возможно, вы захотите использовать алгоритм рисования линий Брезенхэмом для этой задачи.

Или - если вы хотите быть упрощенным и поместить один '*' на строку, используйте формулу для диагонали с округлением, чтобы выбрать наилучшее значение независимо от других линий:

major_diagonal_y = (x - start_x) * ((float) rectangle_y_dim) / rectangle_x_dim

(при условии, что x является вертикальным измерением, а y является горизонтальным; выиспользовали другие символы, но я нашел их немного запутанными.)

Для противоположной (младшей) диагонали используйте

minor_diagonal_y = rectangle_y_dim - major_diagonal_y

Если вы хотите использовать других персонажей, вы можете обратиться к этому руководству по ASCII art с разделом по диагонали.Он демонстрирует, как варьировать использование символов для эффективного разрешения «подсимволов».Цитирую их пример:

       /         .'               _,-'                            __
      /        .'             _,-'                        __..--''
     /       .'           _,-'                      __..''
    /      .'         _,-'                  __..--''
   /     .'       _,-'              __..--''
  /    .'     _,-'          __..--''                   ____....----"""
 /   .'   _,-'      __..--''           ____....----""""
/  .'  ,-'  __..--''   ____....----""""
...