| 33 | } |
| 34 | |
| 35 | void VectorField::compute(const IForceField* forceField, AtomStorage& atoms, SpatialGrid& grid) { |
| 36 | if (forceField == nullptr) { |
| 37 | std::fill(field.begin(), field.end(), 0.0f); |
| 38 | std::fill(vectorField.begin(), vectorField.end(), glm::vec2(0.0f)); |
| 39 | return; |
| 40 | } |
| 41 | |
| 42 | const float z = static_cast<float>(sliceZ); |
| 43 | for (int y = 0; y < size.y; ++y) { |
| 44 | for (int x = 0; x < size.x; ++x) { |
| 45 | const float sampleX = std::min(static_cast<float>(x) * scale, static_cast<float>(domain.x)); |
| 46 | const float sampleY = std::min(static_cast<float>(y) * scale, static_cast<float>(domain.y)); |
| 47 | const auto sample = forceField->fieldAtPoint(atoms, grid, sampleX, sampleY, z); |
| 48 | const int index = x + size.x * y; |
| 49 | field[index] = sample.potential; |
| 50 | vectorField[index] = glm::vec2(sample.field.x, sample.field.y); |
| 51 | } |
| 52 | } |
| 53 | } |
| 54 | |
| 55 | void VectorField::show() const { |
| 56 | for (int y = 0; y < size.y; ++y) { |