Определение количества витков резьбового соединения с трапецеидальной резьбой, воспринимающего осевую сжимающую нагрузку

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    356,42 Кб
  • Опубликовано:
    2016-01-19
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Определение количества витков резьбового соединения с трапецеидальной резьбой, воспринимающего осевую сжимающую нагрузку

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

ГОМЕЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ИМЕНИ П. О. СУХОГО

Факультет автоматизированных и информационных систем

Кафедра «Информационные технологии»








РАСЧЕТНО-ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовой работе

по дисциплине «Компьютерные системы конечно-элементных расчетов»

на тему: «Определение количества витков резьбового соединения с трапецеидальной резьбой воспринимающего осевую сжимающую нагрузку»

Исполнитель: Сусла Р.И.

Руководитель: преподаватель Курочка К.С.

Гомель 2014

Содержание

Введение

. Основные подходы к математическому моделированию физических систем

. Алгоритмический анализ задачи

.1 Постановка задачи, описание исходных и результирующих данных

.2 Описание математической модели

.3 Графическая схема алгоритма решения задачи

. Программная реализация

.1 Структура программного комплекса

.2 Инструкция пользователя

.3 Верификация

.4 Вычислительный эксперимент

Заключение

Список использованных источников

Приложение

Введение

Данная работа посвящена созданию математической модели физической системы, используя метод конечных элементов, с последующей ее программной реализацией.

Объектом исследования данной работы является применение метода конечных элементов к описанию математической модели физической системы.

Предметом исследования является применения метода конечных элементов, к решению задач механики деформируемого твёрдого тела.

Целью работы является изучение метода конечных элементов и исследование с его помощью резьбового соединения с трапецеидальной резьбой, воспринимающего осевое сжатие.

Таким образом, реализованное в данной работе программное обеспечение найдет свое практическое применение в таких отраслях промышленности как станкостроение, машиностроение и др.

1. Основные подходы к математическому моделированию физических систем

Существует множество подходов к математическому моделированию различных систем, наиболее распространенными являются:

.        Метод конечных разностей.

.        Метод граничных элементов.

.        Метод конечных элементов.

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

Метод конечных разностей

Достоинство метода в том, что он сводит решение краевой задачи для дифференциального уравнения к решению системы алгебраических уравнений относительно значений искомой функции на множестве точек. Достигается это путем замены производных дифференциального уравнения, конечно-разностными аппроксимациями. [1]

Метод конечных разностей использует дискретизацию дифференциальных уравнений на прямоугольные координатные сетки.

Конечно-разностные сетки

При использовании метода конечных разностей область S разбивается на участки, образуя сетку (Рисунок 1). Множество точек A, в котором расстояние между любыми двумя точками одинаково, называется равномерной координатной сеткой, а число расстояние между точками - шагом сетки.

Область можно разбить на множество частей, вводя произвольные точки. Координатная сетка A будет иметь шаг, который зависит от номера узла. Если значение шага хотя бы для одного узла будет отличаться от значения шага соседнего узла, координатная сетка k называется неравномерной

Рисунок 1 - Координатные сетки: а - одномерная; б - двухмерная; в - трехмерная.

Функции сетки и конечные разности. Координатная сетка A для области S предполагает, что значения всех переменных и их производных рассматриваются только в узлах этой сетки (см. Рис. 1). С целью выполнения данного требования все переменные задачи заменяются сеточными функциями, а производные любого порядка - конечными разностями. [2]

Если для некоторой области задана сетка A = {(xi, yj, zk) | i = 0, 1, 2, …, n, j = 0, 1, 2, …, m, k = 0, 1, 2, …, l, x0 = 0, xn = s1, y0 = 0, ym = s2, z0 = 0, zl = s3}, то функцию ϕ = ϕ (xi, yj, zk), i = 0, 1, 2, …, n, j = 0, 1, 2, …, m, k = 0, 1, 2, …,L дискретного аргумента (xi, yj, zk) называют сеточной функцией, определенной на сетке A. Любой непрерывной функции f(х, у, z), заданной в области S, можно поставить в соответствие сеточную функцию ϕ(xi, yj, zk), заданную на сетке A.

ϕi,j,k=f(xi,yj,zk); (1)

ϕi,j,k=, (2)

где xi±1/2, yj±1/2, zk±1/2 .

; (3)

; (4)

; (5)

; (6)

; (7)

; (8)

Из определения производная функции непрерывного аргумента x в точке x0 это предел отношения приращения функции к приращению аргумента, когда последнее стремится к нулю

. (9)

Исключая предел из выражения (9), производную функции непрерывного аргумента f(x, y, z) аппроксимируют разностным выражением, заданным на соответствующей сеточной функции ϕ(xi, yj, zk). Аппроксимация осуществляется различными способами, например:

; (10)

; (11)

; (12)

Выражения (10)-(12) называют правыми разностями.

; (13)

; (14)

; (15)

Выражения (13)-(15) называют левыми разностями.

; (16)

; (17)

; (18)

Выражения (16)-(17) называют центральными разностями.

Взяв n-ую производную от полученных выражений, могут быть получены аппроксимирующие выражения для производных более высоких порядков. Недостатком являются большие затраты памяти и большое время расчета в случае, если необходимо хранить сетки больших размерностей.

Метод конечных элементов. Преимущества МКЭ: доступность и простота понимания, применимость для задач с произвольной формой области решения, возможность создания на основе метода высококачественного программного обеспечения. [3]

В МКЭ начальная область определения функции разбивается при помощи сетки, на отдельные подобласти - конечные элементы. Искомая непрерывная функция аппроксимируется дискретной, определенной на множестве конечных элементов. Этапы алгоритма МКЭ. Выделение конечных элементов. Важным этапом является разбиение области на элементы. От этого во многом зависит точность результатов.

Дискретизация области на элементы часто начинают от ее границы с целью более близкой аппроксимации формы границы, затем производится разбиение внутренних областей. Резкого изменения размеров конечных элементов на границах подобластей стараются избегать. На рисунке 2 приведен пример разбиения двухмерной области произвольной формы на треугольные конечные элементы с криволинейными границами.

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

Следующим этапом нумеруют узлы элементов. Порядок нумерации имеет в данном случае существенное значение, влияя на эффективность последующих вычислений.

Для нумерации узлов предпочтителен способ, обеспечивающий минимальную разность между номерами узлов в каждом отдельном элементе. Если максимальную разность между номерами узлов для отдельного элемента обозначить К, а число степеней свободы - М, ширина полосы:

L=(K+1)M (19)

Определение аппроксимирующей функции элементов. Ее выполняют один раз для типичного элемента области. Полученная функция используется далее для всех остальных элементов области того же типа. Впоследствии эти элементы применяются при решении разнообразных краевых задач. Аппроксимирующей функцией часто являются полиномы. В зависимости от его степени конечные элементы делятся на симплекс-, комплекс- и мультиплекс-элементы. Многочлены симплекс-элементов содержат константы и линейные члены; полиномы комплекс-элементов - константы, линейные члены, а также члены более высоких степеней. Полиномы мультиплекс-элементов также содержат члены более высоких степеней, но имеют дополнительные ограничения. [4]

Объединение конечных элементов в ансамбль. На этом этапе уравнения, относящиеся к отдельным элементам, объединяются в ансамбль, т. е. в систему алгебраических уравнений:

 (20)

Система (20) является моделью искомой непрерывной функции.

Определение вектора узловых значений функций

В общем случае вектор Ф в (5) вначале неизвестен. Его определение - наиболее сложная процедура в МКЭ.

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

Найденные значения вектора Ф подставляют в (20), после чего значение функции  легко вычисляется в любой точке заданной области.

Метод граничных элементов. Решая краевые задачи, можно строить модель технических объектов на основе интегральных уравнений. Необходимо перейти от дифференциальных уравнений в частных производных к эквивалентным интегральным уравнениям. Если такой переход успешен, решение исходной задачи может быть получено с малыми вычислительными затратами и высокой степенью точности. Размерность исходной задачи уменьшается на 1.

Переход от исходного дифференциального уравнения интегральному. Рассмотрим на простом примере алгоритм перехода. В двухмерной однородной области произвольной формы с коэффициентом проницаемости k требуется найти распределение функции , описанной уравнением

 (21)

Уравнение (21) является частным случаем квазигармонического уравнения  (1.1) при .

На границе L области заданы граничные условия первого рода

(22)

Нахождение сингулярного решения. МГЭ использует то свойство, что для большинства уравнений в частных производных существуют фундаментальные решения. Для рассматриваемой задачи фундаментальные решение записывается в виде

(23)

где  - значение искомой функции в произвольной точке области;  - единичное возмущающее воздействие, приложенное в точке .

Начала координат для систем х и  совпадают. Величина  определяется, в свою очередь уравнением

,

где  и  выбрано так, что G=0 при . Уравнение (23) определяет искомую функцию  относительно нулевого значения при

Введение фиктивных источников. Область G1 размещается в бесконечной области, для которой известно решение (23). Значения  на границе области должны совпадать c заданным граничным условием (22). Для этого, на границе вводятся фиктивные источники неизвестной интенсивности  на единицу длины границы L. В результате получаем искомое решение:

 (24)

Постоянная С, обеспечивает единственное решение. Далее С будет подбираться так, чтобы суммарное «испускание» от всех источников обращалось в ноль на бесконечно удаленной границе. Для удовлетворения заданных граничных условии необходимо, чтобы выполнялось равенство

 (25)

На основании равенства (25) базируется система интегральных уравнений относительно неизвестных фиктивных источников .

Разбиение границы рассматриваемой области.

Для приближенного решения (25) границы рассматриваемой области дискретизируют. Для простейшего случая граница заменяется линейными элементами. Отдельный элемент определяется координатой своей средней точки. Интенсивность неизвестных источников  в пределах элемента принимается постоянной. Выражение (25) запишется в виде [5]

(26)

где  - координата средней точки q-го граничного элемента.

Уравнение (26) определяет значение функции в средней точке q-го граничного элемента. В матричной форме (26) принимает вид

(27)

где  - длина q-го граничного элемента; р(е) - вектор-столбец размерности N;  - вектор-строка аналогичного размера.

При этом каждый элемент вектора-строки определяется по формуле

(28)

С учетом (28) уравнение (27) перепишется так:


Составляя такие же уравнения для каждого граничного элемента и суммируя по всем элементам, получают систему алгебраических уравнении


где  и р - N-мерные векторы; I - единичный N-мерный вектор-столбец;  - матрица коэффициентов размерности NхN.

Т. о., алгоритм МГЭ состоит из следующих этапов:

Этап 1. Формирование входных данных.

Этап 2. Интегрирование функций  для получения матрицы коэффициентов .

Этап 3. Составление разрешающей системы алгебраических уравнений.

Этап 4. Решение системы.

Этап 5. Подстановка найденных значений в интегральное уравнение и вычисление значений функций во внутренних точках области.

В данной работе мы выбрали метод конечных элементов, так как он довольно прост для программной реализации, и применим для широкого класса задач. Так как метод позволяет варьировать размеры элементов, сетку можно сделать реже в местах, где не нужна особая точность.

2. Алгоритмический анализ задачи

.1 Постановка задачи, описание исходных и результирующих данных

Требуется определить количество витков резьбового соединения с трапецеидальной резьбой воспринимающего осевую сжимающую нагрузку.

Исходными данными являются размеры деталей резьбового соединения, материалы деталей резьбового соединения (Деталь с наружной резьбой сталь, деталь с внутренней резьбой латунь), осевая сжимающая нагрузка.

Результирующими данными являются: количество витков, необходимое для восприятия осевой сжимающей нагрузки, а также вектор смещений узлов элементов. [5]

Для решения системы линейных алгебраических уравнений используется метод Гаусса-Зейделя.

.2 Описание математической модели

Поверхность разбивается на конечные элементы треугольного типа, и нумерацией узлов по часовой стрелке (Рисунок 1).

Рисунок 3 - Конечный элемент

Данный элемент, имеет три узла, пронумерованных по часовой стрелке. Каждый узел имеет две компоненты перемещения: по х, по у.


а шесть компонент перемещений элемента образуют вектор


Перемещения внутри элемента должны однозначно определяться этими шестью величинами.

Рисунок 4 - Перемещения узлов элемента

Простейшим представлением являются линейные полиномы

(30)

Значения шести постоянных ai легко найти из двух систем, состоящих из трех уравнений, которые получаются в результате подстановки в (30) узловых координат и приравнивания значения перемещений соответствующим перемещениям узловых точек. Записав, например,


выражают a1, a2, a3 через величины узловых перемещений ui, uj, um и окончательно

                                                                                                                                                 



                         (32)

остальные коэффициенты получаются циклической перестановкой индексов i, j, m, а величина  определяется соотношением


Аналогично можно представить перемещение v в вертикальном направлении


Соотношения (31) и (32) в стандартной форме определяют перемещения любой точки внутри элемента


где I - единичная матрица размерности 2x2,  - координатные функции, которые называются функциями формы


Для каждого из элементов плоскости существуют матрицы, определяющие его поведение.

Матрица [E] - матрица механических характеристик.

Ее вид:






где G - модуль упругости материала, а µ- коэффициент Пуассона.

Матрица [Q] - матрица дифференциальных операторов.

Ее вид: .

Матрица [A] - матрица неизвестных при коэффициентах.

Ее вид:


где x1, y1 - координаты 1-го узла элемента;

x2, y2 - координаты 2-го узла элемента;

x3, y3 - координаты 3-го узла элемента.

Зная эти матрицы для элемента i, для него составляется матрица жесткости по формуле:

ki=,

Где dx,dy - стороны треугольника

Далее, зная для каждого элемента локальную матрицу жесткости, находится глобальная матрица жесткости.

K=

Определяется вектор нагрузки R. Для плоской задачи для i-ого узла нагрузку можно задать в двух направлениях: по x и по y.

,

Где  - компонента вектора нагрузок для i-ого узла, определяющая давление, прикладываемое к узлу по оси абсцисс.

 - компонента вектора нагрузок для i-ого узла, определяющая давление, прикладываемое к узлу по оси ординат.

Далее необходимо задать граничные условия.

Для закрепленных узлов в матрице [K] необходимо сбросить значения в строках и столбцах, а на главной диагонали для них приравнять к 1.

Далее необходимо составить глобальный вектор нагрузок, который будет состоять из компонент нагрузок для каждого узла.

.

Далее необходимо составить систему уравнений.


Или, если переписать в матричной форме

[K]{u}={R},

Где [К] - глобальная матрица жесткости. В данной системе элементы глобальной матрицы жесткости являются коэффициентами при неизвестных;

{u} - вектор столбец искомых значений.

{R} - Глобальный вектор столбец нагрузок. В данной системе элементы вектора выступают в роли свободных членов уравнения.

Решая данную систему, получают смещения узлов. Вектор {u} будет иметь вид:

 {δ}=,

где ui, vi - смещения узла относительно первоначального положения.

Для решения поставленной задачи вводится условие (33), при неудовлетворении которого, выводится результат.

 (33)

Где k - число витков;

P - шаг резьбы;

L - длина конца болта;

 - достаточная точность;

dli - длина абсолютного смещения i-ого узла элемента, принадлежащего болту, определяемая по формуле (34).

dli=,

где ui, vi -смещения узла по оси абсцисс и ординат, которые берутся из вектора {δ}.[6]

Рисунок 5 - Абсолютное смещение

.3 Графическая схема алгоритма решения задачи

Рисунок 6 - Графическая схема алгоритма решения задачи

3. Программная реализация

.1 Структура программного комплекса

Структура программного комплекса включает 6 пользовательских классов: Rezba, Uzl_Coord, matrAclass, matrKLOCclass, globindexes, GausMethod. Их элементы описаны в таблицах 3.1.1-3.1.6

Таблица 3.1.1 - Элементы класса Rezba

Имя

Вид элемента

Тип

Спецификатор

Описание

D

Поле

double

Static, Public

Диаметр шляпки

b

Поле

double

Static, Public

Ширина шляпки

l

Поле

double

Static, Public

Длина конца болта

d1

Поле

double

Static, Public

Внешний диаметр резьбы

d2

Поле

double

Static, Public

Средний диаметр резьбы

d3

Поле

double

Static, Public

Внутренний диаметр резьбы

bg

 Поле

double

Static, Public

Ширина гайки

p

 Поле

double

Static, Public

Шаг резьбы

H

Поле

double

Static, Public

Рабочая высота

Count_v

Поле

int

Static, Public

Количество витков

eps

Поле

double

Static, Public

Точность


Таблица 3.1.2 - Элементы класса Uzl_Coord

Имя

Вид элемента

Тип

Спецификатор

Описание

x1

Поле

double

 Public

Координата первого узла элемента по х

x2

Поле

double

 Public

Координата второго узла элемента по х

x3

Поле

double

 Public

Координата третьего узла элемента по х

y1

Поле

double

 Public

Координата первого узла элемента по у

Имя

Вид элемента

Тип

Спецификатор

Описание

y2

Поле

double

 Public

Координата второго узла элемента по у

y3

Поле

double

 Public

Координата третьего узла элемента по у

c

 Поле

Color

 Public

Цвет (в качестве материала)



Таблица 3.1.3 - Элементы класса matrAclass

Имя

Вид элемента

Тип

Спецификатор

Описание

A

Поле

double

Public

Матрица А для элемента


Таблица 3.1.4 - Элементы класса matrKLOCclass

Имя

Вид элемента

Тип

Спецификатор

Описание

K

Поле

double

Public

Матрица К локальная матрица жесткости


Таблица 3.1.5 - Элементы класса matrKLOCclass

Имя

Вид элемента

Тип

Спецификатор

Описание

ind

Поле

Public

Матрица глобальных индексов элемента


Таблица 3.1.6 - Элементы класса GausMethod

Имя

Вид элемента

Тип

Спецификатор

Описание

RowCount

Поле

int

Public

Строк в матрице

ColumnCount

Поле

int

Public

Столбцов в матрице

Matrix

Поле

double

Public

Матрица неизвестных при коэффициентах

RightPart

Поле

double

Public

Вектор свободных членов

Answer

Поле

double

Public

Вектор неизвестных


Программа состоит из следующих форм:

Form1 - главная форма программы (рисунок 7);

Form2 - форма для графического изображения элементов (рисунок 8).

Таблица 3.1.3- Таблица управляющих элементов формы Form1

Имя элемента

Тип элемента

Назначение

Button1

Button

Кнопка вызова расчетов.

Button2

Button

Кнопка открытия Form2 с исходными данными.

Button3

Button

Кнопка открытия Form2 с полученными данными.

TextBox1

TextBox

Поле для ввода толщины головки болта.

TextBox2

TextBox

Поле для ввода диаметра головки болта.

TextBox3

TextBox

Поле для ввода ширины гайки.

TextBox4

TextBox

Поле для ввода длины конца болта.

TextBox5

TextBox

Поле для ввода внешнего диаметра резьбы.

TextBox6

TextBox

Поле для ввода шага резьбы.

TextBox7

TextBox

Поле для ввода точности.

TextBox8

TextBox

Поле для ввода нагрузки.

Label1

Label

Для вывода комментария.

Label2

Label

Для вывода комментария.

Label3

Label

Для вывода комментария.

Label4

Label

Для вывода комментария.

Label5

Label

Для вывода комментария.

Label6

Label

Для вывода комментария.

Label7

Label

Для вывода комментария.

Label8

Label

Для вывода комментария.


Рисунок 7 - Скриншот главной формы программы

Рисунок 8 - Скриншот форма для графического изображения элементов

3.2 Инструкция пользователя


Данная программа производит подсчет количества витков для резьбового соединения, с трапецеидальной резьбой, воспринимающего осевую нагрузку с заданными размерами и материалами элеметов резьбового соединения.

Для запуска программы следует запустить файл WindowsFormApplication1\bin\Debug\WindowsFormsApplication1.exe или WindowsFormsApplication1.sln (если установлен Microsoft Visual C#2008 или выше) и в запустившейся программе нажать функциональную клавишу F5.

В появившемся окне ввести необходимые размеры деталей, точность и нагрузку. Нагрузку можно задать 2-умя способами:

.        Задать нагрузку с боков гайки (Рисунок 9).

Рисунок 9 - Задание нагрузки с боков гайки

2.      Задать нагрузку фронтально (Рисунок 10).

Рисунок 10 - Задание нагрузки фронтально

Затем можно начать вычисления, нажав на кнопку «Вычислить».

В случае если длины болта хватило, то будет выведено сообщение с ответом:

«Расчет закончен. Для восприятия нагрузки болт должен иметь N витков.»

Где N - искомое число витков.

Иначе, будет выведено сообщение: «Длина болта слишком мала. Что бы болт мог выдержать нагрузку измените размеры болта.»

В случае если число витков найдено - появятся две кнопки «Исходная резьба» и «Резьба после деформации» (Рисунок 11).

Рисунок 11 - Кнопки, появившиеся после успешного завершения расчетов

По нажатию на одну из этих кнопок появится форма, по нажатию на которую, появится изображение резьбы.

математический трапецеидальный верификация пользователь

3.3 Верификация

Для проверки соответствия полученных в программе данных использовался конечно-элементный пакет ANSYS.

Алгоритм проведения верификации в данной работе следующий:

.        Нанесение сетки в программе.

.        Расчет смещений узлов вследствие приложения нагрузки.

.        Перенос координат узлов в ANSYS.

.        Создание модели в ANSYS по найденным точкам.

.        Решение полученной модели (Рисунок 12).

.        Вывод результатов в файл.

.        Визуализация полученных данных.

.        Сравнение.

Рисунок 12 - Решение полученной модели в ANSYS

.4 Вычислительный эксперимент

Для эксперимента возьмем следующие данные:

Параметр

Значение

Ширина шляпки

1

Диаметр шляпки

10

Длина конца болта

10

Диаметр резьбы

6

Шаг резьбы

1

Толщина гайки

5

Точность

1

Нагрузка

100



Рисунок 13 - Заполнение исходных данных

Далее необходимо нажать кнопку «Вычислить».

После завершения расчетов выводится ответ (Рисунок 14).

Рисунок 14 - Ответ

Резьба после деформации будет выглядеть, как показано на рисунках 15, 16.

 

Рисунок 15 - Резьба после деформации при нагрузке заданной фронтально

Рисунок 16 - Резьба после деформации при нагрузке заданной с боков

Визуализация в программе, считывающей решение из ANSYS, и представляя их графически (Рисунок 17).

Рисунок 16 - Резьба после деформации при нагрузке заданной фронтально, реализация в ANSYS.

Заключение

В ходе выполнения курсовой работы были получены необходимые теоретические знания о методах математического моделирования, возможностях их реализации в программах.

В результате выполнения курсовой работы была построена математическая модель резьбового соединения, с трапецеидальной резьбой, а так же разработана программа, выполняющая вычисление количества витков необходимого для восприятия осевой сжимающей нагрузки.

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

Данный метод является универсальным для большого типа задач.

На базе метода конечных элементов создано много конечно-элементных пакетов, таких как ANSYS, ABAQUS, Impact и т.д.

Список использованных источников

1.      Введение в метод конечных элементов, Норри Д., Фриз Ж. - 74 с.

.        Зенкевич О. - Метод конечных элементов в технике. -17 c.

.        Теория метода конечных элементов, Стренг Г., Фикс Дж. -90 c.

.        Турчак Л.И. П.В. Плотников. - Основы численных методов. -52 с.

.        С.Ф. Клованич. - Метод конечных элементов в нелинейных задачах инженерной механики. -9,10 с.

.        А. О. Шимановский, А. В. Путято. - Применение метода конечных элементов в решении задач прикладной механики. -66 с.

Приложение. Текст программы

Form1.cs

using System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Text;System.Windows.Forms;System.Threading;System.IO;WindowsFormsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

//

}

void Form1_DoubleClick(object sender, EventArgs e)

{

int n=coord_do.Count;

int []mass=new int[coord_do.Count];

StreamWriter stream_wr = new StreamWriter("variables.txt",false);

stream_wr.WriteLine("/PREP7");

string str = "";

for (int i = 0; i < n; i++)

{

if (coord_do[i].c != Color.Black)

{

if (mass[listGI[i].ind[0]] == 0)

{

stream_wr.Write("K," + (listGI[i].ind[0] + 1) + ",");

str = coord_do[i].x1.ToString();

stream_wr.Write("" + str.Replace(",", ".") + ",");

str = coord_do[i].y1.ToString();

stream_wr.WriteLine("" + str.Replace(",", ".") + ",,");

mass[listGI[i].ind[0]] = 1;

}

if (mass[listGI[i].ind[1]] == 0)

{

stream_wr.Write("K," + (listGI[i].ind[1] + 1) + ",");

str = coord_do[i].x2.ToString();

stream_wr.Write("" + str.Replace(",", ".") + ",");

str = coord_do[i].y2.ToString();

stream_wr.WriteLine("" + str.Replace(",", ".") + ",,");

mass[listGI[i].ind[1]] = 1;

}

if (mass[listGI[i].ind[2]] == 0)

{

stream_wr.Write("K," + (listGI[i].ind[2] + 1) + ",");

str = coord_do[i].x3.ToString();

stream_wr.Write("" + str.Replace(",", ".") + ",");

str = coord_do[i].y3.ToString();

stream_wr.WriteLine("" + str.Replace(",", ".") + ",,");

mass[listGI[i].ind[2]] = 1;

}

}

}

stream_wr.WriteLine("FINISH");

stream_wr.Close();

MessageBox.Show("Координаты узлов записаны в файл.");

}

#region AznamenA(double x1, double x2, double x3, double y1, double y2, double y3)

{

return x1 * y2 - x2 * y1 - x1 * y3 + x3 * y1 + x2 * y3 - x3 * y2;

}

double elemA(double e1, double e2, double e3, double e4, double zn)

{

return (e1 * e2 + e3 * e4) / zn;

}

double[,] matrA(double x1, double x2, double x3, double y1, double y2, double y3)

{

double[,] matr = new double[6, 6];

double znamenatel = znamenA(x1, x2, x3, y1, y2, y3);

matr[0, 0] = elemA(x2, y3, (-1) * x3, y2, znamenatel);

matr[0, 1] = elemA(1, y2, (-1), y3, znamenatel);

matr[0, 2] = -elemA(x2, 1, (-1) * x3, 1, znamenatel);

matr[1, 3] = matr[0, 0];

matr[1, 4] = matr[0, 1];

matr[1, 5] = matr[0, 2];

matr[2, 0] = -elemA(x1, y3, (-1) * x3, y1, znamenatel);

matr[2, 1] = -elemA(1, y1, (-1), y3, znamenatel);

matr[2, 2] = elemA(x1, 1, (-1) * x3, 1, znamenatel);

matr[3, 3] = matr[2, 0];

matr[3, 4] = matr[2, 1];

matr[3, 5] = matr[2, 2];

matr[4, 0] = elemA(x1, y2, (-1) * x2, y1, znamenatel);

matr[4, 1] = elemA(1, y1, (-1), y2, znamenatel);

matr[4, 2] = -elemA(x1, 1, (-1) * x2, 1, znamenatel);

matr[5, 3] = matr[4, 0];

matr[5, 4] = matr[4, 1];

matr[5, 5] = matr[4, 2];

return matr;

}

#endregion

#region Edouble[,] matrE(double muy, double G)

{

double[,] E = new double[3, 3];

double c = G / (1 - muy * muy);

E[0, 0] = c;

E[0, 1] = muy * c;

E[1, 1] = c;

E[1, 0] = muy * c;

E[2, 2] = (1 - muy) * c / 2;

return E;

}

#endregion

#region Qdouble[,] matrQ()

{

double[,] Q = new double[3, 6];

Q[0, 1] = 1;

Q[1, 5] = 1;

Q[2, 2] = 1;

Q[2, 4] = 1;

return Q;

}

#endregion

#region Multiplication[,] Multiplication(double[,] a, double[,] b)

{

if (a.GetLength(1) != b.GetLength(0)) throw new Exception("Матрицы нельзя перемножить");

double[,] r = new double[a.GetLength(0), b.GetLength(1)];

for (int i = 0; i < a.GetLength(0); i++)

{

for (int j = 0; j < b.GetLength(1); j++)

{

for (int k = 0; k < b.GetLength(0); k++)

{

r[i, j] += a[i, k] * b[k, j];

}

}

}

return r;

}

#endregion

static bool Conver(double[] xx, double[] xp, double epsi)

{

for (int i = 0; i < xx.Length; i++)

if (Math.Abs(xx[i] - xp[i]) >= epsi) return false;

return true;

}

static void MethodGZ(double[,] A, double[] b, ref double[] x, double eps)

{

double[] p = new double[b.Length];

double var = 0;

do

{

for (int i = 0; i < b.Length; i++)

{

var = 0;

for (int j = 0; j < b.Length; j++)

{

if (i != j) var += A[i, j] * x[j];

}

p[i] = x[i];

Console.WriteLine("" + x[0] + " " + x[1] + " " + x[2]);

Console.ReadKey();

x[i] = (b[i] - var) / A[i, i];

}

}

while (!Conver(x, p, eps));

}

private void button1_Click(object sender, EventArgs e)

{

this.DoubleClick-= new EventHandler(Form1_DoubleClick);

list_coord.Clear();

listAt.Clear();

Rezba.b = double.Parse(textBox1.Text);

Rezba.D = double.Parse(textBox2.Text);

Rezba.l = double.Parse(textBox4.Text);

Rezba.d1 = double.Parse(textBox5.Text);

Rezba.p = double.Parse(textBox6.Text);

Rezba.bg = double.Parse(textBox3.Text);

Rezba.eps = double.Parse(textBox7.Text);

//Rezba.lg = int.Parse(textBox8.Text);

Rezba.H = Rezba.p / 2;

Rezba.d3 = Rezba.d1 - Rezba.p;

Rezba.d2 = Rezba.d1 - Rezba.H;

this.DoubleClick += new EventHandler(Form1_DoubleClick);

}

List<Uzl_Coord> coord_do = new List<Uzl_Coord>();

List<Uzl_Coord> list_coord = new List<Uzl_Coord>();

List<Uzl_Coord> list_coord_invert = new List<Uzl_Coord>();

List<Uzl_Coord> list_coord_rez = new List<Uzl_Coord>();

List<matrAclass> listAt = new List<matrAclass>();

List<matrKLOCclass> listKLOC = new List<matrKLOCclass>();

List<globindexes> listGI = new List<globindexes>();

List<globindexes> listGIBuf = new List<globindexes>();

Uzl_Coord vozvr_uzl(double x1, double x2, double x3, double y1, double y2, double y3)

{

Uzl_Coord p=new Uzl_Coord();

p.x1 = x1;

p.x2 = x2;

p.x3 = x3;

p.y1 = y1;

p.y2 = y2;

p.y3 = y3;

return p;

}

private double max(double[] m)

{

double max = 0;

double x=0, y=0;

for (int i = 0; i < listGI.Count;i++ )

{

if (list_coord_rez[i].c == Color.Gray)

{

if (max < Math.Sqrt(m[listGI[i].ind[0] * 2] * m[listGI[i].ind[0] * 2] + m[listGI[i].ind[0] * 2+1] * m[listGI[i].ind[0] * 2+1]))

{

max = Math.Sqrt(m[listGI[i].ind[0] * 2] * m[listGI[i].ind[0] * 2] + m[listGI[i].ind[0] * 2 + 1] * m[listGI[i].ind[0] * 2 + 1]);

x = m[listGI[i].ind[0] * 2]; y = m[listGI[i].ind[0] * 2+1];

}

if (max < Math.Sqrt(m[listGI[i].ind[1] * 2] * m[listGI[i].ind[1] * 2] + m[listGI[i].ind[1] * 2 + 1] * m[listGI[i].ind[1] * 2 + 1]))

{

max = Math.Sqrt(m[listGI[i].ind[1] * 2] * m[listGI[i].ind[1] * 2] + m[listGI[i].ind[1] * 2 + 1] * m[listGI[i].ind[1] * 2 + 1]);

x = m[listGI[i].ind[1] * 2]; y = m[listGI[i].ind[1] * 2 + 1];

}

if (max < Math.Sqrt(m[listGI[i].ind[2] * 2] * m[listGI[i].ind[2] * 2] + m[listGI[i].ind[2] * 2 + 1] * m[listGI[i].ind[2] * 2 + 1]))

{

max = Math.Sqrt(m[listGI[i].ind[2] * 2] * m[listGI[i].ind[2] * 2] + m[listGI[i].ind[2] * 2 + 1] * m[listGI[i].ind[2] * 2 + 1]);

x = m[listGI[i].ind[2] * 2]; y = m[listGI[i].ind[2] * 2 + 1];

}

}

}

return max;

}

private double max2(double[] m)

{

double max = 0;

double x = 0, y = 0;

for (int i = 0; i < listGI.Count; i++)

{

if (list_coord_rez[i].c != Color.Black)

{

if (max < Math.Sqrt(m[listGI[i].ind[0] * 2] * m[listGI[i].ind[0] * 2] + m[listGI[i].ind[0] * 2 + 1] * m[listGI[i].ind[0] * 2 + 1]))

{

max = Math.Sqrt(m[listGI[i].ind[0] * 2] * m[listGI[i].ind[0] * 2] + m[listGI[i].ind[0] * 2 + 1] * m[listGI[i].ind[0] * 2 + 1]);

x = m[listGI[i].ind[0] * 2]; y = m[listGI[i].ind[0] * 2 + 1];

}

if (max < Math.Sqrt(m[listGI[i].ind[1] * 2] * m[listGI[i].ind[1] * 2] + m[listGI[i].ind[1] * 2 + 1] * m[listGI[i].ind[1] * 2 + 1]))

{

max = Math.Sqrt(m[listGI[i].ind[1] * 2] * m[listGI[i].ind[1] * 2] + m[listGI[i].ind[1] * 2 + 1] * m[listGI[i].ind[1] * 2 + 1]);

x = m[listGI[i].ind[1] * 2]; y = m[listGI[i].ind[1] * 2 + 1];

}

if (max < Math.Sqrt(m[listGI[i].ind[2] * 2] * m[listGI[i].ind[2] * 2] + m[listGI[i].ind[2] * 2 + 1] * m[listGI[i].ind[2] * 2 + 1]))

{

max = Math.Sqrt(m[listGI[i].ind[2] * 2] * m[listGI[i].ind[2] * 2] + m[listGI[i].ind[2] * 2 + 1] * m[listGI[i].ind[2] * 2 + 1]);

x = m[listGI[i].ind[2] * 2]; y = m[listGI[i].ind[2] * 2 + 1];

}

}

}

return max;

}

private double max_in_all(double[] m)

{

double max = 0;

double x = 0, y = 0;

for (int i = 0; i < listGI.Count; i++)

{

if (list_coord_rez[i].c != Color.Black)

{

if (Math.Abs(x) < Math.Abs(m[listGI[i].ind[0] * 2]))

{

x = m[listGI[i].ind[0] * 2];

}

if (Math.Abs(x) <Math.Abs(m[listGI[i].ind[1] * 2]))

{

x = m[listGI[i].ind[1] * 2];

}

if (Math.Abs(x) <Math.Abs(m[listGI[i].ind[2] * 2]))

{

x = m[listGI[i].ind[2] * 2];

}

if (Math.Abs(y) <Math.Abs( m[listGI[i].ind[0] * 2 + 1]))

{

y = m[listGI[i].ind[0] * 2 + 1];

}

if (Math.Abs(y) <Math.Abs( m[listGI[i].ind[1] * 2 + 1]))

{

y = m[listGI[i].ind[1] * 2 + 1];

}

if (Math.Abs(y) < Math.Abs(m[listGI[i].ind[2] * 2 + 1]))

{

y = m[listGI[i].ind[2] * 2 + 1];

}

}

}

return max;

}

private void find_coord()

{

double sm =double.MaxValue;

Rezba.count_v=1;

GausMethod Solution = new GausMethod(1); ;

while(sm>Rezba.eps&& Rezba.count_v*Rezba.p<Rezba.l)

{

coord_do.Clear();

list_coord.Clear();

list_coord_invert.Clear();

list_coord_rez.Clear();

listAt.Clear();

listGI.Clear();

listGIBuf.Clear();

listKLOC.Clear();<int> uzk = new List<int>();

uzk.Clear();

double[,] A = new double[6, 6];

double[,] E = new double[3, 3];

double dy1 = Rezba.d3 / 2;

double dy2 = Rezba.H;

double dy3 = (Rezba.D - Rezba.d3) / 2 - dy2;

double dy4 = (Rezba.bg - dy2 - dy3) / 5;

double dx1 = Rezba.b;

double dx2 = (Rezba.l - Rezba.p * Rezba.count_v) / 10;

double dx3 = Rezba.H * Math.Sin(15 * Math.PI / 180) / Math.Sin(75 * Math.PI / 180);

double dx4 = (Rezba.p - 2 * dx3) / 2;

double dx5 = Rezba.p - dx4;

double[,] Q= matrQ();

Form3 fff;

double x1 = 0, x2, x3 = 0, y1 = 0, y2, y3 = 0;

double dx, dy;

int k = 0;

int flag = 0;

int line = 0;

#region фигура вращения

#region 1c_in1 = 0;

if (line == 0)

{

Color c = Color.Gray;

x1 = 0;

dx = dx1;

dy = dy1;

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx; y3 = y2;

Uzl_Coord p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c;

list_coord.Add(p); //uzpor.Insert(0,p);

x2 = x1 + dx; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c;

list_coord.Add(p); //uzpor.Insert(0, p);

x1 = x1 + dx;

c_in1++; c_in1++;

dx = dx2;

flag = 0;

while (flag < 10)

{

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c;

list_coord.Add(p); //uzpor.Insert(0, p);

x2 = x1 + dx; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c;

list_coord.Add(p);// uzpor.Insert(0, p);

flag++;

x1 = x1 + dx;

c_in1++;

}

flag = 0;

k = Rezba.count_v * 2;

dx = dx4;

int fl = 0;

while (flag < k)

{

if(fl==0)

{

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx5; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c;

list_coord.Add(p); //uzpor.Insert(0, p);

x2 = x1 + dx5; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c;

list_coord.Add(p); //uzpor.Insert(0, p);

flag++;

x1 = x1 + dx5;

fl = 1;

c_in1++;

}

else

{

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx4; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c;

list_coord.Add(p); //uzpor.Insert(0, p);

x2 = x1 + dx4; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c;

list_coord.Add(p); //uzpor.Insert(0, p);

flag++;

x1 = x1 + dx4;

fl = 0;

c_in1++;

}

}

line++;

}

uzk.Add(c_in1);

#endregion

#region Нумерация узлов для первого ряда элементов

globindexes gi1;

globindexes gi2;

int ind = 0;

for (int i = 0; i < c_in1-1; i++)

{

gi1 = new globindexes();

gi2 = new globindexes();

gi1.ind = new int[3];

gi2.ind = new int[3];

gi1.ind[0] = ind;

gi2.ind[1] = ind + c_in1+1;

gi1.ind[1] = ind + c_in1;

gi2.ind[2] = ind + 1;

gi1.ind[2] = ind + c_in1+1;

gi2.ind[0] = ind;

listGI.Add(gi1);

listGI.Add(gi2);

ind++;

}

ind++;

#endregion

#region 2

int c_in2 = 0;

if (line == 1)

{

Color c1=Color.Gray;

Color c2 = Color.Black;

Color c3 = Color.Red;

y1 = dy1;

x1 = 0;

dx = dx1;

dy = dy2;

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx; y3 = y2;

Uzl_Coord p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c1;

list_coord.Add(p); //uzpor.Insert(jer, p);

x2 = x1 + dx; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c1;

list_coord.Add(p);// uzpor.Insert(jer, p);

x1 = x1 + dx;

c_in2++;

c_in2++;

dx = dx2;

flag = 0;

while (flag < 10)

{

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c2;

list_coord.Add(p);// uzpor.Insert(jer, p);

x2 = x1 + dx; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c2;

list_coord.Add(p);// uzpor.Insert(jer, p);

flag++;

x1 = x1 + dx;

c_in2++;

}

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx3; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p);// uzpor.Insert(jer, p);

flag = 0;

k = Rezba.count_v * 2;

dx = dx4;

int fl = 0;

while (flag < k-1)

{

if (fl == 0)

{

x2 = x1+dx3; y2 = y1 + dy;

x3 = x2 + dx4; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c1;

list_coord.Add(p);// uzpor.Insert(jer, p);

x2 = x1 + dx4+dx3; y2 = y1 + dy;

x3 = x1+dx5; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c1;

list_coord.Add(p); //uzpor.Insert(jer, p);

flag++;

x1 = x1 + dx5;

fl = 1;

c_in2++;

}

else

{

x2 = x1-dx3; y2 = y1 + dy;

x3 = x2 + dx5; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p); //uzpor.Insert(jer, p);

x2 = x1 + dx4+dx3; y2 = y1 + dy;

x3 = x1+dx4; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p); //uzpor.Insert(jer, p);

flag++;

x1 = x1 + dx4;

fl = 0;

}

}

x2 = x1 - dx3; y2 = y1 + dy;

x3 = x2 + dx4+dx3; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p); //uzpor.Insert(jer, p);

x2 = x1 + dx4; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p);// uzpor.Insert(jer, p);

line++;

c_in2++;

}

uzk.Add(c_in2);

#endregion

#region Нумерация узлов для второго ряда элементов

for (int i = 0; i < c_in1; i++)

{

if (i < 11)

{

gi1 = new globindexes();

gi2 = new globindexes();

gi1.ind = new int[3];

gi2.ind = new int[3];

gi1.ind[0] = ind;

gi2.ind[1] = ind + c_in1 + 1;

gi1.ind[1] = ind + c_in1;

gi2.ind[2] = ind + 1;

gi1.ind[2] = ind + c_in1 + 1;

gi2.ind[0] = ind;

listGI.Add(gi1);

listGI.Add(gi2);

ind++;

}

else

{

if (i == 11)

{

gi1 = new globindexes();

gi1.ind = new int[3];

gi1.ind[0] = ind;

gi1.ind[1] = ind + c_in1;

gi1.ind[2] = ind + c_in1 + 1;

listGI.Add(gi1);

}

else

{

gi1 = new globindexes();

gi2 = new globindexes();

gi1.ind = new int[3];

gi2.ind = new int[3];

gi1.ind[0] = ind;

gi2.ind[1] = ind + c_in1 + 1+1;

gi1.ind[1] = ind + c_in1+1;

gi2.ind[2] = ind + 1;

gi1.ind[2] = ind + c_in1 +1+ 1;

gi2.ind[0] = ind;

listGI.Add(gi1);

listGI.Add(gi2);

ind++;

}

}

}

ind++;

#endregion

#region 3

int c_in3 = 0;

if (line == 2)

{

Color c1 = Color.Gray;

Color c2 = Color.Black;

Color c3 = Color.Red;

y1 = dy1+dy2;

x1 = 0;

dx = dx1;

dy = dy3;

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx; y3 = y2;

Uzl_Coord p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c1;

list_coord.Add(p);// uzpor.Insert(jer, p);

x2 = x1 + dx; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c1;

list_coord.Add(p);// uzpor.Insert(jer, p);

x1 = x1 + dx;

c_in3++;

c_in3++;

dx = dx2;

flag = 0;

while (flag < 10)

{

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c2;

list_coord.Add(p); //uzpor.Insert(jer, p);

x2 = x1 + dx; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c2;

list_coord.Add(p); //uzpor.Insert(jer, p);

flag++;

x1 = x1 + dx;

c_in3++;

}

dx = dx3;

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p); //uzpor.Insert(jer, p);

x2 = x1 + dx; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p); //uzpor.Insert(jer, p);

c_in3++;

x1 = x1 + dx;

int fl = 0;

flag = 0;

while (flag < k - 1)

{

if (fl == 0)

{

dx = dx4;

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p); //uzpor.Insert(jer, p);

x2 = x1 + dx; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p); //uzpor.Insert(jer, p);

flag++;

x1 = x1 + dx;

fl = 1;

c_in3++;

}

else

{

dx = dx5;

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p); //uzpor.Insert(jer, p);

x2 = x1 + dx; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p); //uzpor.Insert(jer, p);

flag++;

c_in3++;

x1 = x1 + dx;

fl = 0;

}

}

x2 = x1; y2 = y1 + dy;

x3 = x2 + dx4 + dx3; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p); //uzpor.Insert(jer, p);

x2 = x1 + dx4+dx3; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p); //uzpor.Insert(jer, p);

line++;

c_in3++;

}

uzk.Add(c_in3);

#endregion

#region Нумерация узлов для третьего ряда элементов

for (int i = 0; i < c_in3 - 1; i++)

{

gi1 = new globindexes();

gi2 = new globindexes();

gi1.ind = new int[3];

gi2.ind = new int[3];

gi1.ind[0] = ind;

gi2.ind[1] = ind + c_in3 + 1;

gi1.ind[1] = ind + c_in3;

gi2.ind[2] = ind + 1;

gi1.ind[2] = ind + c_in3 + 1;

gi2.ind[0] = ind;

listGI.Add(gi1);

listGI.Add(gi2);

ind++;

}

ind++;

#endregion

#region 4

if (line == 3)

{

// int jer = uzpor.Count - 1;

Color c2 = Color.Black;

Color c3 = Color.Red;

y1 = dy1 + dy2+dy3;

while(y1<Rezba.d3/2+Rezba.bg)

{

x1 = 0;

dx = dx1;

dy = dy4;

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx; y3 = y2;

Uzl_Coord p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c2;

list_coord.Add(p); //uzpor.Insert(jer, p);

x2 = x1 + dx; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c2;

list_coord.Add(p); //uzpor.Insert(jer, p);

x1 = x1 + dx;

dx = dx2;

flag = 0;

while (flag < 10)

{

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c2;

list_coord.Add(p); //uzpor.Insert(jer, p);

x2 = x1 + dx; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();= vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c2;

list_coord.Add(p); //uzpor.Insert(jer, p);

flag++;

x1 = x1 + dx;

}

dx = dx3;

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p); //uzpor.Insert(jer, p);

x2 = x1 + dx; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p); //uzpor.Insert(jer, p);

x1 = x1 + dx;

int fl = 0;

flag = 0;

while (flag < k - 1)

{

if (fl == 0)

{

dx = dx4;

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p); //uzpor.Insert(jer, p);

x2 = x1 + dx; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();= vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p); //uzpor.Insert(jer, p);

flag++;

x1 = x1 + dx;

fl = 1;

}

else

{

dx = dx5;

x2 = x1; y2 = y1 + dy;

x3 = x1 + dx; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p);// uzpor.Insert(jer, p);

x2 = x1 + dx; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();= vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p);// uzpor.Insert(jer, p);

flag++;= x1 + dx;

fl = 0;

}

}

x2 = x1; y2 = y1 + dy;

x3 = x2 + dx4 + dx3; y3 = y2;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p);// uzpor.Insert(jer, p);

x2 = x1 + dx4 + dx3; y2 = y1 + dy;

x3 = x2; y3 = y1;

p = new Uzl_Coord();

p = vozvr_uzl(x1, x2, x3, y1, y2, y3);

p.c = c3;

list_coord.Add(p);// uzpor.Insert(jer, p);

line++;

y1 = y1 + dy;

uzk.Add(c_in3);

#region Нумерация узлов для четвертого ряда элементов

for (int i = 0; i < c_in3 - 1; i++)

{

gi1 = new globindexes();

gi2 = new globindexes();

gi1.ind = new int[3];

gi2.ind = new int[3];

gi1.ind[0] = ind;

gi2.ind[1] = ind + c_in3 + 1;

gi1.ind[1] = ind + c_in3;

gi2.ind[2] = ind + 1;

gi1.ind[2] = ind + c_in3 + 1;

gi2.ind[0] = ind;

listGI.Add(gi1);

listGI.Add(gi2);

ind++;

}

ind++;

#endregion

}

}

uzk.Add(c_in3);

#endregion

#endregion

#region Нахождение числа узлов

int alluzk=0;

int keykey = 0;

int len=uzk.Count;

for (int i = 1;i<len ; i++)

{

uzk.Insert(0,uzk[i+keykey]);

keykey++;

}

for (int i = 0; i < uzk.Count; i++)

{ alluzk += uzk[i]; }

#endregion

#region Получение результирующей фигуры из фигуры вращения

List<Uzl_Coord> list_new = new List<Uzl_Coord>();

List<int> uz_in_row = new List<int>();

double y;

//int ind;

int kk=0;

int ind_for_list=0;

list_coord_rez = new List<Uzl_Coord>();

while(kk < list_coord.Count)

{

ind_for_list = 0;

y = list_coord[kk].y1;

ind = list_new.Count;

while (kk < list_coord.Count && y.Equals(list_coord[kk].y1))

{

list_new.Insert(ind, list_coord[kk]);

kk++;

}

}

for (int i = 0; i < list_coord.Count; i++)

{

Uzl_Coord elm = new Uzl_Coord();

elm.x1 = list_new[i].x1;

elm.x2 = list_new[i].x3;

elm.x3 = list_new[i].x2;

elm.y1 = (-1) * list_new[i].y1;

elm.y2 = (-1) * list_new[i].y3;

elm.y3 = (-1) * list_new[i].y2;

elm.c = list_new[i].c;

list_coord_invert.Add(elm);

}

for (int i = list_coord.Count-1; i >=0; i--)

{

Uzl_Coord elm = new Uzl_Coord();

elm.x1 = list_coord_invert[i].x1;

elm.x2 = list_coord_invert[i].x2;

elm.x3 = list_coord_invert[i].x3;

elm.y1 = list_coord[list_coord.Count - 1].y2 + list_coord_invert[i].y1;

elm.y2 = list_coord[list_coord.Count - 1].y2 + list_coord_invert[i].y2;

elm.y3 = list_coord[list_coord.Count - 1].y2 + list_coord_invert[i].y3;

elm.c = list_coord_invert[i].c;

list_coord_rez.Add(elm);

}

ind = 0;

int kkk=0;

while (uzk[kkk + 1] != c_in1)

{

for (int i = 0; i < uzk[kkk] - 1; i++)

{

gi1 = new globindexes();

gi2 = new globindexes();

gi1.ind = new int[3];

gi2.ind = new int[3];

gi1.ind[0] = ind + uzk[kkk + 1];

gi2.ind[0] = ind + uzk[kkk + 1];

gi1.ind[1] = ind + 1;

gi2.ind[1] = ind + uzk[kkk + 1]+1;

gi1.ind[2] = ind;

gi2.ind[2] = ind + 1;.Add(gi1);

listGIBuf.Add(gi2);

ind++;

}

ind++;

kkk++;

}

for (int i = 0; i < uzk[kkk]-1; i++)

{

if (i < 11)

{

gi1 = new globindexes();

gi2 = new globindexes();

gi1.ind = new int[3];

gi2.ind = new int[3];

gi1.ind[0] = ind + uzk[kkk ];

gi2.ind[0] = ind + uzk[kkk ];

gi1.ind[1] = ind + 1;

gi2.ind[1] = ind + uzk[kkk ] + 1;

gi1.ind[2] = ind;

gi2.ind[2] = ind + 1;

listGIBuf.Add(gi1);

listGIBuf.Add(gi2);

ind++;

}

else

{

if (i == 11)

{

gi1 = new globindexes();

gi1.ind = new int[3];

gi1.ind[0] = ind + uzk[kkk ];

gi1.ind[1] = ind + 1;

gi1.ind[2] = ind;

listGIBuf.Add(gi1);

ind++;

}

else

{

gi1 = new globindexes();

gi2 = new globindexes();

gi1.ind = new int[3];

gi2.ind = new int[3];

gi1.ind[0] = ind + uzk[kkk ]-1;

gi2.ind[0] = ind + uzk[kkk ]-1;

gi1.ind[1] = ind + 1;

gi2.ind[1] = ind + uzk[kkk ];

gi1.ind[2] = ind;

gi2.ind[2] = ind + 1;

listGIBuf.Add(gi1);

listGIBuf.Add(gi2);

ind++;

}

}

}

ind++;

kkk++;

for (int i = 0; i < uzk[kkk] - 1; i++)

{

gi1 = new globindexes();

gi2 = new globindexes();

gi1.ind = new int[3];

gi2.ind = new int[3];

gi1.ind[0] = ind + uzk[kkk ];

gi2.ind[0] = ind + uzk[kkk ];

gi1.ind[1] = ind + 1;

gi2.ind[1] = ind + uzk[kkk ] + 1;

gi1.ind[2] = ind;

gi2.ind[2] = ind + 1;

listGIBuf.Add(gi1);

listGIBuf.Add(gi2);

ind++;

}

for (int i = 0; i < list_coord.Count; i++)

{

Uzl_Coord elm = new Uzl_Coord();

elm.x1 = list_coord[i].x1;

elm.x2 = list_coord[i].x2;

elm.x3 = list_coord[i].x3;

elm.y1 = list_coord[list_coord.Count - 1].y2 + list_coord[i].y1;

elm.y2 = list_coord[list_coord.Count - 1].y2 + list_coord[i].y2;

elm.y3 = list_coord[list_coord.Count - 1].y2 + list_coord[i].y3;

elm.c = list_coord[i].c;

list_coord_rez.Add(elm);

}

for (int i = 0; i < listGI.Count; i++)

{

listGI[i].ind[0] += ind + 1;

listGI[i].ind[1] += ind + 1;

listGI[i].ind[2] += ind + 1;

}

for (int i = 0; i < listGIBuf.Count; i++)

{

listGI.Insert(i,listGIBuf[i]);

}

kk = 0;

bool g = true;

#endregion

#region Копирование координат в новый список, для последующего вывода

foreach (Uzl_Coord u in list_coord_rez)

{

Uzl_Coord p = new Uzl_Coord();

p.c = u.c;

p.x1 = u.x1;

p.x2 = u.x2;

p.x3 = u.x3;

p.y1 = u.y1;

p.y2 = u.y2;

p.y3 = u.y3;

coord_do.Add(p);

}

#endregion

#region Матрицы А

for (int i = 0; i < list_coord_rez.Count; i++)

{

matrAclass p = new matrAclass();

p.A = matrA(list_coord_rez[i].x1, list_coord_rez[i].x2, list_coord_rez[i].x3, list_coord_rez[i].y1, list_coord_rez[i].y2, list_coord_rez[i].y3);

listAt.Add(p);

}

#endregion

#region Локальная матрица жесткости

double[,] Qt = new double[6, 3];

Qt[1, 0] = 1;

Qt[5, 1] = 1;

Qt[2, 2] = 1;

Qt[4, 2] = 1;

listKLOC.Clear();

double EB=21000, EG=9500, EP=0.01;

for (int t = 0; t < listAt.Count; t++)

{

matrKLOCclass d = new matrKLOCclass();

if (list_coord_rez[t].c == Color.Red)

E = matrE(0.35, EG);

else

if(list_coord_rez[t].c==Color.Gray)

E = matrE(0.28, EB);

else

E = matrE(0.01, EP);[,] AtQt = Multiplication(listAt[t].A, Qt);

double[,] EQ = Multiplication(E, Q);

double[,] AtQEQ = Multiplication(AtQt, EQ);

for (int i = 0; i < 6; i++)

for (int j = 0; j < 6; j++)

A[i, j] = listAt[t].A[j, i];

if (list_coord_rez[t].x1.Equals(list_coord_rez[t].x2))

{ dx = Math.Abs(list_coord_rez[t].x3 - list_coord_rez[t].x1); }

else

{ dx = Math.Abs(list_coord_rez[t].x2 - list_coord_rez[t].x1); }

if (list_coord_rez[t].y1.Equals(list_coord_rez[t].y2))

{ dy = Math.Abs(list_coord_rez[t].y3 - list_coord_rez[t].y1); }

else

{ dy = Math.Abs(list_coord_rez[t].y2 - list_coord_rez[t].y1); }

d.K = Multiplication(AtQEQ, A);

for (int i = 0; i < 6; i++)

{

for (int j = 0; j < 6; j++)

{

d.K[i, j] = d.K[i, j] * (dx * dy / 2);

}

}.Add(d);

#endregion

#region Заполнение глобальной матрицы жесткости

double[,] KGlob = new double[2 * (alluzk), 2 * (alluzk)];

int key = 0;

key = 0;

while (key < listKLOC.Count)

{

for (int ii = 0; ii < 3; ii++)

for (int jj = 0; jj < 3; jj++)

{

for (int iii = 0; iii < 2; iii++)

for (int jjj = 0; jjj < 2; jjj++)

KGlob[2 * listGI[key].ind[ii] + iii, 2 * listGI[key].ind[jj] + jjj] += listKLOC[key].K[2 * ii + iii, 2 * jj + jjj];

}

key++;

}

List<globindexes> gli = new List<globindexes>();

s = "";

for (int i = 0; i < list_coord_rez.Count; i++)

{

if (list_coord_rez[i].x1 == 0)

{ gli.Add(listGI[i]); }

}

#region Если вдруг понадобится закрепить только головку болта

/*int z=gli.Count;

while(gli.Count!=z-8)

gli.RemoveAt(0);

z = gli.Count;

while (gli.Count != z - 8)

gli.RemoveAt(gli.Count-1);*/

#endregion

#region Учет закрепленных узлов

for (int j = 0; j < gli.Count; j += 2)

for (int i = 0; i < 2 * (alluzk); i++)

{

KGlob[gli[j].ind[0]*2, i] = 0;

KGlob[gli[j].ind[0]*2 + 1, i] = 0;

KGlob[i, gli[j].ind[0]*2] = 0;

KGlob[i, gli[j].ind[0]*2 + 1] = 0;

}

for (int i = 0; i < 2 * (alluzk); i++)

{

KGlob[0, i] = 0;

KGlob[1, i] = 0;

KGlob[i, 0] = 0;

KGlob[i, 1] = 0;

KGlob[(alluzk-c_in3)*2, i] = 0;

KGlob[(alluzk - c_in3)*2+1, i] = 0;

KGlob[i, (alluzk - c_in3)*2] = 0;

KGlob[i, (alluzk - c_in3)*2+1] = 0;

}

KGlob[0, 0] = 1;

KGlob[1, 1] = 1;

KGlob[(alluzk - c_in3) * 2, (alluzk - c_in3) * 2] = 1;

KGlob[(alluzk - c_in3) * 2 + 1, (alluzk - c_in3) * 2 + 1] = 1;

for (int j = 0; j < gli.Count; j += 2)

{

KGlob[gli[j].ind[0]*2, gli[j].ind[0]*2] = 1;

KGlob[gli[j].ind[0]*2+ 1, gli[j].ind[0]*2 + 1] = 1;

}

#endregion

#endregion

double[] force = new double[2 * alluzk];

int[] mass = new int[coord_do.Count];

if (this.radioButton1.Checked)

{

#region Задание вектора нагрузки

int ind1 = 11;

int ind2 = alluzk - ind1 - 1;

#region Разбиение распределенной нагрузки на узлы гайки

double full_f = double.Parse(textBox9.Text);

double uz_f = full_f / ((c_in3 - 11) * 2);

for (int i = ind1; i < c_in3; i++)

{

force[2 * i] = -uz_f;

}

for (int i = ind2; i < alluzk; i++)

{

force[2 * i] = -uz_f;

}

#endregion

#endregion

}

else

{

#region Задание вектора нагрузки

double maxx = 0;

for (int i = 0; i < coord_do.Count; i++)

{

if (coord_do[i].c == Color.Red)

{

if (maxx < coord_do[i].x1)

{ maxx = coord_do[i].x1; }

if (maxx < coord_do[i].x2)

{ maxx = coord_do[i].x2; }

if (maxx < coord_do[i].x3)

{ maxx = coord_do[i].x3; }

}

}

int iii = 0;

double full_f = double.Parse(textBox9.Text);

double uz_f = full_f / 16;

for (int i = 0; i < coord_do.Count; i++)

{

if (coord_do[i].c == Color.Red)

{

if (Math.Abs(coord_do[i].x1 - maxx) < 0.001)

{

if (mass[listGI[i].ind[0]] == 0)

{

force[listGI[i].ind[0] * 2] = -uz_f;

mass[listGI[i].ind[0]] = 1;

iii++;

}

}

if (Math.Abs(coord_do[i].x2 - maxx) < 0.001)

{

if (mass[listGI[i].ind[1]] == 0)

{

force[listGI[i].ind[1] * 2] = -uz_f;

mass[listGI[i].ind[1]] = 1;

iii++;

}(Math.Abs(coord_do[i].x3 - maxx) < 0.001)

{

if (mass[listGI[i].ind[2]] == 0)

{

force[listGI[i].ind[2] * 2] = -uz_f;

mass[listGI[i].ind[2]] = 1;

iii++;

}

}

}

}

#endregion

}

#region Решение СЛАУ (нахождение перемещений узлов)

Solution = new GausMethod(2 * alluzk);

//заполняем правую часть

for (int i = 0; i < 2 * alluzk; i++)

Solution.RightPart[i] = force[i];

//заполняем матрицу

for (int i = 0; i < 2 * alluzk; i++)

for (int j = 0; j < 2 * alluzk; j++)

Solution.Matrix[i, j] = KGlob[i, j];

//решаем матрицу

Solution.SolveMatrix();

#endregion

#region Изменение координат узлов

for (int i = 0; i < list_coord_rez.Count; i++)

{

list_coord_rez[i].x1+=Solution.Answer[listGI[i].ind[0]*2];

list_coord_rez[i].y1 += Solution.Answer[listGI[i].ind[0] * 2+1];

list_coord_rez[i].x2 += Solution.Answer[listGI[i].ind[1] * 2];

list_coord_rez[i].y2 += Solution.Answer[listGI[i].ind[1] * 2 + 1];

list_coord_rez[i].x3 += Solution.Answer[listGI[i].ind[2] * 2];

list_coord_rez[i].y3 += Solution.Answer[listGI[i].ind[2] * 2 + 1];

}

#endregion

sm = max(Solution.Answer);

max_in_all(Solution.Answer);

max2(Solution.Answer);

 Rezba.count_v++;

}

if (sm > Rezba.eps)

{

MessageBox.Show("Длина болта слишком мала. Что бы болт мог выдержать нагрузку измените параметры.");

}

else

{

MessageBox.Show("Расчет закончен. Для воспринятия нагрузки болт должен иметь:" + (Rezba.count_v-1) + " витков.");

StreamWriter strw = new StreamWriter("smesch_x.txt",false);

for (int i = 0; i < coord_do.Count; i++)

if (coord_do[i].c != Color.Black)

{

strw.WriteLine("" + Solution.Answer[listGI[i].ind[0] * 2]);

strw.WriteLine("" + Solution.Answer[listGI[i].ind[1] * 2]);

strw.WriteLine("" + Solution.Answer[listGI[i].ind[2] * 2]);

}

strw.Close();

strw = new StreamWriter("smesch_y.txt", false);(int i = 0; i < coord_do.Count; i++)

if (coord_do[i].c != Color.Black)

{

strw.WriteLine("" + Solution.Answer[listGI[i].ind[0] * 2+1]);

strw.WriteLine("" + Solution.Answer[listGI[i].ind[1] * 2+1]);

strw.WriteLine("" + Solution.Answer[listGI[i].ind[2] * 2+1]);

}

strw.Close();

button3.Visible = true;

button2.Visible = true;

}

MessageBox.Show("Максимальное абсолютное откланение " + sm);

}void button2_Click(object sender, EventArgs e)

{

Form2 f = new Form2(coord_do, listGI);

f.ShowDialog();

}

private void button3_Click(object sender, EventArgs e)

{

Form2 form = new Form2(list_coord_rez, listGI);

form.ShowDialog();

}

private void Form1_Load(object sender, EventArgs e)

{

}

}

}

Form2.csSystem;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Threading;System.Text;System.Windows.Forms;WindowsFormsApplication1

{

public partial class Form2 : Form

{

List<Uzl_Coord> l = new List<Uzl_Coord>();

List<globindexes> u = new List<globindexes>();

double maxx = 0;

double maxy = 0;

double minx = double.MaxValue, miny = double.MaxValue;

int indminx = 0, indmaxx = 0, indminy = 0, indmaxy = 0;

public Form2(List<Uzl_Coord> lc,List<globindexes>uz)

{

InitializeComponent();

l = lc;

u = uz;(int i = 0; i < lc.Count; i++)

{

if (lc[i].c != Color.Black)

{

if (maxx < lc[i].x1)

{ maxx = lc[i].x1; indmaxx = i; }

if (maxx < lc[i].x2)

{ maxx = lc[i].x2; indmaxx = i; }

if (maxx < lc[i].x3)

{ maxx = lc[i].x3; indmaxx = i; }

if (maxy < lc[i].y1)

{ maxy = lc[i].y1; indmaxy = i; }

if (maxy < lc[i].y2)

{ maxy = lc[i].y2; indmaxy = i; }

if (maxy < lc[i].y3)

{ maxy = lc[i].y3; indmaxy = i; }

if (minx > lc[i].x1)

{ minx = lc[i].x1; indminx = i; }

if (minx > lc[i].x2)

{ minx = lc[i].x2; indminx = i; }

if (minx > lc[i].x3)

{ minx = lc[i].x3; indminx = i; }

if (miny > lc[i].y1)

{ miny = lc[i].y1; indminy = i; }

if (miny > lc[i].y2)

{ miny = lc[i].y2; indminy = i; }

if (miny > lc[i].y3)

{ miny = lc[i].y3; indminy = i; }

}

}

this.Click += new EventHandler(Form2_Click);

this.Width = (int)(maxx-minx+2)*20+40;

this.Height = (int)(maxy-miny+2)*20+40 ;

MessageBox.Show(maxx+" "+maxy);

}

void Form2_Click(object sender, EventArgs e)

{

Graphics g = this.CreateGraphics();

Pen p = new Pen(Color.Black, 1);

SolidBrush br;

for (int i = 0; i < u.Count; i++)(l[i].c!=Color.Black){

br = new SolidBrush(l[i].c);

Point pnt1 = new Point((int)(l[i].x1 * 20 +20+ Math.Abs(minx)*20), this.Height - 55 - (int)((l[i].y1 * 20) - miny*20));

Point pnt2 = new Point((int)(l[i].x2 * 20 + 20 + Math.Abs(minx) * 20), this.Height - 55 - (int)((l[i].y2 * 20) - miny * 20));

Point pnt3 = new Point((int)(l[i].x3 * 20 + 20 + Math.Abs(minx) * 20), this.Height - 55 - (int)((l[i].y3 * 20) - miny * 20));

Point[] arrp = { pnt1, pnt2, pnt3 };

g.FillPolygon(br, arrp);

g.DrawLine(p, (float)(l[i].x1 * 20 + 20 + Math.Abs(minx) * 20), this.Height - 55 - (float)(l[i].y1 * 20 - miny * 20), (float)(l[i].x2 * 20 + 20 + Math.Abs(minx) * 20), this.Height - 55 - (float)(l[i].y2 * 20 - miny * 20));

g.DrawLine(p, (float)(l[i].x1 * 20 + 20 + Math.Abs(minx) * 20), this.Height - 55 - (float)(l[i].y1 * 20 - miny * 20), (float)(l[i].x3 * 20 + 20 + Math.Abs(minx) * 20), this.Height - 55 - (float)(l[i].y3 * 20 - miny * 20));

g.DrawLine(p, (float)(l[i].x3 * 20 + 20 + Math.Abs(minx) * 20), this.Height - 55 - (float)(l[i].y3 * 20 - miny * 20), (float)(l[i].x2 * 20 + 20 + Math.Abs(minx) * 20), this.Height - 55 - (float)(l[i].y2 * 20 - miny * 20));.csSystem;System.Collections.Generic;System.Text;System.Drawing;WindowsFormsApplication1

{

class Rezba

{

static public double D;//диаметр шляпки

static public double b;//ширина шляпки

static public double l;//длина конца болта

static public double d1;//внутренний диаметр

static public double d2;//средний диаметр

static public double d3;//внешний диаметр

static public double bg;//ширина гайки

static public double lg;//длина гайки

static public double p;//шаг резьбы

static public double H;//рабочая высота

static public int count_v;//кол-во витков

static public double eps;//точность

}

public class Uzl_Coord

{

public double x1;

public double x2;

public double x3;

public double y1;

public double y2;

public double y3;

public Color c;

}

class matrAclass

{

public double[,] A;

}

class matrKLOCclass

{

public double[,] K;

}

public class globindexes

{

public int[] ind;

}

//// Метод Гаусса ////GausMethod

{

public int RowCount;

public int ColumCount;

public double[,] Matrix;

public double[] RightPart;

public double[] Answer;

public GausMethod(int count)

{

RightPart = new double[count];

Answer = new double[count];

Matrix = new double[count, count];

RowCount = count;

ColumCount = count;

//обнулим массив

for (int i = 0; i < count; i++)

{

Answer[i] = 0;

RightPart[i] = 0;

for (int j = 0; j < count; j++)

Matrix[i, j] = 0;

}

}

private void SortRows(int SortIndex)

{

double MaxElement = Matrix[SortIndex, SortIndex];

int MaxElementIndex = SortIndex;

for (int i = SortIndex + 1; i < RowCount; i++)

{

if (Matrix[i, SortIndex] > MaxElement)

{

MaxElement = Matrix[i, SortIndex];

MaxElementIndex = i;

}

}

//теперь найден максимальный элемент ставим его на верхнее место

if (MaxElementIndex > SortIndex)//если это не первый элемент

{

double Temp;

Temp = RightPart[MaxElementIndex];

RightPart[MaxElementIndex] = RightPart[SortIndex];

RightPart[SortIndex] = Temp;

for (int i = 0; i < ColumCount; i++)

{

Temp = Matrix[MaxElementIndex, i];

Matrix[MaxElementIndex, i] = Matrix[SortIndex, i];

Matrix[SortIndex, i] = Temp;

}

}

}

public int SolveMatrix()

{

if (RowCount != ColumCount)

return 1; //нет решения

for (int i = 0; i < RowCount - 1; i++)

{

SortRows(i);

 for (int j = i + 1; j < RowCount; j++)

{

if (Matrix[i, i] != 0) //если главный элемент не 0, то производим вычисления

{

double MultElement = Matrix[j, i] / Matrix[i, i];

for (int k = i; k < ColumCount; k++)

Matrix[j, k] -= Matrix[i, k] * MultElement;

RightPart[j] -= RightPart[i] * MultElement;

}

//для нулевого главного элемента просто пропускаем данный шаг

}

}

//ищем решение

for (int i = (int)(RowCount - 1); i >= 0; i--)

{

Answer[i] = RightPart[i];

for (int j = (int)(RowCount - 1); j > i; j--)

Answer[i] -= Matrix[i, j] * Answer[j];

if (Matrix[i, i] == 0)

if (RightPart[i] == 0)

return 2; //множество решений

else

return 1; //нет решения

Answer[i] /= Matrix[i, i];

}

return 0;

}

public override String ToString()

{

String S = "";

for (int i = 0; i < RowCount; i++)

{

S += "\r\n";

for (int j = 0; j < ColumCount; j++)

{

S += Matrix[i, j].ToString("F04") + "\t";

}

S += "\t" + Answer[i].ToString("F08");

S += "\t" + RightPart[i].ToString("F04");

}

return S;

}

}

}

Похожие работы на - Определение количества витков резьбового соединения с трапецеидальной резьбой, воспринимающего осевую сжимающую нагрузку

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!