Разработка клиент-серверного приложения. Алгоритм круговой интерполяции. Реализация алгоритма интерполяции в виде клиент-серверного приложения, страница 2

case -1:

cerr << "Server: receive message error!" << endl;

break;

// Принят пульс //

case 0:

break;

// Обычное сообщение //

default:

if (msg.header.type==_IO_CONNECT) {

MsgReply( rcv_id, EOK, NULL, 0);

} else {

MsgProc();

}

break;

}

}

return EXIT_SUCCESS;

}

// Процедура обработки сообщений //

void MsgProc( ) {

vector<PointT> pointArr;

int X1,Y1,                    // Начальная точка

X0,Y0,                // Центр дуги

R,                            // Радиус дуги

alpha,               // Угол поворота

clockWise,            // Направление, по часовой, против часовой

step;                 // Шаг

X1 = msg.clientMsg.startPoint.X;

Y1 = msg.clientMsg.startPoint.Y;

X0 = msg.clientMsg.centerPoint.X;

Y0 = msg.clientMsg.centerPoint.Y;

alpha = msg.clientMsg.angle;

clockWise = msg.clientMsg.clockwise;

step = msg.clientMsg.step;

// Вычисление радиуса дуги //

double Rtemp = sqrt((double)((X1-X0)*(X1-X0)+(Y1-Y0)*(Y1-Y0)));

R = (int)floor(Rtemp);

if (Rtemp-R>0.5)      ++R;

int Y, X;

X = X1-X0;

Y = Y1-Y0;

PointT tempPoint;

while (1)

{

// Вычисление очередной точки //

tempPoint = nextPoint( X,Y,R,step,clockWise );

X=tempPoint.X; Y=tempPoint.Y;

tempPoint.X += X0; tempPoint.Y += Y0;

// Помещаем очередную точку в буфер //

pointArr.push_back(tempPoint);

// Проверка поворота на нужный угол //

bool check = sqrt((double)((X+X0-X1)*(X+X0-X1)+(Y+Y0-Y1)*(Y+Y0-Y1)))/(2*R) > sin(((double)alpha)*acos(-1.0)/360);

if (check)     break;

}

msg.serverMsg.lenVector = pointArr.size();

for (size_t i=0; i<pointArr.size(); ++i) {

msg.serverMsg.resultVector[i] = pointArr.at(i);

}

// Отправляем ответ серверу //

if (MsgReply( rcv_id, EOK, &msg, sizeof(msg) ) == -1) {

cerr << "Server: reply message error!" << endl;

}

}

// Вычисление следующей точки //

PointT nextPoint( int X, int Y, int R, int step, int clockWise )

{

PointT tempPoint;

if (clockWise != 0)   tempPoint = nextPointClockwise( X,Y,R,step );

else                          tempPoint = nextPointAntiClockwise( X,Y,R,step );

return tempPoint;

}

// Круговая интерполяция по часовой стрелке //

PointT nextPointClockwise( int X, int Y, int R, int step ) {

// Вычисление оценочной функции //

int F=X*X+Y*Y-R*R;

// Вычисление следующей точки в зависимость от координатной четверти //

if (X>0 && Y>0) {

if (F<=0) {

X=X+step;

} else {

Y=Y-step;

}

}

else if (X>0 && Y<=0) {

if (F>0) {

X=X-step;

} else {

Y=Y-step;

}

}

else if (X<=0 && Y<=0) {

if (F<=0) {

X=X-step;

} else {

Y=Y+step;

}

}

else if (X<=0 && Y>0) {

if (F>0) {

X=X+step;

} else {

Y=Y+step;

}

}

PointT point = {X,Y};

return point;

}

// Круговая интерполяция против часовой стрелки //

PointT nextPointAntiClockwise( int X, int Y, int R, int step ) {

// Вычисление оценочной функции //

int F=X*X+Y*Y-R*R;

// Вычисление следующей точки в зависимость от координатной четверти //

if (X>0 && Y>0) {

if (F>0) {

X=X-step;

} else {

Y=Y+step;

}

}

else if (X>0 && Y<=0) {

if (F<=0) {

X=X+step;

} else {

Y=Y+step;

}

}

else if (X<=0 && Y<=0) {

if (F>0) {

X=X+step;

} else {

Y=Y-step;

}

}

else if (X<=0 && Y>0) {

if (F<=0) {

X=X-step;

} else {

Y=Y-step;

}

}

PointT point = {X,Y};

return point;

}

Программа-клиент. 

Листинг 2.1.3. Основной файл программы CircularInterpolation_Client.cc.

#include <cstdlib>

#include <iostream>

#include <fstream>

#include <unistd.h>

#include <sys/dispatch.h>

using namespace std;

#include "msgdefs.h"