Red de conocimiento informático - Conocimiento del nombre de dominio - ¿Cómo dibujar una curva con y=senx usando programación en C?

¿Cómo dibujar una curva con y=senx usando programación en C?

Depende del software que tengas. La clave para dibujar una curva es calcular las coordenadas xey de la curva y luego conectar los dos puntos con una línea.

El siguiente es un programa de dibujo de curvas escrito con MS VC API. Dibuja curvas de tiempo, se puede ampliar y dibuja escalas de coordenadas... Algunas funciones se han eliminado (no eliminadas) como referencia.

Si aparece un mensaje de advertencia durante la compilación, puedes omitirlo.

Supongamos que x0=0; dx=0,01;

#include lt;afxwin.hgt;

#include lt;stdio.hgt;

#include lt;stdlib.hgt;

#include lt;math.hgt;

#include lt;Winuser.hgt;

#comentario pragma (lib, "LIBCMT.LIB")

#define DEBUG 0

HWND hWndMain;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

BOOL InitWindowsClass(HINSTANCE hInstance);

BOOL InitWindows(HINSTANCE hInstance, int nCmdShow);

void OnDisplayMessage(char *str);

void set_n_scale_y(int *ndiv, float ymin, float ymax , float *yu, float *yd, float *dy);

void set_n_scale_x(int ​​​​*ndiv, float t0, float te, float *td, float *tu, float *draw_dt);

flotador estático *yt, rx, ry, y_min, y_max, y_ran, y_shift;

flotador estático draw_yu, draw_yd, draw_dy, draw_min, draw_max;

estático float t0 =0.0, dt=1.0, draw_tu, draw_td, draw_dt;

int flag_t0=0

float bt_scale_1=1.0; , draw_nt =6;

char pname[40], namein[50], str[120], para2[10], para3[10], para4[10];;

char one_line[80];

int len, NN;

LPTSTR argv;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)

{

MSG Msg;

int i

//obtener línea cmd

argv = GetCommandLine ();

len = strlen(argv);

sprintf(one_line, "s", argv

i = sscanf(one_line, "s s s s s ",amp;pname[0],amp;namein[0],amp;para2[0],amp;para3[0],amp;para4[0]);

/// == =========

p>

t0 = 0;

dt = 0,02;

draw_nt=6;

NN = 1000; = (float *) malloc(NN * sizeof(float));

for (i=0;ilt;NN;i) yt[i] = sin(t0 dt*i);

y_min=y_max=yt[0];

for (i=0; ilt; NN; i){

if (yt[i] lt; y_min) y_min=yt[i];

if (yt[i] gt; y_max) y_max=yt[i];

};

y_ran = y_max - y_min;

ry = 150.0 / y_ran;

para (i=0; ilt; NN; i ) yt[i]= yt[i] - y_min;

y_shift = 180;

draw_max = y_max;

draw_min = y_min;

(void) set_n_scale_y(amp; draw_n, draw_min, draw_max, amp;draw_yu, amp;draw_yd, amp;draw_dy);

if (DEBUG == 1){

sprintf(str, "yd=f yu=f dy=f y_max =f y_min=f n=d", draw_yd, draw_yu, draw_dy, y_max, y_min, draw_n);

OnDisplayMessage(str);

};

(void) set_n_scale_x(draw_nt, t0, t0 dt*(NN), draw_td, draw_tu, draw_dt);

if (DEBUG == 1){

sprintf(str, " td=f tu=f dt=f n=d", draw_td, draw_tu, draw_dt, draw_nt);

OnDisplayMessage(str);

} ;

rx = 900.0 / (draw_tu - draw_td);

if(!InitWindowsClass(hInstance))

return FALSE;

if(!InitWindows(hInstance, nCmdShow) ))

return FALSE;

ShowWindow(hWndMain, nCmdShow);

UpdateWindow(hWndMain);

while(GetMessage(amp ; Mensaje, NULL, 0, 0))

{

TranslateMessage(amp; Msg);

DispatchMessage(amp; Msg);

}

devuelve Msg.wParam

}

LLAMADA DE RESULTADO WndProc(HWND hwnd, mensaje UINT, WPARAM wParam, LPARAM lParam)

{

nXChar largo estático, nYChar;

HDC hdc;

x corta

TEXTMETRIC tm;

PAINTSTRUCT ps

COLORREF

fuente HFONT;

HPEN hP1; // bolígrafo

// CPoint aP, mousePos

int i; (mensaje)

{

caso WM_LBUTTONDOWN:

bt_scale_1 = bt_scale_1 0.05

ry=ry*bt_scale_1;

y_shift = y_shift * bt_scale_1;

ShowWindow(hwnd, SW_HIDE);

ShowWindow(hwnd, SW_SHOW);

UpdateWindow(hwnd); /p>

devuelve 0;

caso WM_RBUTTONDOWN:

ry=ry/bt_scale_1

y_shift = y_shift / bt_scale_1; p> ShowWindow(hwnd, SW_HIDE);

ShowWindow(hwnd, SW_SHOW);

UpdateWindow(hwnd);

devuelve 0; p> caso WM_CREATE:

ScrollWindow(hwnd, 0, -800, NULL, NULL);

hdc=GetDC(hwnd);

GetTextMetrics(hdc , amplificador; tm);

nXChar=tm.tmAveCharWidth;

nYChar=tm.tmHeight

ReleaseDC(hwnd, hdc);

devolver 0;

caso WM_PAINT:

hdc=BeginPaint(hwnd, amp; ps); // comenzar a pintar

SetWindowExtEx(hdc, 1200 , 800, NULL);

SetViewportExtEx(hdc, 1200, 800*bt_scale_1, NULL);

SetViewportOrgEx(hdc, 100, 150, NULL); > // dibujar cuadrículas

color=RGB(0, 128, 128);

hP1=CreatePen(PS_SOLID, 0, color);

SelectObject( hdc, hP1);

Mover aE

x(hdc, 0, y_shift-(draw_yu-y_min)*ry, NULL);

LineTo(hdc, 900, y_shift-(draw_yu-y_min)*ry);

LineTo(hdc, 900, y_shift-(draw_yd-y_min)*ry);

LineTo(hdc, 0, y_shift-(draw_yd-y_min)*ry);

LineTo( hdc, 0, y_shift-(draw_yu-y_min)*ry);

for (i=0; ilt; =draw_n; i)

{

MoveToEx( hdc, 0, y_shift-(draw_yd -y_min i* draw_dy)*ry, NULL

LineTo( hdc, 900, y_shift-(draw_yd -y_min i * draw_dy)*ry ); /p>

}

for (i=1; ilt; draw_nt; i ) {

MoveToEx( hdc, 900 * i /draw_nt, y_shift-(draw_yd -y_min )*ry, NULL );

LineTo( hdc, 900 * i /draw_nt, y_shift-(draw_yu -y_min)*ry

}

// dibuja la curva

color=RGB(255, 0, 0);

hP1=CreatePen(PS_SOLID, 0, color

SelectObject(hdc); , hP1);

MoveToEx( hdc, (t0-draw_td)* rx, y_shift-yt[0]*ry,

for (i=1; ilt; NN; i){

LineTo(hdc, (t0 i*dt-draw_td)*rx, y_shift-yt[i]*ry

}

<); p>font=CreateFont(

24, 10, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,

CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, NULL, "mifuente"

);

SelectObject(hdc, fuente);

GetTextMetrics(hdc, amp; tm);

nYChar=tm.tmHeight); ;

color=RGB(0,0,0);

para (i=0;ilt;=draw_n;i)

{

sprintf(one_line, ".2f", draw_yd i * draw_dy

TextOut(hdc, -60, y_shift-(draw_yd-y_min i* draw_dy)*ry-5, one_line);

, strlen(one_line));

}

for (i=0; ilt; =draw_nt; i )

{

sprintf(one_line, ".1f", draw_td i * draw_dt);

TextOut(hdc, 900 * i /draw_nt-30, y_shift-(draw_yd -y_min)*ry 20, one_line, strlen(one_line) ));

}

sprintf(one_line, "s N=d", nombre en, NN

TextOut(hdc, 20, y_shift-(); draw_yu-y_min )*ry-40, one_line, strlen(one_line));

EndPaint(hwnd, amp; ps); // finalizar pintura

return 0L; >

caso WM_DESTROY:

PostQuitMessage(0);

devuelve 0

predeterminado:

devuelve DefWindowProc(hwnd, mensaje, wParam, lParam);

}

}

BOOL InitWindowsClass(HINSTANCE hInstance)

{

WNDCLASS wndclass;

wndclass.cbClsExtra=0;

wndclass.cbWndExtra=0;

wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);

wndclass.hCursor=LoadCursor(NULL, IDC_ARROW);

// wndclass.hIcon=LoadIcon(NULL, "END");

wndclass.hIcon= LoadIcon(hInstance, "uni03.ico");

wndclass.hInstance=hInstance;

wndclass.lpfnWndProc=WndProc

wndclass.lpszClassName="Windows Fill";

wndclass.lpszMenuName=NULL;

wndclass.style=CS_HREDRAW|CS_VREDRAW;

return(RegisterClass(amp;wndclass));

p>

}

BOOL InitWindows(HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd;

char str[ 100];

sprintf(

"Windows F);

enfermo",

str,

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

0,

CW_USEDEFAULT,

p>

0,

NULL,

NULL,

hInstancia,

NULL

) ;

if(!hWnd)

return FALSE;

hWndMain=hWnd;

ShowWindow(hWnd, nCmdShow);

p>

UpdateWindow(hWnd);

devuelve VERDADERO

}

void OnDisplayMessage(char *; str)

{

MessageBox(NULL, str, "msg", MB_OK | MB_ICONINFORMATION

}

void set_n_scale_y( int *ndiv, float ymin, float ymax, float *yu, float *yd, float *dy)

{

int n;

float yuu, ydd;

flotante año;

if (*ndiv lt; = 0) {n = 2;} else n = *ndiv;

año = ymax - ymin;

if (yr gt; = 0.0001 amp; yr lt; 0.001) {

yuu = (float) ((int) (ymax * 10000.0)) / 10000.0f 0.0001f;

ydd = (flotante) ((int) (ymin * 10000.0)) / 10000.0f - 0.0001f;

}

si no ( año gt; = 0,001 amperio; año lt; 0,01) {

yuu = (flotante) ((int) (ymax * 1000,0)) / 1000,0f 0,001f;

ydd = (float) ((int ) (ymin * 1000.0)) / 1000.0f - 0.001f;

}

else if (yr gt; = 0.01 amp; yr lt; 0.1) {

yuu = (flotante) ((int) (ymax * 100.0)) / 100.0f 0.01f;

ydd = (flotante) ((int) (ymin * 100.0)) / 100.0f - 0.01f;

}

else if ( año gt; = 0.1 amp; año lt; 1.0) {

yuu = (flotante) ( (int) (ymax * 10.0)) / 10.0f 0.1f

ydd = (flotante) ((int) (ymin * 10.0)) /

10.0f - 0.1f;

}

else if ( año gt; = 1.0 amp; año lt; 10.0) {

yuu = (flotador) ( (int) (ymax)) 1.0f;

ydd = (flotante) ((int) (ymin)) - 1.0f

}

else; if ( año gt; = 10.0 amp; año lt; 100.0) {

yuu = (float) ((int) (ymax * 0.1)) / 0.1f 10.0f; ydd = (flotante) ((int) (ymin * 0.1)) / 0.1f - 10.0f;

}

else if (yr gt; = 100.0 amp ;amp; año lt; 1000.0) {

yuu = (flotante) ((int) (ymax * 0.01)) / 0.01f 100.0f;

ydd = (flotante) ( (int) ( ymin * 0.01)) / 0.01f - 100.0f;

}

else if (año gt; = 1000.0 amp; año lt; 10000.0) {

yuu = (flotante) ((int) (ymax * 0.001)) / 0.001f 1000.0f;

ydd = (flotante) ((int) (ymin * 0.001)) / 0.001f - 1000.0f;

}

else if (yr gt; = 10000.0 amp; yr lt; 100000.0) {

yuu = (float ) ((int) (ymax * 0,0001)) / 0,0001f 10000,0f;

ydd = (flotante) ((int) (ymin * 0,0001)) / 0,0001f - 10000,0f; p>

yuu = ymax; ydd = ymin;

};

if (yuu == ydd) {

yuu = ydd * 1.1f ;

ydd = ydd * 0.9f;

};

*yu = yuu; *yd = ydd;

*dy = (yuu - ydd) / n;

if (*dy gt; 1.0) *dy = (float) ((int) *dy );

*ndiv = (yuu - ydd)/ (*dy);

}

void set_n_scale_x(int ​​​​*ndiv, float t0, float te, float *td, float *tu, float *draw_dt )

{

int i;

int n;

doble tr,dt,d

si (*

ndiv lt; = 0) {n = 6;} else n = *ndiv;

tr = (doble) (te - t0); n;

if (dt gt; = 1.0){d = (doble) ((int) (dt 0.9));}

else { d = dt;};

i = (int)( (doble) t0 / d);

if (t0 lt; 0) i=i-1;

// if ( (flotar)(d * i) lt; t0) i = i 1;

*td = (flotar) (d * i); ((te - *td) / d);

if ( *ndiv * d lt; (te - *td) ) *ndiv= *ndiv 1;

*tu = *td *ndiv * d;

*draw_dt = (flotante) d;

}