磁力線を書いてみるよ!
学校で磁力線についてやったのでプログラムで書いてみる。
教科書曰く、磁力線とは「ちょっとずつ試験電荷を移動させた時の軌跡」らしい。
なら、位置ベクトルを作って、ちょっとずつ移動させた後に、その座標における新しいベクトルを取得すればいいんじゃね。
という方針でやってみた。
#define _USE_MATH_DEFINES #include <stdio.h> #include <math.h> //極座標構造体 typedef struct{ int mark; double x_coordinate, y_coordinate; } pole; //ベクトル構造体 typedef struct{ int mark; //markが0なら[+]、1なら[-] double x_coordinate, y_coordinate; double x_vector, y_vector; } vector; //ベクトル構造体のメンバー表示 void vector_show(vector test){ printf("-----\n"); printf("%d\n", test.mark); printf("%f, %f\n", test.x_coordinate, test.y_coordinate); printf("%f, %f\n", test.x_vector, test.y_vector); printf("-----\n"); } //次のベクトル取得 vector func(vector vec, pole pole1, pole pole2){ vector ret; //vector_show(vec); double hoge = pow(pow(vec.x_vector, 2) + pow(vec.y_vector, 2), 0.5); //printf("%f\n", hoge); ret.x_coordinate = vec.x_coordinate + vec.x_vector / hoge / 10; ret.y_coordinate = vec.y_coordinate + vec.y_vector / hoge / 10; double hoge1 = pow(vec.x_coordinate - pole1.x_coordinate, 2) + pow(vec.y_coordinate - pole1.y_coordinate, 2); double hoge2 = pow(vec.x_coordinate - pole2.x_coordinate, 2) + pow(vec.y_coordinate - pole2.y_coordinate, 2); //printf("%f, %f\n", hoge1, hoge2); double x[2], y[2]; x[0] = (vec.x_coordinate - pole1.x_coordinate) / hoge1; y[0] = (vec.y_coordinate - pole1.y_coordinate) / hoge1; x[1] = -1 * (vec.x_coordinate - pole2.x_coordinate) / hoge2; y[1] = -1 * (vec.y_coordinate - pole2.y_coordinate) / hoge2; ret.x_vector = x[0] + x[1]; ret.y_vector = y[0] + y[1]; ret.mark = 0; return ret; } int main(){ pole pole1, pole2; FILE *fp = fopen("output.txt", "w"); pole1.mark = 0; pole1.x_coordinate = 100; pole1.y_coordinate = 100; pole2.mark = 1; pole2.x_coordinate = 200; pole2.y_coordinate = 100; vector test; test.mark = 0; int n = 100; for(int i=0; i<n; i++){ double x = cos(2*M_PI * i / n); double y = sin(2*M_PI * i / n); test.x_vector = x; test.y_vector = y; test.x_coordinate = pole1.x_coordinate + x; test.y_coordinate = pole1.y_coordinate + y; //printf("%f %f\n", test.x_vector, test.y_vector); double hoge = pow(pole2.x_coordinate - test.x_coordinate, 2) + pow(pole2.y_coordinate - test.y_coordinate, 2); while(50<test.x_coordinate && test.x_coordinate<250 && 0<test.y_coordinate && test.y_coordinate<200 && 1 < hoge){ hoge = pow(pole2.x_coordinate - test.x_coordinate, 2) + pow(pole2.y_coordinate - test.y_coordinate, 2); fprintf(fp, "%f %f\n", test.x_coordinate, test.y_coordinate); test = func(test, pole1, pole2); } } fclose(fp); return 0; }
簡単に説明すると、Pole1とPole2の2つの極を用意し、Pole1からのベクトルを演算していく感じ。
ここで問題なのは、Pole1からのベクトルしか演算できておらず、Pole2からの磁力線は無視してしまっていることである。
出力されたファイルをgnuplotに投げたのがこれ
なかなか美しいですね!
先述した通りPole2(右側の極、一応プログラム内では負のパラメータをもたせてるはず。)からの磁力線は演算されていない。
極や電荷に正負のパラメータを持たせてあるのは、汎用的な物を作ろうとして諦めた残骸ですね。
というわけで、このプログラムもまだ未完成なので、早く完成させたいものですね。
追記
画像整理してたら綺麗な形のが出てきた。いつ作ったのか覚えてない悲しみ