Hi, is it possible to find middle point of an edge considering its total length instead of parameters?
Thanks

Rob Bachrach Fri, 02/27/2009 - 16:06

I don't know the best way, but I do have a couple of suggestions you could try:
- You could try using GCPnts_UniformAbscissa to either generate 3 points or use an abscissa of 1/2 the arc length.
- You could compute 1/2 the arc length and compute the parameter of the midpoint using a weighted binary search like algorithm

In case you are not aware, you can use BRepGProp::LinearProperties to compute the length of an edge.

About the length of Edge, I needed it the other day, so I examined a little.

a) How to calclate the length of curve
Handle(Geom_Curve) aCurve = ...;
GeomAdaptor_Curve c(aCurve );
len = GCPnts_AbscissaPoint::Length( c );

b) How to calculate the parameter at specified distance from the position ts,
GCPnts_AbscissaPoint calc( c, dist, ts );
if ( calc.IsDone() ) {
ti = calc.Parameter();
}

c) if you specify the second parameter of BRepAdaptor_CompCurve true, parameter is measured as distance.
BRepAdaptor_CompCurve c(TopoDS::Wire(aShape), Standard_True );

Fri, 02/27/2009 - 16:06

I don't know the best way, but I do have a couple of suggestions you could try:

- You could try using GCPnts_UniformAbscissa to either generate 3 points or use an abscissa of 1/2 the arc length.

- You could compute 1/2 the arc length and compute the parameter of the midpoint using a weighted binary search like algorithm

In case you are not aware, you can use BRepGProp::LinearProperties to compute the length of an edge.

Fri, 02/27/2009 - 19:02

An exception raises with the code below:

Handle(Geom_Curve) aCurve = BRep_Tool::Curve(edge,u,v);

Adaptor3d_Curve adaptor = (Adaptor3d_Curve) GeomAdaptor_Curve(aCurve);

GCPoints_UniformAbscissa abscissa(adaptor, nbPoints); // exception here

Where is my mistake here, do I get the adaptor wrong?

Thanks again

Mon, 03/02/2009 - 10:28

I don't understand the second line of the source well.

Simply, the following will work.

GeomAdaptor_Curve adaptor( aCurve )

Mon, 03/02/2009 - 10:43

About the length of Edge, I needed it the other day, so I examined a little.

a) How to calclate the length of curve

Handle(Geom_Curve) aCurve = ...;

GeomAdaptor_Curve c(aCurve );

len = GCPnts_AbscissaPoint::Length( c );

b) How to calculate the parameter at specified distance from the position ts,

GCPnts_AbscissaPoint calc( c, dist, ts );

if ( calc.IsDone() ) {

ti = calc.Parameter();

}

c) if you specify the second parameter of BRepAdaptor_CompCurve true, parameter is measured as distance.

BRepAdaptor_CompCurve c(TopoDS::Wire(aShape), Standard_True );

gp_Pnt pm = c.Value( (c.FirstParameter() + c.LastParameter())/2.0 );

TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex( pm );

Good luck!

Mon, 03/02/2009 - 12:53

I tried a) and b) and both works perfect except when the curve is line, I think parameters are infinite at that case. How can I fix it?

Thanks again

Mon, 03/02/2009 - 13:25

Sorry not parameters, length was infinite and GProp_GProps::Mass() works well for lines so everthing works fine now, thanks.