# How to draw a curve until it intersects another curve

I am a matplotlib noob, but I have searched the documentation, lists etc and cannot find a simple way to stop a curve being drawn once it crosses another curve. In the attached example, I am trying to draw the solid curve only until it intersects the dashed one. I have tried using the numpy.where() method, but it does not seem to be the right way to go about it- I end up having to write FOR loops and so on, and that does not make use of the vectorization advantages of numpy. Seems like there ought to be a simple way to do this.

Gordon

mport numpy as np
import matplotlib.pyplot as plt

def ig_CRM(vg,V,L,Ts):
return ((Ts*vg/(2*L))*(1-(vg/V)))

def ig_CCM(vg,V,L,Ts,d):
return (Ts*vg*d**2/(2*L))/(1-vg/V)

L= 110*10**-6
Ts= 10**-5
V= 400

vg= np.arange(0.0,400.0,1.0)
ig_bdry= ig_CRM(vg,V,L,Ts)
plt.plot(vg,ig_bdry,'--')
ig_d2=ig_CCM(vg,V,L,Ts,0.2)
plt.plot(vg,ig_d2)
plt.axis([0, 400, 0, 20])
plt.show()

Gordon Hardmant :

I ...cannot find a simple way to stop a curve being drawn once it crosses
another curve. In the attached example, I am trying to draw the solid
curve only until it intersects the dashed one. I have tried using the
numpy.where() method, but it does not seem to be the right way to go
about it- I end up having to write FOR loops and so on, and that does
not make use of the vectorization advantages of numpy.

Try to insert just before plot(...) the following two lines:

igc=np.sign(ig_bdry-ig_d2)
ig_d2[igc!=igc ]=np.nan

This  is a place which discriminates where the difference sign is "good". Of course this will produce
some bedlam if there are many intersections.

You didn't say whether you want to plot the dashed curve entirely. If not, just truncate all three, the solid, the dashed
and the abscissa, where the sign is OK.

Good luck.

Jerzy Karczmarczuk
Caen, France

From: Jerzy Karczmarczuk [mailto:jerzy.karczmarczuk@…3937…]
Sent: Sunday, May 27, 2012 12:56

Gordon Hardmant :
> I ...cannot find a simple way to stop a curve being drawn once it crosses
> another curve. In the attached example, I am trying to draw the solid
> curve only until it intersects the dashed one. I have tried using the
> numpy.where() method, but it does not seem to be the right way to go
> about it- I end up having to write FOR loops and so on, and that does
> not make use of the vectorization advantages of numpy.
Try to insert just before plot(...) the following two lines:

igc=np.sign(ig_bdry-ig_d2)
ig_d2[igc!=igc ]=np.nan

Or, if you want to preserve the original data, index it with a boolean array:

under = (ig_d2 <= ig_bdry)
plt.plot(vg[under], ig_d2[under])

If you need to determine the intersection more precisely, you could define a
function of vg, V, L, Ts, and d that returns the difference between ig_CRM and
ig_CCM for those parameters, then use a root-finding routine  to
numerically find the vg for which that function returns essentially zero.