[cgma-dev] r2494 - cgm/trunk/geom/OCC

Jason Kraftcheck kraftche at cae.wisc.edu
Tue Dec 23 13:43:53 CST 2008


janehu at mcs.anl.gov wrote:
> Author: janehu
> Date: 2008-12-23 11:06:19 -0600 (Tue, 23 Dec 2008)
> New Revision: 2494
> 
> Modified:
>    cgm/trunk/geom/OCC/OCCModifyEngine.cpp
> Log:
> Updated for create_arc_three function to make sure the parameter space are within the triangle range.
> 

Why require that?  Three coplanar, non-collinear curves that not all 
intersect at the same point can define four possible circles.  Any three 
such lines must form a triangle.  One possible circle seems to be the 
one you are considering: the inner circle of the triangle.  The other 
three circles are outside the triangle, tangent to one of the lines on 
the triangle boundary and tangent to the other two lines at a point 
outside of the triangle.  Given that the input to this function is a set 
of *bounded* curves, you should choose the circle for which all tangent 
points are within the bounded region of each curve, rather than those 
that are within the portion of the lines that form the triangle.

- jason




> Modified: cgm/trunk/geom/OCC/OCCModifyEngine.cpp
> ===================================================================
> --- cgm/trunk/geom/OCC/OCCModifyEngine.cpp	2008-12-22 19:17:36 UTC (rev 2493)
> +++ cgm/trunk/geom/OCC/OCCModifyEngine.cpp	2008-12-23 17:06:19 UTC (rev 2494)
> @@ -4840,20 +4840,47 @@
>    } 
>    
>    //0.check that non of the curves are parallel of each other.
> -  double u11, u12, u21, u22, u31, u32;
> -  occ_crv1->get_param_range(u11, u12);
> -  occ_crv2->get_param_range(u21, u22);
> -  occ_crv3->get_param_range(u31, u32);
> -  
> -  CubitVector pt1, pt2, pt3;
> -  occ_crv1->position_from_u(u11, pt1);
> -  occ_crv2->position_from_u(u21, pt2);
> -  occ_crv3->position_from_u(u31, pt3);
> +  DLIList<CubitVector*> intscts;
> +  CubitVector vt1, vt2, vt3;
> +  CubitBoolean none = CUBIT_FALSE;
> +  OCCQueryEngine::instance()->get_intersections(curve1, curve2, intscts,none,none);
> +  vt1 = *intscts.get();
> +  intscts.clean_out();
> +  OCCQueryEngine::instance()->get_intersections(curve2,curve3, intscts,none,none);
> +  vt2 = *intscts.get();
> +  intscts.clean_out();
> +  OCCQueryEngine::instance()->get_intersections(curve3, curve1, intscts,none,none);
> +  vt3 = *intscts.get();
>  
> +  double u, u11, u12, u21, u22, u31, u32;
> +  u12 = occ_crv1->u_from_position(vt1);
> +  u11 = occ_crv1->u_from_position(vt3);
> +  if(u12 < u11)
> +  {
> +    u = u12;
> +    u12 = u11;
> +    u11 = u;
> +  }
> +  u22 = occ_crv2->u_from_position(vt1);
> +  u21 = occ_crv2->u_from_position(vt2);
> +  if(u22 < u21)
> +  {
> +    u = u22;
> +    u22 = u21;
> +    u21 = u;
> +  } 
> +  u32 = occ_crv3->u_from_position(vt2);
> +  u31 = occ_crv3->u_from_position(vt3);
> +  if(u32 < u31)
> +  {
> +    u = u32;
> +    u32 = u31;
> +    u31 = u;
> +  }
>    CubitVector tangent1, tangent2, tangent3;
> -  occ_crv1->get_tangent(pt1, tangent1);
> -  occ_crv2->get_tangent(pt2, tangent2);
> -  occ_crv3->get_tangent(pt3, tangent3); 
> +  occ_crv1->get_tangent(vt1, tangent1);
> +  occ_crv2->get_tangent(vt2, tangent2);
> +  occ_crv3->get_tangent(vt3, tangent3); 
>  
>    CubitVector normal1 = tangent1 * tangent2;
>    CubitVector normal2 = tangent2 * tangent3;
> @@ -4889,18 +4916,6 @@
>  
>    //2.create curves to bisection each of the angle passing through the
>    // vertices of the triangle
> -  DLIList<CubitVector*> intscts;
> -  CubitVector vt1, vt2, vt3;
> -  OCCQueryEngine::instance()->get_intersections(curve1, curve2, intscts,0,0);
> -  vt1 = *intscts.get(); 
> -  intscts.clean_out();
> -  OCCQueryEngine::instance()->get_intersections(curve2,curve3, intscts,0,0);
> -  vt2 = *intscts.get();
> -  intscts.clean_out();
> -  OCCQueryEngine::instance()->get_intersections(curve3, curve1, intscts,0,0);
> -  vt3 = *intscts.get();
> -  //Create 6 curves, find 3 of them which have intersection points inside
> -  // the third curve
>    CubitVector t_curve11 = 
>           vectorRotate(angle1/2.0, normal1, tangent1);  
>    t_curve11.normalize();
> @@ -4934,10 +4949,9 @@
>    //3. find the intersection of each of the bisection curve with the third curve
>    CubitVector int_pt1, int_pt2, int_pt3;
>    intscts.clean_out();
> -  CubitBoolean none = CUBIT_FALSE;
>    OCCQueryEngine::instance()->get_intersections(curve3, vt1, p11, intscts,none,none);
>    CubitVector int_pt = *intscts.pop(); 
> -  double u = occ_crv3->u_from_position (int_pt);
> +  u = occ_crv3->u_from_position (int_pt);
>    if(u >= u31-tol && u <= u32+tol) //found intersection point
>      int_pt1 = int_pt;
>    else
> 




More information about the cgma-dev mailing list