-- Forwarded message --
From: Andrea Gavana andrea.gav...@gmail.com
Date: Feb 13, 2012 11:31 PM
Subject: Re: [Numpy-discussion] Creating parallel curves
To: Jonathan Hilmer jkhil...@gmail.com
Thank you Jonathan for this, it's exactly what I was looking for. I' ll try
it tomorrow on the 768 well trajectories I have and I'll let you know if I
stumble upon any issue.
If someone could shed some light on my problem number 2 (how to adjust the
scaling/distance) so that the curves look parallel on a matplotlib graph
even though the axes scales are different, I'd be more than grateful.
Thank you in advance.
Andrea.
On Feb 13, 2012 4:32 AM, Jonathan Hilmer jkhil...@gmail.com wrote:
Andrea,
This is playing some tricks with 2D array expansion to make a tradeoff
in memory for speed. Given two sets of matching vectors (one
reference, given first, and a newly-expanded one, given second), it
removes all points from the expanded vectors that aren't needed to
describe the new contour.
def filter_expansion(x, y, x_expan, y_expan, distance_target, tol=1e-6):
target_xx, expansion_xx = scipy.meshgrid(x, x_expan)
target_yy, expansion_yy = scipy.meshgrid(y, y_expan)
distance = scipy.sqrt((expansion_yy - target_yy)**2 + (expansion_xx
-
target_xx)**2)
valid = distance.min(axis=1) distance_target*(1.-tol)
return x_expan.compress(valid), y_expan.compress(valid)
#
Jonathan
On Sun, Feb 12, 2012 at 2:31 PM, Robert Kern robert.k...@gmail.com
wrote:
On Sun, Feb 12, 2012 at 20:26, Andrea Gavana andrea.gav...@gmail.com
wrote:
I know, my definition of parallel was probably not orthodox enough.
What I am looking for is to generate 2 curves that look graphically
parallel enough to the original one, and not parallel in the true
mathematical sense.
There is a rigorous way to define the curve that you are looking for,
and fortunately it gives some hints for implementation. For each point
(x,y) in space, associate with it the nearest distance D from that
point to the reference curve. The parallel curves are just two sides
of the level set where D(x,y) is equal to the specified distance
(possibly removing the circular caps that surround the ends of the
reference curve).
If performance is not a constraint, then you could just evaluate that
D(x,y) function on a fine-enough grid and do marching squares to find
the level set. matplotlib's contour plotting routines can help here.
There is a hint in the PyX page that you linked to that you should
consider. Angles in the reference curve become circular arcs in the
parallel curves. So if your reference curve is just a bunch of line
segments, then what you can do is take each line segment, and make
parallel copies the same length to either side. Now you just need to
connect up these parallel segments with each other. You do this by
using circular arcs centered on the vertices of the reference curve.
Do this on both sides. On the outer side, the arcs will go forward
while on the inner side, the arcs will go backwards just like the
cusps that you saw in your attempt. Now let's take care of that. You
will have two self-intersecting curves consisting of alternating line
segments and circular arcs. Parts of these curves will be too close to
the reference curve. You will have to go through these curves to find
the locations of self-intersection and remove the parts of the
segments and arcs that are too close to the reference curve. This is
tricky to do, but the formulae for segment-segment, segment-arc, and
arc-arc intersection can be found online.
--
Robert Kern
I have come to believe that the whole world is an enigma, a harmless
enigma that is made terrible by our own mad attempt to interpret it as
though it had an underlying truth.
-- Umberto Eco
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion