Расчет плоских ферм и арок. Расчетная схема фермы с принятой нумерацией узлов и стержней, страница 9

  // Первая строка

  k[0][0]=koef*c2;   k[0][1]=koef*sc;   k[0][2]=-koef*c2;     k[0][3]=-koef*sc;

  // Вторая строка

  k[1][0]=koef*sc;   k[1][1]=koef*s2;   k[1][2]=-koef*sc;     k[1][3]=-koef*s2;

  // Третья строка

  k[2][0]=-koef*c2;     k[2][1]=-koef*sc;     k[2][2]=koef*c2;   k[2][3]=koef*sc;

  // Четвертая строка

  k[3][0]=-koef*sc;     k[3][1]=-koef*s2;     k[3][2]=koef*sc;   k[3][3]=koef*s2;

}

// Функция заполнения глобальной матрицы жесткости фермы

void CRod::FillGlobalMatrix(double **MatrixA)

{

  long place1 = node1*2, place2 = node2*2;

  // Первая строка

  MatrixA[place1][place1] += k[0][0];

  MatrixA[place1][place1+1] += k[0][1];

  MatrixA[place1][place2] += k[0][2];

  MatrixA[place1][place2+1] += k[0][3];

  // Вторая строка

  MatrixA[place1+1][place1] += k[1][0];

  MatrixA[place1+1][place1+1] += k[1][1];

  MatrixA[place1+1][place2] += k[1][2];

  MatrixA[place1+1][place2+1] += k[1][3];

  // Третья строка

  MatrixA[place2][place1] += k[2][0];

  MatrixA[place2][place1+1] += k[2][1];

  MatrixA[place2][place2] += k[2][2];

  MatrixA[place2][place2+1] += k[2][3];

  // Четвертая строка

  MatrixA[place2+1][place1] += k[3][0];

  MatrixA[place2+1][place1+1] += k[3][1];

  MatrixA[place2+1][place2] += k[3][2];

  MatrixA[place2+1][place2+1] += k[3][3];

}

// Функция вычисления продольной силы в стержне по координатам узлов и их

// перемещениям

void CRod::CalcForce(double x1, double y1, double x2, double y2)

{

// Переменные: новая длина, новый угол наклона к оси 0Х, модуль разности

// между старым и новым углом наклона, проекция расстояния между узлами

// стержня после деформирования фермы на ось стержня до деформации (чтобы

// определить и учесть только его удлинение), линейные продольные деформации

  double new_lk, new_omega, delta_omega, projection_lk, deform;

// Новая длина

  new_lk = (node[ node2 ].x+x2-(node[ node1 ].x+x1))*

(node[ node2 ].x+x2-(node[ node1 ].x+x1));

  new_lk += (node[ node2 ].y+y2-(node[ node1 ].y+y1))*

(node[ node2 ].y+y2-(node[ node1 ].y+y1));

new_lk = sqrt( new_lk );

// Новый угол наклона

  new_omega = atan2( double(node[ node2 ].y+y2-(node[ node1 ].y+y1)),

double(node[ node2 ].x+x2-(node[ node1 ].x+x1)) );

// Угол отклонения от первоначального положения после деформации

  delta_omega = fabs(omega - new_omega);

// Проекция на собственную ось до деформации

  projection_lk = new_lk*cos(delta_omega);

// Линейная продольная деформация стержня

  deform = (projection_lk-lk)/lk;

// Продольное усилие

  N = deform*E*Ak;

}

Файл Force.cpp - реализация класса внешней силы

#include "stdafx.h"

// Подключение файла заголовка класса внешних сил

#include "Force.h"

// Конструктор и деструктор класса CForce

CForce::CForce()

{

}

CForce::~CForce()

{

}

// Функция назначения величин внешних сил по оси 0Х и 0Y

void CForce::SetValue(double xValue, double yValue)

{

  x = xValue;

  y = yValue;

}

// Функция заполнения матрицы внешних сил всей фермы

void CForce::FillForceMatrix(double *MatrixB, long node)

{

// Заполнение начинается со строки с номером place

  long place = 2*node;

  MatrixB[ place ] = x;

  MatrixB[ place+1 ] = y;

}

Файл Node.h - объявление класса узла

// В файлах заголовках лучше всего видны возможности того или иного класса.

// Здесь объявлены (кроме самого класса) все функции класса с передаваемыми им

// параметрами и все переменные класса

class CNode 

{

public:

  bool ThereIsConnection(long numberDisplacement);

  void SetConnection(bool xConnection, bool yConnection);

  void SetCoord(double xCoord, double yCoord);

  double x, y; // Координаты узла

  bool supX, supY; // Внешние связи (false-отсутствуют связь, true-есть связь)

  CNode();

  virtual ~CNode();

};

Файл Rod.h - объявление класса стержня

class CRod 

{

public:

  void CalcForce(double x1, double y1, double x2, double y2);

  void FillGlobalMatrix(double **MatrixA);

  void FillSelfMatrix();

  void GetAngle();

  void GetLength();

  void SetParam(double AkValue, double EValue);

  void SetNodesNumber(long node1Number, long node2Number);

  long node1, node2; // Номера узлов стержня

  double E, Ak, lk, omega, k[4][4], N;

  CRod();

  virtual ~CRod();

};

Файл Force.h - объявление класса внешней силы

class CForce