plot — Sin and Cosine chart plotter ….. некоторые ошибки алгоритма Stack Overflow

Итак, я создал эту программу построения графиков здесь. Однако у меня есть несколько глюков с этим. Сначала я должен описать, как эта программа работает. В основном используя stdscr и создавая новую победу, я должен создать программу «генератора функций». Charcaters будут напечатаны на экране, который будет эмулировать синусоидальную и косинусоидальную формы волны. Когда персонажи катятся по окну, окно прокручивается. Одно из окон будет содержать рамку (заголовок, строки, нижний колонтитул). Другое окно будет тем, которое будет прокручивать и печатать синусоидальные и косинусоидальные сигналы. Я уже давно проверяю свой код, и что бы я ни делал, я не могу понять.

Если вы все еще не можете представить программу, подумайте о понг … 2 вертикальные линии сверху и снизу, а затем линия, проходящая через середину. И на этом «дворе» / экране будут печататься волны синуса и косинуса.

Моя ошибка в том, что грех и косинус печатают не так, как я хочу … кажется, что они выходят за пределы окна Ньювина. Кроме того, нижний колонтитул, который будет обозначать от 1 0 -1, не будет перемещаться в положение, которое я хочу, в нижнем колонтитуле.

#include <curses.h>
#include <math.h>
#include "fmttime.h"#include <sys/time.h>
#include <time.h>
#include <unistd.h>

enum colors
{
BLACK,
RED,
GREEN,
YELLOW,
BLUE,
MAGENTA,
CYAN,
WHITE,
};

void Sim_Advance(int degrees);          // Function prototype declarations
double Sim_Cos();
double Sim_Sin();
void frame(const char* title, int gridcolor, int labelcolor);
void mark(WINDOW* window, char ch, int color, double value);

static const double PI = (3.1415927/180); // Degrees to radian factor
static double PA = 0;                   // Phase angle
static int x;                           // X dimension of screen
static int y;                           // Y dimension of screen
static int delay1 = 300000;             // 300ms Delay

struct timeval tv;                      // Timeval object declaration

int main(void)
{
initscr();                          // Curses.h initilizations
cbreak();
nodelay(stdscr, TRUE);
noecho();int keyhit;
int ctr = 1;                        // Exit flag
int degrees = 10;                   // Interval to be added to phase
int tempcounter = 1;
char buf[32];                       // Buffer being sent to formattime
size_t len = sizeof(buf);           // Size of buffer being passed
gettimeofday(&tv, NULL);            // calling function for epoch time
formatTime(&tv, buf, len);          // Calling formaTime for timestamp

getmaxyx(stdscr,y,x);
WINDOW* Window = newwin(y-4, x-2, 2, 5);
scrollok(Window, TRUE);
char cTitle[] = {"Real time Sine/ Cosine Plot"};  // Title string for plotwhile (ctr == 1)                // This will run the program till
{                               // exit is detected (CTRL-X)
usleep(delay1/6);           // Delays program execution
keyhit = getch();

mark(Window,'C', WHITE, Sim_Cos());mark(Window,'S', RED, Sim_Sin());

Sim_Advance(degrees);       // Advances PA by "degrees" value (10)

if (tempcounter == 1)
{
frame(cTitle, WHITE, RED);  // Prints out the frame once
--tempcounter;
}

if (keyhit == 24)
{
ctr = 0;            // Exit flag set
}
}
endwin();
return 0;
}

// Function will advance the Phase angle by assigned value of degrees
// The value of degrees must be an int and must be in radians

void Sim_Advance(int degrees)
{
PA = PA + degrees;

if (PA >=  360)
{
PA = PA - 360;

}
}

// Calculates the Cos of the Phase angle and returns value to main

double Sim_Cos()
{
double PARad;                       // Need to convert degrees into Radian
PARad = (PA*PI);

return cos(PARad);
}

// Calculates the Sin of the Phase angle and returns value to main

double Sim_Sin()
{
double PARad2;                      // Variable to hold radian value
PARad2 = (PA*PI);
return sin(PARad2);
}

// Will print the grid and Axis of the display as well as a title for the display
// with variable background and/or foreground colors

void frame(const char* title, int gridcolor, int labelcolor)
{

int offset = 27/2;                  // Middle of string
int col = 0;
int row = 0;
int botline = 0;

start_color();
init_pair(0, labelcolor, BLACK);
init_pair(1, gridcolor, BLACK);

wmove(stdscr, 0, (x / 2)- offset);wprintw(stdscr,"%s\n", title);
wrefresh(stdscr);

while (row != x)                    // This prints the top line
{
attrset(COLOR_PAIR(1));
wprintw(stdscr,"-");

wrefresh(stdscr);
++row;
}

while (col != y-4)                  // This prints the middle line
{
wmove(stdscr, col + 2, x/2);
wprintw(stdscr, "|\n");
wrefresh(stdscr);
++col;
}

while (botline != x)                // Prints the bottom line
{
wprintw(stdscr, "-");
wrefresh(stdscr);
++botline;
}

attrset(COLOR_PAIR(0));

wmove(stdscr, y, 0);                // These three things commands
wprintw(stdscr, "-1");              // Will print out the proper footer
wrefresh(stdscr);wmove(stdscr, y, x/2);
wprintw(stdscr, "0");
wrefresh(stdscr);wmove(stdscr, y, x);
wprintw(stdscr, "1");
wrefresh(stdscr);

}

// Will print out the characters passed to it in the designated
// window to which it points to.

void mark(WINDOW* window, char ch, int color, double value)
{
int cursep = (((x/2) * value) + (x/2)); // Prints character from middle
int currenty = getcury(window);         // of screen
wmove(window, currenty+1, cursep-3);    // Moves cursor to desired location
wrefresh(window);
usleep(delay1);
waddch(window, ch);
wrefresh(window);
}

0

Решение

Частичное решение (упрощенный пост поможет OP и SO)

  1. использование double PI = (M_PI/ 180); или 3.141592653589793 / 180

  2. Преобразование положительного двойного в int округляет вниз, отрицательное двойное в int округляет вверх. Так что избегайте двойного к int с обеих сторон от 0.

  3. Ширина есть x, Думайте о экране как x коробки поперек. центр поля 0 для значения -1,0. центр поля x-1 для значения +1.0. Таким образом, от центра к центру расстояние х-1 ящиков.

+ Изменить

int cursep = (((x / 2) * value) + (x / 2));

в

void mark() {
...
// value = -1.0 --> cursep = 0
// value = +1.0 --> cursep = x - 1
// ** Adjust these 4 vars as needed to re-map your translation **
double val_min = -1.0;
double val_max = +1.0;
int  cur_min = 0;
int  cur_max = x - 1;
//  y = (y1-y0)/(x1-x0)*(x-x0) + y0
double cur_d = (cur_max - cur_min)/(val_max - val_min)*(value - val_min) + cur_min;
int cursep = floor(cur_d + 0.5);

4 Не ясно о -3 в wmove(window, currenty + 1, cursep - 3);

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]