我的网站http://www.tigerion.cn
/* 两异号电荷产生电场线 */
#include "stdio.h"
#include "graphics.h"
#include "math.h"
#define K 300.0
#define PI 3.141592653
typedef struct /*点元素*/
{
double x;
double y;
}dotxy;
void main()
{
dotxy p1,p2;
int gd=DETECT,gm;
char c=0;
void drel(dotxy p1,dotxy p2);
void dreball(dotxy p1,dotxy p2);
void message();
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm,"");
p1.x=170;p2.x=470;
p1.y=p2.y=240;
do
{
cleardevice();
message();
switch (c)
{
case 'u':
case 'U': p2.y-=2;break;
case 'd':
case 'D': p2.y+=2;break;
case 'l':
case 'L': p2.x-=2;break;
case 'r':
case 'R': p2.x+=2;break;
}
dreball(p1,p2);
drel(p1,p2);
drel(p2,p1);
}
while((c=getch())!='e'&&c!='E');
getch();
closegraph();
}
void dreball(dotxy p1,dotxy p2) /*画‘p2’一侧的电场线 */
{
setcolor(15);
circle(p1.x,p1.y,10);
circle(p2.x,p2.y,10);
line(p1.x-5,p1.y,p1.x+5,p1.y);
line(p2.x-5,p2.y,p2.x+5,p2.y);
/* line(p1.x,p1.y-5,p1.x,p1.y+5);*/
line(p2.x,p2.y-5,p2.x,p2.y+5);
}
void drel(dotxy p1,dotxy p2)
{
int i;
dotxy p3;
double b,r1,r2,fx,fy,dx,dy;/*r1,r2为平面内一点到两电荷距离的立方*/
/*fx,fy分别是X方向和Y方向受力*/
setcolor(4);
for(b=0.1;b<=2*PI;b+=PI/6)
{
p3.x=p2.x+12*cos(b);
p3.y=p2.y+12*sin(b);
for(i=0;i<500;i++)
{
putpixel(p3.x,p3.y,1+i/20%15);
r1=pow((p3.x-p1.x)*(p3.x-p1.x)+(p3.y-p1.y)*(p3.y-p1.y),1.5);
r2=pow((p3.x-p2.x)*(p3.x-p2.x)+(p3.y-p2.y)*(p3.y-p2.y),1.5);
fx=-K/r1*(p3.x-p1.x)+K/r2*(p3.x-p2.x);
fy=-K/r1*(p3.y-p1.y)+K/r2*(p3.y-p2.y);
dx=fx/sqrt(fx*fx+fy*fy);/*由fx,fy算出切线方向的单位向量*/
dy=fy/sqrt(fx*fx+fy*fy);
p3.x+=dx;
p3.y+=dy;
}
}
}
void message()
{
setcolor(15);
outtextxy(40,40,"U->up");
outtextxy(240,40,"D->down");
outtextxy(40,100,"L->left");
outtextxy(240,100,"R->right");
outtextxy(140,70,"E->exit");
}
我的网站http://www.tigerion.cn