Al generar arcos a partir de tres puntos, intento esta solución:
gp_Pnt p1(data.COX[0], data.COY[0],0.);
gp_Pnt p2(data.COX[1], data.COY[1],0.);
gp_Pnt p3(data.COX[2], data.COY[2],0.);
GC_MakeArcOfCircle arc_maker(p1,p2, p3);
Si arc_maker.IsDone() devuelve true, se ha podido generar el arco, y si no es que los tres puntos están alineados.
Pero con los siguientes datos se produce un error
+ p1 {4683.67; 1267.14; 0} gp_Pnt
+ p2 {4577.44; 1260.13; 0} gp_Pnt
+ p3 {4471.2; 1253.12; 0} gp_Pnt
Son colineares (dentro de una tolerancia), pero los test de gce_makecirc.cxx no son suficientes para detectarlo: no son tan colineares como para pasar el filtro de gp::Resolution() (muy restrictivo), pero sí como para que el producto vectorial que se utiliza para calcular los datos del círculo produzca un error:
gp_Dir dir = Dir1.Crossed(Dir3);
La solución es hacer un test previo de colinearidad. Se ha utilizad:
gp_Lin l1_3(p1 , gp_Dir( gp_Vec( p1 , p2 ) )); //línea entre P1 y P2
if ( l1_3.Distance( p3 )>.1) //es arco