RE: vlax-curve-... functions

Hi David,

I wrote a tiny "essay" on VLAX-CURVE functions here that might help you get started.

If no one beats me to it I'll get back with a suggestion for the perp to object problem later.

RE: vlax-curve-... functions

Thanks Stig

Excellent essay! I look forward to your suggestion for the 'perp' problem (or anybody elses!). Only solution I can see at the moment is to approximate the angle by getting points on the curve at either side of the insertion point, but this seems a bit clunky.

RE: vlax-curve-... functions

Thanks David.

Quote:

Originally Posted by **David.Hoole**

Only solution I can see at the moment is to approximate the angle by getting points on the curve at either side of the insertion point, but this seems a bit clunky.

You can get the angle directly with vlax-curve-getFirstDeriv. It will return the direction vector at the specified parameter along a curve object. For straight segments in a pline, it'll be equal to the normalized segment, and for curved segments, it'll be equal to the tangent.

I know vlax-curve-getSecondDeriv will get the angle you're after directly (= normal to curve) but I haven't figured out how to apply it to straight segments. Maybe someone here can explain if it's even possible?

Below is a rewrite of the measurePline function from the link above that only uses the first derivates. It'll get the parameters and first derivates from each measured point and draw two lines; one along the direction vector and one rotated 90 degrees from the direction vector. To apply it to block insertions, simply use the points and angles.

*Note:* Remember to turn off running osnaps before running it.

Code:

`(defun measurePline (obj divDist / endParam dist totLen pt par fder)`

(command "UNDO" "Begin")

(setq dist 0.0 orig '(0.0 0.0 0.0))

(setq endParam (vlax-curve-getEndParam obj)

totLen (vlax-curve-getDistAtParam obj endParam)

)

(while (<= dist totLen)

(setq pt (vlax-curve-getPointAtDist obj dist)

par (vlax-curve-getParamAtDist obj dist)

fder (vlax-curve-getFirstDeriv obj par)

dist (+ dist divDist)

)

(cond (pt

(command "POINT" pt)

;; this will draw a line along the direction vector

(command "LINE" pt (mapcar '+ pt fder) "")

;; .. and this will rotate the direction vector 90 degrees

(command "LINE" pt (polar pt (+ (angle orig fder) (/ pi 2.0))(distance pt (mapcar '+ pt fder))) "")

)

)

)

(command "UNDO" "End")

)

RE: vlax-curve-... functions

Thanks Stig

Exactly what I needed. I'll make good use of this lesson!

RE: vlax-curve-... functions

No, you can't use the second derivative on line segments. There's an explanation in linear algebra, and a possibly simpler one in topology once you reach the point where you can understand all the 3-ball and 2-sphere stuff, but the easiest explanation might be a sort of real-world analogy. AutoCAD works in 3-D, and most of us probably had our first real experience with derivatives in physics anyway, with stuff like v = xdt and so forth, so that approach might be the best.

Let's imagine a polyline as being the path a ball has travelled. As you remember from physics, a derivative is a rate of change. So, since we're assuming the polyline represents the position of the ball over time, the first derivative would be the velocity the ball is travelling at any particular instant in time. For straight segments, this velocity vector is in the same direction as the direction of travel. For curves, this is in a line tangent to the curve at that point. AutoCAD returns this direction vector, or first derivative, as simply a coordinate, the endpoint of a vector; the vector is assumed to start at (0,0,0). And, niftily enough, it looks like AutoCAD defined things so that the length of the vector is the length of the line for line segments, and the radius of the curve for arcs. (I wouldn't recommend using this function to get lengths or radii, though... It might have just turned out that way in the few items I checked in some poking around...)

Now, let's look at the second derivative. We remember from physics that this is acceleration, or how much the ball's velocity is changing. In other words, the second derivative is another directional vector, this one showing which way some invisible force would need to push the ball to make it travel along our polyline. And, again from our physics, this directional acceleration vector would be in the plane of the curve, and perpendicular to the direction of travel. In AutoCAD terms, the direction of this vector is perpendicular to the curve, toward its radius. And again, because of the way the math works, the length of the direction vector is equal to the radius of the curve.

However, with lines, the direction of travel is not changing. In physics terms, the lateral acceleration is 0. This implies the second derivative of a line segment must ALWAYS be 0, regardless of its direction. (Conversely, the second derivative of a curve must ALWAYS be non-zero.)

RE: vlax-curve-... functions

Thanks richards

Great explanation. Makes a complex subject seem almost simple.

Re: vlax-curve-... functions

Quote:

Originally Posted by

**stig.madsen**
Hi David,

I wrote a tiny "essay" on VLAX-CURVE functions

here that might help you get started.

If no one beats me to it I'll get back with a suggestion for the perp to object problem later.

Hi!

The URL does not work anymore,

????

Re: vlax-curve-... functions

Quote:

Originally Posted by

**marijan.marsic**
Hi!

The URL does not work anymore,

????

Try this link, relaxed-curves.

Re: vlax-curve-... functions

Quote:

Originally Posted by

**Opie**

Works!

Pretty good essay,

one thing steel unclear, the part;

"VLAX-CURVE-GETCLOSESTPOINTTOPROJECTION, that projects a point onto the curve in a specific direction and returns the closest point, if any."

Does it mean next:

Projects the point and the curve in a given plane by normal vector on it, let us say (0,0,1)--horizontal plane, and then gives us a closestpoint on that projected curve (in this case horizontal planar curve, 2 dimenzional point )

or :

projects only point on that plane, and gives us closest point on "untouched" curve

or:

????

Thank You in advance!!

Pozdrav iz Hrvatske

Re: vlax-curve-... functions

Quote:

Originally Posted by

**marijan.marsic**
Works!

Pretty good essay,

one thing steel unclear, the part;

"VLAX-CURVE-GETCLOSESTPOINTTOPROJECTION, that projects a point onto the curve in a specific direction and returns the closest point, if any."

Does it mean next:

Projects the point and the curve in a given plane by normal vector on it, let us say (0,0,1)--horizontal plane, and then gives us a closestpoint on that projected curve (in this case horizontal planar curve, 2 dimenzional point )

or :

projects only point on that plane, and gives us closest point on "untouched" curve

or:

????

Thank You in advance!!

Pozdrav iz Hrvatske

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Found :

Returns the closest point (in WCS) on a curve after projecting the curve onto a plane

(vlax-curve-getClosestPointToProjection <curve-obj> <givenPnt> <normal> [extend])

Arguments

* Demands the vl-load-com function.

<curve-obj> - the VLA-object of curve to be measured.

<givenPnt> - a point (in WCS) for which to find the nearest point on the curve.

<normal> - a normal vector (in WCS) for the plane to project onto.

[extend] - if specified and not nil, vlax-curve-getClosestPointToProjection extends the curve when searching for the nearest point.

vlax-curve-getClosestPointToProjection projects the curve onto the plane defined by the givenPnt and normal, and then calculates the nearest point on that projected curve to givenPnt. The resulting point is then projected back onto the original curve, and vlax-curve-getClosestPointToProjection returns that projected point.

Return Values

A 3D point list representing a point on the curve, if successful; otherwise nil.