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"
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.