Sebastian L
Sebastian L

Reputation: 834

3D ASCII Sine wave generator generates weird sine waves

I coded a 3D sine wave generator in C/C++

Code:

#include <stdio.h>
#include <math.h>
#include <unistd.h>

#define cursorForward(x) printf("\033[%dC", (x))
#define cursorBackward(x) printf("\033[%dD", (x))
#define cursorUp(x) printf("\033[%dA", (x))
#define cursorDown(x) printf("\033[%dB", (x))
#define clearScreen printf("\033[2J")
#define width 40
#define height 15
#define amplitudeHeight 10
#define period 0.1

char *values = " .,o#";
float time = 0;

int main()
{
    while(1) {
        for(int y = 0; y < heigth; y++) {
            for(int x = 0; x < width; x++) {
                printf("%c ", values[(int) (amplitudeHeight * (sin(period * sqrt((x - width / 2) * (x - width / 2) + (y - height/ 2) * (y - height/ 2)) + time) + 1)) % 5]);
            }
        printf("\n");
        }
        usleep(1000 * 100);
        time += 0.1;
        cursorBackward(width);
        cursorUp(heigth);
    }
    return 0;
}

you need to compile it with gcc source.c -std=c99 or g++ source.c

I expected a smooth 3D sinewave as output

My Problem is that somewhere in the formula

amplitudeHeight * //controls the AmplitudeHeight
(sin(period * //controls the period width
sqrt((x - width / 2) * (x - width / 2) + //controls x position 
(y - height/ 2) * (y - height/ 2)) +  //controls the y position
time) + 1) //time
% 5 // i only have 5 representative chars

i have an error so the output looks cool but not what i expected:

. . , , o # #   . , o # #   . . , , o o o o o , , . .   # # o , .   # # o , , .
. . , o o #   . , , o #   . . , o o o # # # o o o , . .   # o , , .   # o o , .
. , , o # #   . , o #     . , o o # #       # # o o , .     # o , .   # # o , ,
. , , o #     . , o #   . , o o #               # o o , .   # o , .     # o , ,
. , , o #   . , o # #   . , o #     . . . . .     # o , .   # # o , .   # o , ,
. , o o #   . , o #   . , o o #   . . , , , . .   # o o , .   # o , .   # o o ,
. , o o #   . , o #   . , o #     . , , o , , .     # o , .   # o , .   # o o ,
. , o o #   . , o #   . , o #     . , o o o , .     # o , .   # o , .   # o o ,
. , o o #   . , o #   . , o #     . , , o , , .     # o , .   # o , .   # o o ,
. , o o #   . , o #   . , o o #   . . , , , . .   # o o , .   # o , .   # o o ,
. , , o #   . , o # #   . , o #     . . . . .     # o , .   # # o , .   # o , ,
. , , o #     . , o #   . , o o #               # o o , .   # o , .     # o , ,
. , , o # #   . , o #     . , o o # #       # # o o , .     # o , .   # # o , ,
. . , o o #   . , , o #   . . , o o o # # # o o o , . .   # o , , .   # o o , .
. . , , o # #   . , o # #   . . , , o o o o o , , . .   # # o , .   # # o , , .

the result i want to achieve is a smooth 3D sinewave, but i don't see the error in my code.

EDIT: there seems to be a little more wrong than i thought if i set the period to 0.5 i get:

# # , o o # .     , .   o . o # # # o o , o o # # # o . o   . ,     . # o o , #
# o   . . ,     . # o o . o # # o .   # # #   . o # # o . o o # .     , . .   o
# o # #   .     o . .   o # # o   o . # # # . o   o # # o   . . o     .   # # o
# , o o # .   . # o o , # # o   , # .   #   . # ,   o # # , o o # .   . # o o ,
# . , , o     .     # o # # . o #   , . . . ,   # o . # # o #     .     o , , .
# . . . ,     , . .   o # o   . . ,           , . .   o # o   . . ,     , . . .
# . . . ,     , , , . # # o # #   .     .     .   # # o # # . , , ,     , . . .
#   . . ,     o , , . # # , # # # .   . # .   . # # # , # # . , , o     , . .
# . . . ,     , , , . # # o # #   .     .     .   # # o # # . , , ,     , . . .
# . . . ,     , . .   o # o   . . ,           , . .   o # o   . . ,     , . . .
# . , , o     .     # o # # . o #   , . . . ,   # o . # # o #     .     o , , .
# , o o # .   . # o o , # # o   , # .   #   . # ,   o # # , o o # .   . # o o ,
# o # #   .     o . .   o # # o   o . # # # . o   o # # o   . . o     .   # # o
# o   . . ,     . # o o . o # # o .   # # #   . o # # o . o o # .     , . .   o
# # , o o # .     , .   o . o # # # o o , o o # # # o . o   . ,     . # o o , #

which looks like its resonating in itself.

Upvotes: 0

Views: 373

Answers (1)

Jay
Jay

Reputation: 656

The value of amplitudeHeight should be 2.5 to account for the number of symbols. You're clipping the wave where the amplitude goes from 0..20 and taking the mod 5.

Upvotes: 1

Related Questions