Skip to main content
added 24 characters in body; added 1 characters in body
Source Link
Szabolcs
  • 238.9k
  • 32
  • 653
  • 1.3k

I'm going to brute force it numerically.

First, let's define the function we're interested in:

fun = KnotData[{3, 1}, "SpaceCurve"] 

Imagine that this function fun[t] describes the position of a moving point in time. The the magnitude of its velocity as a function of the time t is

Sqrt[#.#] & [fun'[t]] 

I'm going to make an interpolating function out of this to speed up and simplify the numerical calculations:

v = FunctionInterpolation[Sqrt[#.#] & [fun'[t]], {t, 0, 2 Pi}] 

The integral (antiderivative) of this function will give us the distance covered as a function of time.

dist = Derivative[-1][v] 

This is a monotonouslymonotonically increasing function, so it can be inverted:

invdist = InverseFunction[dist] 

Using the inverse we can generate the times at which the point passes through the equally spaced points. Let's divide the curve into 20 equal-length segments:

times = Table[invdist[x], {x, 0, dist[2 Pi], dist[2 Pi]/20}] 

Now we can easily plot the equally spaced points:

Show[  ParametricPlot3D[fun[t], {t, 0, 2 Pi}, PlotStyle -> Black], ListPointPlot3D[fun /@ times, PlotStyle -> Directive[PointSize[0.02], Red]],   ParametricPlot3D[fun[t], {t, 0, 2 Pi}] ] 

Mathematica graphicsMathematica graphics

I'm going to brute force it numerically.

First, let's define the function we're interested in:

fun = KnotData[{3, 1}, "SpaceCurve"] 

Imagine that this function fun[t] describes the position of a moving point in time. The the magnitude of its velocity as a function of the time t is

Sqrt[#.#] & [fun'[t]] 

I'm going to make an interpolating function out of this to speed up and simplify the numerical calculations:

v = FunctionInterpolation[Sqrt[#.#] & [fun'[t]], {t, 0, 2 Pi}] 

The integral (antiderivative) of this function will give us the distance covered as a function of time.

dist = Derivative[-1][v] 

This is a monotonously increasing function, so it can be inverted:

invdist = InverseFunction[dist] 

Using the inverse we can generate the times at which the point passes through the equally spaced points. Let's divide the curve into 20 equal-length segments:

times = Table[invdist[x], {x, 0, dist[2 Pi], dist[2 Pi]/20}] 

Now we can easily plot the equally spaced points:

Show[ ListPointPlot3D[fun /@ times, PlotStyle -> Directive[PointSize[0.02], Red]],   ParametricPlot3D[fun[t], {t, 0, 2 Pi}] ] 

Mathematica graphics

I'm going to brute force it numerically.

First, let's define the function we're interested in:

fun = KnotData[{3, 1}, "SpaceCurve"] 

Imagine that this function fun[t] describes the position of a moving point in time. The the magnitude of its velocity as a function of the time t is

Sqrt[#.#] & [fun'[t]] 

I'm going to make an interpolating function out of this to speed up and simplify the numerical calculations:

v = FunctionInterpolation[Sqrt[#.#] & [fun'[t]], {t, 0, 2 Pi}] 

The integral (antiderivative) of this function will give us the distance covered as a function of time.

dist = Derivative[-1][v] 

This is a monotonically increasing function, so it can be inverted:

invdist = InverseFunction[dist] 

Using the inverse we can generate the times at which the point passes through the equally spaced points. Let's divide the curve into 20 equal-length segments:

times = Table[invdist[x], {x, 0, dist[2 Pi], dist[2 Pi]/20}] 

Now we can easily plot the equally spaced points:

Show[  ParametricPlot3D[fun[t], {t, 0, 2 Pi}, PlotStyle -> Black], ListPointPlot3D[fun /@ times, PlotStyle -> Directive[PointSize[0.02], Red]] ] 

Mathematica graphics

Source Link
Szabolcs
  • 238.9k
  • 32
  • 653
  • 1.3k

I'm going to brute force it numerically.

First, let's define the function we're interested in:

fun = KnotData[{3, 1}, "SpaceCurve"] 

Imagine that this function fun[t] describes the position of a moving point in time. The the magnitude of its velocity as a function of the time t is

Sqrt[#.#] & [fun'[t]] 

I'm going to make an interpolating function out of this to speed up and simplify the numerical calculations:

v = FunctionInterpolation[Sqrt[#.#] & [fun'[t]], {t, 0, 2 Pi}] 

The integral (antiderivative) of this function will give us the distance covered as a function of time.

dist = Derivative[-1][v] 

This is a monotonously increasing function, so it can be inverted:

invdist = InverseFunction[dist] 

Using the inverse we can generate the times at which the point passes through the equally spaced points. Let's divide the curve into 20 equal-length segments:

times = Table[invdist[x], {x, 0, dist[2 Pi], dist[2 Pi]/20}] 

Now we can easily plot the equally spaced points:

Show[ ListPointPlot3D[fun /@ times, PlotStyle -> Directive[PointSize[0.02], Red]], ParametricPlot3D[fun[t], {t, 0, 2 Pi}] ] 

Mathematica graphics