使用PHP绘制电场线

写在前面:

前段时间,临近期末,我们物理老师要求我们在本学期的知识范围内任意选定一个方向完成一个小的论文报告。我一寻思,好像我就会点PHP,刚好老师说可以选择程序作为自己的研究方向。好嘛!那就开始动手吧,上网一找关于电场线的程序绘制全是matlab写的,我的心里那叫一个愁啊。没办法啊,眼看时间就快到了,只好硬着头皮顶上去!还好写完感觉并不是特别难,就决定写一下,就当是一个记录吧!

下面进入正题,画电场线的话主要掌握求解电场线的方法,那么摆在我们面前的最大问题就解决了,关于如何详细的求解网上一定有许多的教程,在此我不进行细讲大概就是下面的思路:


当我们有了大致的思路后就可以开始动手写我们的程序了,下面我就直接展示我的代码:

<?php 
$image = imagecreate(480, 300);//生成一个承载图片内容的图像载体
$white = imagecolorallocate($image, 255, 255, 255); 
$color = imagecolorallocate($image, 0, 0, 0);//定义颜色为黑色
//定义空数组主要是为了之后,但两个变量在一起的时候更加方便的进行赋值
$x0 = array();//定义一个空数组
$x0[1] = 120;
$x0[2] = 360;

$y0 = array();//定义一个空数组
$y0[1] = 150;
$y0[2] = 150;

$x = array();//定义一个空数组

$y = array();//定义一个空数组

$e = array();//定义一个空数组

$r1 = array();

$r2 = array();

$E1 = array();
$E1x = array();
$E1y = array();

$E2 = array();
$E2x = array();
$E2y = array();

$E = array(); 
$Ex = array();
$Ey = array();

$q = array();//定义一个空数组
$q[1] = 1;
$q[2] = 1;

$k = 9*10^9;
$dl = 5;
$a0 = M_PI/12;
for($t = 1; $t <=2; $t++ ){
	for($m = 1; $m <= 12*abs($q[$t]); $m++){
		$sm = $a0 + ($m - 1)*M_PI/(6*$q[$t]);
		$e[$t] = $q[$t]/abs($q[$t]);
		$x[1] = $x0[$t] + $e[$t]*$dl*cos($sm); 
		$y[1] = $y0[$t] + $e[$t]*$dl*sin($sm);

		$r1[1] = sqrt((pow(($x[1] - $x0[1]), 2)) + (pow(($y[1] - $y0[1]), 2)));
		
		$r2[1] = sqrt((pow(($x[1] - $x0[2]), 2)) + (pow(($y[1] - $y0[2]), 2)));

		$E1[1] = $k*$q[1]/(pow($r1[1], 2));
		$E1x[1] = $E1[1]*($x[1] - $x0[1])/$r1[1];
		$E1y[1] = $E1[1]*($y[1] - $y0[1])/$r1[1];

		$E2[1] = $k*$q[2]/(pow($r2[1], 2));
		$E2x[1] = $E2[1]*($x[1] - $x0[2])/$r2[1];
		$E2y[1] = $E2[1]*($y[1] - $y0[2])/$r2[1];

		$Ex[1] = $E1x[1] + $E2x[1];

		$Ey[1] = $E1y[1] + $E2y[1];

		$E[1] = sqrt((pow($Ex[1], 2)) + (pow($Ey[1], 2)));

		for($n = 2; $n < 2000; $n++){
			$x[$n] = $x[$n-1] + $e[$t]*$dl*$Ex[$n-1]/$E[$n-1];
			$y[$n] = $y[$n-1] + $e[$t]*$dl*$Ey[$n-1]/$E[$n-1];

			$r1[$n] = sqrt((pow(($x[$n] - $x0[1]), 2)) + (pow(($y[$n] - $y0[1]), 2)));
			$r2[$n] = sqrt((pow(($x[$n] - $x0[2]), 2)) + (pow(($y[$n] - $y0[2]), 2)));

			$E1[$n] = $k*$q[1]/(pow($r1[$n], 2));
			$E1x[$n] = $E1[$n]*($x[$n-1] - $x0[1])/$r1[$n-1];
			$E1y[$n] = $E1[$n]*($y[$n-1] - $y0[1])/$r1[$n-1];
 
			$E2[$n] = $k*$q[2]/(pow($r2[$n], 2));
			$E2x[$n] = $E2[$n]*($x[$n-1] - $x0[2])/$r2[$n-1];
			$E2y[$n] = $E2[$n]*($y[$n-1] - $y0[2])/$r2[$n-1];
			
			$Ex[$n]=$E1x[$n]+$E2x[$n];
			$Ey[$n]=$E1y[$n]+$E2y[$n]; 
			$E[$n]=sqrt((pow($Ex[$n], 2)) + (pow($Ey[$n], 2)));
			
			imageline($image , (int)$x[$n] , (int)$y[$n] , (int)$x[$n-1] , (int)$y[$n-1] , $color);
		}
	}	
}
header("Content-type: image/png");//使得生成的图片可以正确的输出
imagepng($image);
大概程序就是这样,运行结果如下:


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值