Графическое клиент-серверное приложение на примере интерполяции. Кусочно-линейная интерполяция

Страницы работы

15 страниц (Word-файл)

Содержание работы

Санкт-Петербургский Государственный Политехнический Университет

Факультет Технической Кибернетики

Кафедра Компьютерных Систем и Программных Технологий

Отчёт по операционной QNX

на тему : Графическое клиент-серверное приложение на примере интерполяции

Выполнил студент группы 4081/1

Санкт-Петербург

2010


Задание:

Создать клиен-серверное приложение, которое читает данные из файла, производит интерполяцию с заданным шагом и визуализирует результат.

- Сервер должен принимать сообщение от клиента, которое содержит шаг интерполяции и данные для интерполяции.

- Клиент читает данные из файла и посылает их серверу, принимает от сервера результат и строит график.

Теоретические данные

Кусочно-линейная интерполяция:

При таком способе интерполяции соседние точки соединяются прямыми. Формула интерполяционного полинома:

1. Описание приложения

Вид главного окна программы клиента представлен на рис.1.1.

Рис.1.1. Окно клиентской программы

Где,

Step – шаг интерполяции

Local/Global – локальный или глобальный канал

Load and Run – открывает файл с указанным названием, читает из него данные, формирует сообщение для клиента и отправляет его. После получения результата строит интерполяционный полином.

Код обработчика начатия на кнопку Load and Run приведён в Листинге 1.

Листинг 1.

Button1_Click.c

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

/* Local headers */

#include "ablibs.h"

#include "abimport.h"

#include "proto.h"

#include <sys/dispatch.h>

#define ATTACH_POINT "Inter_channel"

typedef struct _pulse msg_header_t;

typedef struct _my_data {

msg_header_t      hdr;

int                                     len, maxX, maxY;

double                          h, dataX[100], dataY[100];

} my_data_t;

my_data_t      msg, msg_reply;

int net_send();

char   str[] = "Hello World!!!",

*file_name, buf[40];

int                   bpointx = 119, bpointy = 35,

epointx, epointy, dx, dy,h, i, k;

int

Button1_Click( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ){

double scalex, scaley;

/* eliminate 'unreferenced' warnings */

widget = widget, apinfo = apinfo, cbinfo = cbinfo;

PtGetResource(ABW_Text, Pt_ARG_TEXT_STRING,&file_name, 0 );

buf[0] = '\0';

epointx = bpointx + 361 -2;

epointy = bpointy + 385 -4;

switch( net_send() ){

case 1:

PtSetResource(ABW_Label1, Pt_ARG_TEXT_STRING, "Not find File", 0 );

strcat(buf, "\"" );

strcat(buf, file_name );

strcat(buf, "\"" );

PtSetResource(ABW_Label2, Pt_ARG_TEXT_STRING, buf, 0 );

return( Pt_CONTINUE );

case 2:

PtSetResource(ABW_Label1, Pt_ARG_TEXT_STRING, "Not Attach to", 0 );

PtSetResource(ABW_Label2, Pt_ARG_TEXT_STRING, "    channel ", 0 );

return( Pt_CONTINUE );

}

PtSetResource(ABW_Label1, Pt_ARG_TEXT_STRING, "Sucsessful Load", 0 );

PtSetResource(ABW_Label2, Pt_ARG_TEXT_STRING, " ", 0 );

scalex = (double)(epointx - bpointx)/(double)msg_reply.maxX;

scaley = (double)(epointy - bpointy)/(double)msg_reply.maxY;

itoa( msg_reply.maxX, buf, 10 );

PtSetResource(ABW_Xm, Pt_ARG_TEXT_STRING,buf, 0 );

itoa( msg_reply.maxY, buf, 10 );

PtSetResource(ABW_Ym, Pt_ARG_TEXT_STRING,buf, 0 );

PgSetStrokeColor( Pg_GREEN );

for(  i=0; i<msg_reply.len-1; i++ ){

PgDrawILine( bpointx+(int)(msg_reply.dataX[i]*scalex),epointy-(int)(msg_reply.dataY[i]*scaley),

bpointx+(int)(msg_reply.dataX[i+1]*scalex),epointy- (int)(msg_reply.dataY[i+1]*scaley ) );

}

dx = 10; dy = 10;

PgSetStrokeColor( Pg_BLACK );

for( i=1; i<dx; i++ ){

h =( epointx-bpointx )/ dx;

PgDrawILine( bpointx+h*i, bpointy,bpointx+h*i, epointy ); 

}

for( i=1; i<dy; i++ ){

h =( epointy-bpointy )/ dy;

PgDrawILine( bpointx, bpointy+h*i, epointx,bpointy+h*i ); 

}

return( Pt_CONTINUE );

}

// NET SEND -read and send message

int net_send(){

int                              fd, i;

FILE                          *p;

char *combo_text, *str_step;

if( (p = fopen( file_name, "r" )) == NULL ){

return 1;     

}

PtGetResource(ABW_Combo, Pt_ARG_TEXT_STRING,&combo_text, 0 );

if( !strcmp( combo_text, "Local") ){

if ((fd = name_open(ATTACH_POINT, 0)) == -1) {

return 2;

}

}else{

if ((fd = name_open(ATTACH_POINT, NAME_FLAG_ATTACH_GLOBAL)) == -1) {

fclose( p );

return 2;

}

msg.hdr.type = 0x00;

msg.hdr.subtype = 0x00;

fscanf( p, "%d %d %d", &msg.len, &msg.maxX, &msg.maxY );

PtGetResource( ABW_TextStep, Pt_ARG_TEXT_STRING,&str_step, 0 );

msg.h = atof( str_step );    

if( msg.h <= 0 && msg.h > 10 ){

fclose( p );

name_close( fd );

return 3;     

}

for( i=0; i<msg.len; i++ )

fscanf( p, "%lf %lf", &msg.dataX[i], &msg.dataY[i] );

MsgSend(fd, &msg, sizeof(msg), &msg_reply, sizeof(msg_reply) );

name_close( fd );

fclose( p );

return 0;

}

Код сервера приведён в Листинге 2:

Листинг 2.

Inter.c

#include <stdio.h>

#include <errno.h>

#include <stdlib.h>

#include <sys/dispatch.h>

#define ATTACH_POINT "Inter_channel"

typedef struct _pulse msg_header_t;

typedef struct _my_data {

msg_header_t      hdr;

int                                     len, maxX, maxY;

Похожие материалы

Информация о работе