特别鸣谢:无私帮助我的ycc同学
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <corecrt_math_defines.h>
const int max_eletrons = 256;
struct Eletrons {
double x, y, z, q;
} eletrons[max_eletrons];
int num_eletrons = 0;
double rand_double() {
return double(rand()) / 65536.0;
}
void init_eletrons(int range_min, int range_max) {
srand((unsigned)time(0));
num_eletrons = range_min + rand() % (range_max - range_min);
for (int i = 0; i < num_eletrons; i++) {
eletrons[i] = {
rand_double(), rand_double(), rand_double(), rand_double() * 100.0 };
}
}
struct Vec {
double x, y, z;
inline Vec operator + (Vec const& r) const {
return {
x + r.x, y + r.y, z + r.z }; }
inline Vec operator - (Vec const& r) const {
return {
x - r.x, y - r.y, z - r.z }; }
inline Vec operator * (double const& s) const {
return {
x * s, y * s, z * s }; }
inline double dot(Vec const& r) const {
return x * r.x + y * r.y + z * r.z; }
inline double length2() const {
return dot(*this); }
inline double length() const {
return std::sqrt(length2()); }
inline double distance(Vec const& r) const {
return (*this - r).length(); }
inline Vec normalize() const {
auto len = length(); return {
x / len, y / len, z / len }; }
};
const double pi = M_PI;
//const double eps0 = 8.854187817 * 1e-12f
const double eps0 = 1;
const double k = 1 / (4 * pi * eps0);
double integral_dS(Vec const& pos, Vec const& normal) {
double sum = 0.0;
for (int i = 0; i < num_eletrons; ++i) {
Eletrons e = eletrons[i];
Vec dir = pos - Vec{
e.x, e.y, e.z };
sum += dir.normalize().dot