2016-06-10 3 views
0

그래서해야 할 일은 Ising 모델 ('+1'또는 '-1'을 가리키는 스핀의 격자)과 비슷한 것입니다. 그래서를 수행하는 격자를위한 코드를 작성했습니다 : 이것은 내가 무엇을하고 있었는지에 대한 괜찮다고C++을 사용하여 회전 할 수있는 벡터 배열을 작성하는 방법

const int Lx = 5, Ly = 5; 
const int L = Lx*Ly; 

inline void vector_lattice(){ 

    for (int i = 0; i < L+1; i++){ 
     s[i]=0.0; 
    } 

    for (int i = 0; i < L; i++){ 
     s[i] =1; 
    } 
} 

,하지만 지금은 벡터의 실제 격자를 갖고 싶어 X2에서 X1, Y1 및을 stoping에 진을 시작 , y2. Ising 모델에서 +1은 x1, y1에서 시작하여 x1, y2에서 멈 춥니 다. 하지만 궁극적으로 그 벡터의 'sin (theta)'또는 이와 비슷한 것을 회전시키고 싶습니다. 따라서 격자의 모든 벡터 방향을 나타내는 화살표를 그릴 때 x1, y1, x2 및 y2와 같은 위치를 가져야합니다. 25x5 격자의 경우 25 개의 화살표.

궁극적으로 내가 원하는 것은 아래 그림과 같은 것을 표시하고,이 코드를 사용하면이 벡터를 90도 회전 할 수 있습니다.

나는 이것을 달성하기 위해 무엇을 바꾸어야하는지 알고 있습니다.

enter image description here

+1

질문을 편집하여 질문하는 내용을보다 구체적으로 지정할 수 있습니까? 나는 "모든 자세가 필요하다"는 것이 무엇인지 모르겠습니다. –

+0

완료, 이제 더 명확 해지기를 바랍니다! – Mac

+0

아직도 명확하지는 않지만, 올바르게 이해한다면, 격자 사이트를'std :: vector , std :: pair >'에 저장할 수 있습니다. '(x, y)'좌표와 두 번째 쌍은이 지점에서 "회전"의 방향을 저장합니다. 그런 다음 달성하려는 목표에 대해이 두 번째 쌍에 모든 회전을 적용 할 수 있습니다. – ArchbishopOfBanterbury

답변

0

그것은 프로그래밍을 당신이 물리학을 알고 같은 소리가 아니라. 2 차원 배열을 만들면 s [x] [y] = whatever와 같이 액세스 할 수 있습니다. 그러나 1d 배열로 표현 된 2 차원 배열을 반복하는 방법을 묻는다면 거기에서 도울 수 있습니다.

배열 색인에 x, y 좌표를 1 : 1로 매핑하면됩니다. 그것은 그 매핑 한이 1 대 1이기 때문에, 무엇을 정말 중요하지 않습니다, 그러나 여기 예입니다 : 당신은 격자 사이트 나타내는 std::vector<std::pair<std::pair<int,int>, std::pair<double,double>>> 래퍼 쓸 수

#include <iostream> 
#include <vector> 
typedef std::pair<double, double> physics_vector; 

const int Lx = 5, Ly = 5; 
const int L = Lx*Ly; 
int get_index(int x, int y) { return y * Ly + x; } 

// almost forgot 
int get_x(int index) { return index % Lx; } 
int get_y(int index) { return index/Lx; } 

class lattice : public std::vector<physics_vector>{ 
public: 
    lattice() { resize(L); } 
}; 

void iterate_over_lattice(std::vector<physics_vector> &s){ 

    for (int y = 0; y < Ly; y++){ 
     for (int x = 0; x < Lx; x++){ 
      int index = get_index(x, y); 
      s[index] = physics_vector(1, 0); 
      std::cout << index << ", "; 
     } 
     std::cout << std::endl; 
    } 
} 

int main(){ 
    lattice s; 
    iterate_over_lattice(s); 
    return 0; 
} 
+0

iterate_over_lattice는 함수 포인터를 취하여 모든 지점에 대해 해당 함수를 호출 할 수 있습니다.그게 당신이 std :: cout 부작용을 반복에서 빼낼 수있게 할 것입니다. –

+0

어쩌면 뒤늦은 견해로는 std :: array를 사용하여이 작업을 수행하는 방법을 알아 냈어야합니다.이 벡터는 C++의 한 가지 의미와이 애플리케이션에서 완전히 다른 것을 의미하는 단어 벡터를 피하기 위해서입니다. –

0

-의 좌표와 방향을 각각 std::pair에 각각 있습니다. 아래에 비슷한는 당신이 경우 생성자에서 resize을 사용하는 등 및 최적화 (

다음
#include <iostream> 
#include <utility> 
#include <vector> 

class lattice_sites { 
    typedef std::vector<std::pair< 
     std::pair<int,int>, 
     std::pair<double,double> 
     >> lattice_vector; 
public: 
    lattice_sites() : _lat_vec() {} 
    // create a lattice site with given position and direction 
    void create_site(const std::pair<int,int>& _coords, 
     const std::pair<double,double>& _drctn) { 
     _lat_vec.push_back(std::make_pair(_coords, _drctn)); 
    } 
    // rotate all lattice sites 
    void rotate_all(const double& _rot_angle) { 
     for (auto& x : _lat_vec) { 
      x.second.first = std::cos(_rot_angle); // rotate x-direction 
      x.second.second = std::sin(_rot_angle); // rotate y-direction 
     } 
    } 
    // write to stream 
    std::ostream& write(std::ostream& _os) { 
     for (const auto& x : _lat_vec) { 
      _os << x.first.first << " " << x.first.second << "\t" // coords 
       << x.second.first << " " << x.second.second << "\n"; // direction 
     } 
     return _os; 
    } 
private: 
    lattice_vector _lat_vec; 
}; 

다음과 같이이 클래스의 인스턴스를 조작 할 수

int main(void) { 
    lattice_sites sites; 
    const int n = 100; 
    for (int i = 0; i < n; ++i) { 
     sites.create_site(std::make_pair(i,i), std::make_pair(0.0,0.0)); 
    } 
    double rotation_angle = 0.5; // radians 
    sites.rotate_all(rotation_angle); 
    sites.write(std::cout); 
} 

이 일부 조정이 필요할 수 있습니다, 잘 작동 할 수 이미 격자의 크기를 알고있다.) 그러나 그것의 요지를 얻어야한다.

관련 문제