Optimized triangle and romb drawing functions

This commit is contained in:
Dmitriy Shishkov 2020-06-11 20:15:15 +05:00
parent 4609a31ebc
commit 45a2259cb6

View File

@ -1,13 +1,12 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <stdbool.h> #include <stdbool.h>
#include <unistd.h> #include <unistd.h>
typedef struct typedef struct
{ {
char type[3]; char type[3];
unsigned height; int height;
char symbol1, symbol2; char symbol1, symbol2;
bool romb; bool romb;
} triangle; } triangle;
@ -16,7 +15,8 @@ void clrscr();
bool strcomp(char *a, char *b); bool strcomp(char *a, char *b);
void swap(char *a, char *b); void swap(char *a, char *b);
void drawTriangle(triangle tr); void drawTriangle(triangle tr);
void drawRomb(triangle tr); void drawFlippedTriangle(triangle tr);
char curSymbol(char symbol1, char symbol2, int i);
void drawLine(int freeSpace, int length, char symbol); void drawLine(int freeSpace, int length, char symbol);
triangle getTriangleOptions(triangle tr); triangle getTriangleOptions(triangle tr);
@ -39,44 +39,37 @@ int main()
/* /*
Preview Preview
*/ */
triangle solid; triangle solid = {
strcpy(solid.type, "so"); .type = "so",
solid.height = 5; .height = 5,
solid.symbol1 = '*'; .symbol1 = '*',
.romb = false};
drawTriangle(solid); drawTriangle(solid);
printf("(so)lid\n"); printf("(so)lid\n");
triangle stripped; triangle stripped = {
strcpy(stripped.type, "st"); .type = "st",
stripped.height = 5; .height = 5,
stripped.symbol1 = '*'; .symbol1 = '*',
stripped.symbol2 = '+'; .symbol2 = '+',
.romb = false};
drawTriangle(stripped); drawTriangle(stripped);
printf("(st)ripped\n"); printf("(st)ripped\n");
/* /*
Configuration Configuration
*/ */
printf("Select what mode do you want to work with: ");
triangle tr; triangle tr;
// Type tr = getTriangleOptions(tr);
fgets(tr.type, 3, stdin);
printf("%s. Great choise!\n", (strcomp(tr.type, "so") ? "Solid" : "Stripped"));
/* /*
Drawing Drawing
*/ */
drawTriangle(tr);
if (tr.romb) if (tr.romb)
{ drawFlippedTriangle(tr);
drawRomb(tr);
}
else
{
drawTriangle(tr);
}
return 0; return 0;
} }
@ -110,95 +103,53 @@ void swap(char *a, char *b)
void drawTriangle(triangle tr) void drawTriangle(triangle tr)
{ {
if (strcomp(tr.type, "so")) if (strcomp(tr.type, "so"))
{
tr.symbol2 = tr.symbol1; tr.symbol2 = tr.symbol1;
}
else if (strcomp(tr.type, "st")) if (tr.romb)
{ {
} tr.height /= 2;
else tr.height++;
{
printf("Wrong input, try angain\n");
return;
} }
for (int i = 0; i < tr.height; i++) for (int i = 0; i < tr.height; i++)
{ drawLine(tr.height - i - 1, i * 2 + 1, curSymbol(tr.symbol1, tr.symbol2, i));
char curSymbol;
if ((i + 1) % 2 == 1)
{
curSymbol = tr.symbol1;
}
else
{
curSymbol = tr.symbol2;
}
drawLine(tr.height - i - 1, i * 2 + 1, curSymbol);
}
} }
void drawRomb(triangle tr) void drawFlippedTriangle(triangle tr)
{ {
if (strcomp(tr.type, "so")) if (strcomp(tr.type, "so"))
{
tr.symbol2 = tr.symbol1; tr.symbol2 = tr.symbol1;
}
else if (strcomp(tr.type, "st"))
{
}
else
{
printf("Wrong input, try angain\n");
return;
}
for (int i = 0; i < tr.height / 2; i++)
{
char curSymbol;
if ((i + 1) % 2 == 1)
{
curSymbol = tr.symbol1;
}
else
{
curSymbol = tr.symbol2;
}
drawLine(tr.height / 2 - i, i * 2 + 1, curSymbol);
}
if (tr.height % 2 == 0)
swap(&tr.symbol1, &tr.symbol2);
for (int i = tr.height - (tr.height / 2 + 1); i >= 0; i--) for (int i = tr.height - (tr.height / 2 + 1); i >= 0; i--)
{ drawLine(tr.height / 2 - i, i * 2 + 1, curSymbol(tr.symbol1, tr.symbol2, i));
char curSymbol; }
if ((i + 1) % 2 == 1)
{ char curSymbol(char symbol1, char symbol2, int i)
curSymbol = tr.symbol1; {
} if ((i + 1) % 2 == 1)
else return symbol1;
{ else
curSymbol = tr.symbol2; return symbol2;
}
drawLine(tr.height / 2 - i, i * 2 + 1, curSymbol);
}
} }
void drawLine(int freeSpace, int length, char symbol) void drawLine(int freeSpace, int length, char symbol)
{ {
for (int i = 0; i < freeSpace; i++) for (int i = 0; i < freeSpace; i++)
{
putchar(' '); putchar(' ');
}
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
{
putchar(symbol); putchar(symbol);
}
putchar('\n'); putchar('\n');
} }
triangle getTriangleOptions(triangle tr) triangle getTriangleOptions(triangle tr)
{ {
// Type
printf("Select what mode do you want to work with: ");
fgets(tr.type, 3, stdin);
printf("%s. Great choise!\n", (strcomp(tr.type, "so") ? "Solid" : "Stripped"));
// Height // Height
printf("Height of triangle: "); printf("Height of triangle: ");
scanf("%d", &tr.height); scanf("%d", &tr.height);