磁力線を書いてみるよ!

学校で磁力線についてやったのでプログラムで書いてみる。

教科書曰く、磁力線とは「ちょっとずつ試験電荷を移動させた時の軌跡」らしい。
なら、位置ベクトルを作って、ちょっとずつ移動させた後に、その座標における新しいベクトルを取得すればいいんじゃね。
という方針でやってみた。

#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(右側の極、一応プログラム内では負のパラメータをもたせてるはず。)からの磁力線は演算されていない。
極や電荷に正負のパラメータを持たせてあるのは、汎用的な物を作ろうとして諦めた残骸ですね。

というわけで、このプログラムもまだ未完成なので、早く完成させたいものですね。

追記
画像整理してたら綺麗な形のが出てきた。いつ作ったのか覚えてない悲しみ