<html>

<head><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>quantum simulation (collision)</title>
<style>
<!--
	table td.head{ 
		background-color: #3a6ba5;
		border: 1px #000000 solid;
		font-family: Verdana;
		font-weight: bold;
		font-size: 14px;
		color: #f79c19;
		padding: 6px;
	}

	table td.body{ 
		border-bottom: 1px #6699CC dotted;
		text-align: left;
		font-family: Verdana, sans-serif, Arial;
		font-weight: normal;
		font-size: 14px;
		color: #3A6BA5;
		background-color: #fafafa;
		padding: 6px;
	}
	
-->
</style>
</head>

<body>



<p align="left"><font size="6" color="#FF0000"><span lang="en-ca"><b>&nbsp; 
 
</b></span><b>&nbsp;&nbsp;&nbsp; <span lang="en-ca">&nbsp;&nbsp; Quantum</span></b></font></p>

<div align="left">
  <pre><b><font color="#ff0000" size="5">A. <span lang="en-ca">First </span>Edition</font></b></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>This is purely for fun. You see, whenever there is an exam and I feel nervous the best way for me to do is just</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>write some free-lance program such that my brain is fully occupied and forget anything at all.</b></span></pre>
</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5"><span lang="en-ca">B</span>.<span lang="en-ca"><a name="problem"></a>The problem</span></font></b></pre>
  <pre><span lang="en-ca"><b>The starts long time ago. Once I noticed in Dr. Grogono's web page that these is fancy &quot;snooker&quot; game. And in my</b></span></pre>
  <pre><span lang="en-ca"><b>boring &quot;chem 205&quot; course, the professor mentioned so much about collision of molecular. So, they become inspiration</b></span></pre>
  <pre><span lang="en-ca"><b>for me to write this simple program to simulate the collision of quantum, assuming both moment and energy are</b></span></pre>
  <pre><span lang="en-ca"><b>conserved. In other words, it is the ideal collision.</b></span></pre>
  <pre><span lang="en-ca"><b>To implement quantum, I went such a long way to override various operators of Vector class. The only thing worth</b></span></pre>
  <pre><span lang="en-ca"><b>mentioning is the &quot;*&quot; operator between two vectors. It is weird and I just do it by instinct to reduce my code.</b></span></pre>
  <pre><span lang="en-ca"><b>The physical meaning is not very justified: V(x1,y1)*U(x2,y2) = x1*x2+y1*y2 ==&gt;a number!</b></span></pre>
  <pre>　</pre>
  
  <b><font color="#ff0000" size="5"><span lang="en-ca"><a name="explain"></a>C</span>.<span lang="en-ca">The
  </span></font></b><span lang="en-ca"><font size="5" color="#FF0000"><b>idea of 
  program</b></font></span></div>
<pre><b><font color="#ff0000" size="5">D.<span lang="en-ca"><a name="Method"></a>The </span>major functions</font></b></pre>
<div align="left">
  <pre><b><span lang="en-ca">The only complicated function is the &quot;collide&quot; which first check if there is possibility of collision by calling</span></b></pre>
</div>
<div align="left">
  <pre><b><span lang="en-ca">function of &quot;collisionTime&quot; which returns the time to be collided, -1 indicating impossible to collide.</span></b></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>Then two colliding quantum &quot;flyto&quot; the position of colliding site where they exchange energy, moment. After that</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>collision, both speeds are changed while energy and moment conserves.</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>The collisionTime function tries to find the time when distance between two quantum is the sum of their radius.</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>(Here I made an interesting mistake. At first, among the two square roots, I choose the positive one and the </b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>result confused me for quite a long time since the two quantum collides from impossible angle. Then I realized</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>that I should choose the smaller root. However, does it matter if I change the original beginning coordinates?)</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>I only made a simple test since I am starving now after eight hours' struggle.</b></span></pre>
</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5"><span lang="en-ca">E</span>.</font></b><span lang="en-ca"><font size="5" color="#FF0000"><b>Further improvement</b></font></span></pre>
</div>
<div align="left">
  <pre>　</pre>
</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5"><span lang="en-ca">F</span>.</font></b><span lang="en-ca"><font size="5" color="#FF0000"><b>File listing</b></font></span></pre>
</div>
<div align="left">
  <pre><font size="3"><b><span lang="en-ca">1. vector.h</span></b></font></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>2</b></font></span><font size="3"><b><span lang="en-ca">. vector.cpp</span></b></font></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>3</b></font></span><font size="3"><b><span lang="en-ca">. quantum.h</span></b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b><span lang="en-ca">4. quantum.</span></b></font><span lang="en-ca"><font size="3"><b>cpp</b></font></span></pre>
</div>
<div align="left">
  <pre><font size="3"><b><span lang="en-ca">5. main.cpp</span></b></font></pre>
</div>
<div align="left">
  <pre>　</pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3" color="#FF0000"><b>file name: vector.h</b></font></span></pre>
</div>
<pre>class Vector
{
protected:
	double x;
	double y;
public:
	void set(double theX, double theY){x=theX; y=theY;}
	Vector operator -(Vector&amp; other);
	Vector&amp; decrement(Vector&amp; other);
	Vector operator +(Vector&amp; other);
	Vector&amp; increment(Vector&amp; other);
	Vector&amp; operator =(Vector&amp; other);
	Vector&amp; multiply(double scalor);
	bool operator ==(Vector&amp; other);
	Vector(double theX=0, double theY=0);
	double length();
	double sqrLength();
	Vector operator *(double scalor);
	double operator *(Vector&amp; other);
	void display();
};</pre>
<pre>
</pre>
<pre></pre>
<pre><span lang="en-ca"><font size="3" color="#FF0000"><b>file name: vector.cpp</b></font></span></pre>
<pre>#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;
#include &lt;math.h&gt;
#include &quot;quantum.h&quot;

Vector&amp; Vector::decrement(Vector&amp; other)
{
	x-=other.x;
	y-=other.y;
	return *this;
}

Vector&amp; Vector::increment(Vector&amp; other)
{
	x+=other.x;
	y+=other.y;
	return *this;
}

Vector&amp; Vector::multiply(double scalor)
{
	x*=scalor;
	y*=scalor;
	return *this;
}

Vector::Vector(double theX, double theY)
{
	x=theX;
	y=theY;
}

Vector Vector::operator +(Vector&amp; other)
{
	Vector result;
	result.x= x+other.x;
	result.y= y+other.y;
	return result;
}

Vector Vector::operator -(Vector&amp; other)
{
	Vector result;
	result.x= x-other.x;
	result.y= y-other.y;
	return result;
}

Vector&amp; Vector::operator =(Vector&amp; other)
{
	x= other.x;
	y= other.y;
	return *this;
}

double Vector::operator *(Vector&amp; other)
{
	return x*other.x+y*other.y;
}

Vector Vector::operator *(double scalor)
{
	Vector result;
	result.x = x*scalor;
	result.y = y*scalor;
	return result;
}

bool Vector::operator ==(Vector&amp; other)
{
	return x==other.x &amp;&amp; y==other.y;
}

double Vector::sqrLength()
{
	return (x*x+y*y);
}

double Vector::length()
{
	return sqrt(x*x+y*y);
}

void Vector::display()
{
	printf(&quot;(%f, %f)&quot;, x, y);
}</pre>
<pre>
</pre>
<pre><span lang="en-ca"><font size="3" color="#FF0000"><b>file name: quantum.h</b></font></span></pre>
<pre>#include &quot;vector.h&quot;

const double DefaultStartMoment=0;
const double DefaultRadius=1;
const double DefaultSpeed=5;
const double DefaultStartPos=0;

//assume the quantum always has same mass, it is much simple
class Quantum 
{
protected:
	Vector coord;
	Vector speed;
	double elapsed;
	double radius;
	void initialize();
public:
	Quantum(Vector&amp; position, Vector&amp; theSpeed, double theMoment, double theRadius);
	Quantum();
	void setRadius(double newRadius){radius=newRadius;}
	void setSpeed(double vx, double vy){speed.set(vx, vy);}
	void setSpeed(Vector&amp; speedVector){speed=speedVector;}
	void setPos(double px, double py){coord.set(px, py);}
	void setPos(Vector&amp; posVector){ coord=posVector;}
	void setMoment(double now){elapsed=now;}
	double collisionTime(Quantum&amp; other);//return the time
	Vector fly(double elapse);//the pos vector quantum will fly to
	void flyto(double elapse);
	void collide(Quantum&amp; other);
	void display();
};</pre>
<pre>　</pre>
<pre>
		
<span lang="en-ca"><font size="3" color="#FF0000"><b>file name: quantum.cpp</b></font></span></pre>
<pre>#include &quot;quantum.h&quot;
#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;
#include &lt;math.h&gt;

Quantum::Quantum()
{
	initialize();
}

void Quantum::initialize()
{
	radius=DefaultRadius;
	elapsed=DefaultStartMoment;
	coord.set(DefaultStartPos, DefaultStartPos);
	speed.set(DefaultSpeed, DefaultSpeed);
}

Quantum::Quantum(Vector&amp; thePos, Vector&amp; theSpeed, double theMoment, double theRadius)
{
	coord=thePos;
	speed=theSpeed;
	elapsed=theMoment;
	radius=theRadius;
}

Vector Quantum::fly(double elapse)
{
	return coord+(speed*elapse);
}

/*
assume P{(x1,y1),(vx1,vy1)}, Q{(x2,y2),(vx2,vy2)}
flying time t
P{(x1+vx1*t, y1+vy1*t)}, Q{(x2+vx2*t),(y2+vy2*t)}
The distance between P,Q should be (r1+r2)
So, square(x2-x1+t(vx2-vx1))+square(y2-y1+t(vy2-vy1))=square(r1+r2)
a=square(vx2-vx1)+square(vy2-vy1)
b=2*((vy2-vy1)(y2-y1)+(vx2-vx1)(x2-x1))
c=square(x2-x1)+square(y2-y1)-square(r1+r2)
*/

double Quantum::collisionTime(Quantum&amp; other)
{
	double a,b,c, root;
	a=(speed-other.speed).sqrLength();
	//here is the * of two vector, like angle between them
	b=((speed-other.speed)*(coord-other.coord))*2;
	c=(coord-other.coord).sqrLength()-(radius+other.radius)*(radius+other.radius);
	root=b*b - 4*a*c;
	if (root&lt;0)
	{
		return -1;//won't collide at all
	}
	return -(sqrt(root)+b)/(2*a);
}

void Quantum::flyto(double elapse)
{
	coord.increment(speed*elapse);
	elapsed+=elapse;
}

/*
assume the collision point is p1(x1,y1), p2(x2,y2)
the delta speed vector should be on the line of p1_p2
delta=scalor*(x1-x2,y1-y2) is exerted on Quantum Q
-delta should be exerted on Quantum P
the conservation of moment is satisfied since |delta|=|-delta|
or delta+(-delta)=0 moment
the conservation of energy should also be satisfied
sq(vx1)+sq(vy1)+sq(vx2)+sq(vy2)=sq(vx1+scalor*(x1-x2))+sq(vy1+scalor*(y1-y2))
+sq(vx2+(scalor*(x2-x1))+sq(vy2+(scalor*(y2-y1))
simplify and get:
a=(sq(x1-x2)+sq(y1-y2))
b=(x1-x2)(vx2-vx1)+(y1-y2)(vy2-vy1)
scalor=b/a
*/

void Quantum::collide(Quantum&amp; other)
{
	double elapse, scalor;
	Vector delta;
	if ((elapse=collisionTime(other))&lt;0)
	{
		return;
	}
	flyto(elapse);
	other.flyto(elapse);
	//these are speed delta
	delta=coord-other.coord;	
	scalor= ((other.speed-speed)*delta)/(delta.sqrLength());
	speed.increment(delta*scalor);
	other.speed.decrement(delta*scalor);
}

void Quantum::display()
{
	printf(&quot;coord:&quot;);
	coord.display();
	printf(&quot; speed:&quot;);
	speed.display();
	printf(&quot;\n&quot;);
}

</pre>
<pre>　</pre>
<pre><span lang="en-ca"><font size="3" color="#FF0000"><b>file name: main.cpp</b></font></span></pre>
<pre>#include &quot;quantum.h&quot;
#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;

int main()
{
	Quantum Q, P;
	//double moment;
	Q.setPos(1,2);
	Q.setSpeed(1,0);
	P.setPos(4,1);
	P.setSpeed(-2,1);
	printf(&quot;before collision:\n&quot;);
	printf(&quot;now Q is:&quot;);
	Q.display();
	printf(&quot;now P is:&quot;);
	P.display();
	/*
	if ((moment=Q.collisionTime(P))&gt;0)
	{
		printf(&quot;Q and P will collide at %f\n&quot;, moment);
	}
	P.flyto(moment);
	Q.flyto(moment);
	*/
	Q.collide(P);

	printf(&quot;after collision:\n&quot;);
	printf(&quot;now Q is:&quot;);
	Q.display();
	printf(&quot;now P is:&quot;);
	P.display();
	return 0;
}</pre>
<pre>　</pre>

<p><span lang="en-ca"><font color="#0000FF"><b>running result:</b></font></span></p>

<p>before collision:<br>
now Q is:coord:(1.000000, 2.000000) speed:(1.000000, 0.000000)<br>
now P is:coord:(4.000000, 1.000000) speed:(-2.000000, 1.000000)<br>
after collision:<br>
now Q is:coord:(1.367544, 2.000000) speed:(-2.000000, 1.000000)<br>
now P is:coord:(3.264911, 1.367544) speed:(1.000000, 0.000000)<br>
Press any key to continue</p>

<p><br>
　</p>

<pre></pre>

<pre></pre>

<pre></pre>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                                   
&nbsp;&nbsp;&nbsp; <a href="PocketRuler.htm">                  







                       <img src="picture/back.gif" style="border: medium none" alt="back.gif (341 bytes)" width="32" height="35"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<a href="index.htm">
<img src="picture/up.gif" style="border: medium none" alt="up.gif (335 bytes)" width="35" height="32"></a>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                         
<img src="picture/next.gif" style="border: medium none" alt="next.gif (337 bytes)" width="32" height="35">          


</p>

</body>

</html>