¿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>
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>
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;
}