forked from uyras/partsEngine
-
Notifications
You must be signed in to change notification settings - Fork 0
/
squarelattice.cpp
126 lines (99 loc) · 2.92 KB
/
squarelattice.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include "squarelattice.h"
SquareLattice::SquareLattice():
m(0),
n(0),
l(1)
{
_type = "squarelattice";
}
void SquareLattice::dropSquareLattice(int m, int n, double l, double len, Part *example)
{
this->clear(); //очищаем систему
this->reserveParts(unsigned(m*n));
//сохраняем параметры решетки
this->m = m;
this->n = n;
this->l = l;
if (example==0){ //если образец не задан, делаем его пустым по умолчанию
example = new Part();
}
Part* temp; //временная частица
for (int i=0; i<m; i++){
for (int j=0; j<n; j++){
temp = new Part(*example); //создаем копию объекта
temp->m = Vect(0,len,0);
temp->pos = Vect(i*l, j*l, 0);
this->insert(temp);
}
}
}
StateMachineFree SquareLattice::groundState()
{
StateMachineFree oldState = state, newState; //сохраняем текущее состояние
Part* temp; //временная частица
vector<Part*>::iterator iter = parts.begin();
int i=0, j=0;
while (iter != parts.end()){ //обходим все частицы
temp = *iter;
if ((temp->m.scalar(Vect(0,1,0))>0) ^ (i%2==1))
temp->rotate();
if ((++j) == n){
j=0; i++;
}
iter++;
}
newState = state; //сохраняем состояние минимума
state = oldState; //возвращаем начальное состояние
return newState;
}
StateMachineFree SquareLattice::maximalState()
{
StateMachineFree oldState = state, newState;
Part* temp; //временная частица
vector<Part*>::iterator iter = parts.begin();
int i=0, j=0;
while (iter != parts.end()){
temp = *iter;
if ((temp->m.scalar(Vect(0,1,0))>0) ^ (j%2==1))
temp->rotate();
if ((++j) == n){
j=0; i++;
}
iter++;
}
newState = state;
state = oldState;
return newState;
}
void SquareLattice::load(QString file)
{
//грузим основной набор частиц
PartArray::load(file);
LoadHelper helper(file);
//пропускаем до своей секции
helper.go("square");
//читаем три своих поля
helper>>this->m;
helper>>this->n;
helper>>this->l;
//закрываем файл
helper.close();
}
void SquareLattice::save(QString file)
{
//Сохраняем основную часть файла
PartArray::save(file);
SaveHelper helper(file);
//пишем секцию
helper.go("square");
//пишем свои данные
helper<<this->m;
helper<<this->n;
helper<<this->l;
//закрываем файл
helper.close();
}
Part *SquareLattice::at(int i, int j)
{
return this->operator [](i*n+j);
}