This commit is contained in:
watrabi
2025-09-18 17:55:52 -04:00
commit 977f1ff4b8
15030 changed files with 17324420 additions and 0 deletions
+73
View File
@@ -0,0 +1,73 @@
#include "../sg.h"
static BOOL tang_3d_pa(lpGEO_ARC a, BOOL flag_arc,
lpD_POINT b, lpD_POINT p, short *kp);
lpD_POINT tangent_to_hobj(hOBJ hobj, OBJTYPE type,
lpD_POINT vp, lpD_POINT p)
{
GEO_OBJ geo;
if(!true_geo_info(hobj, &type, &geo))
return NULL;
return tangent_to_geo_obj(type, &geo, vp, p);
}
lpD_POINT tangent_to_geo_obj(OBJTYPE type, void * geo,
lpD_POINT vp, lpD_POINT p)
{
D_POINT pp[2];
short kp;
BOOL flag_arc;
set_flag_el(&type, &flag_arc);
if(!tang_3d_pa((lpGEO_ARC)geo, FALSE, &curr_point, pp, &kp))
return NULL;
return test_cont(pp, kp, vp, type, geo, flag_arc, p);
}
static BOOL tang_3d_pa(lpGEO_ARC a, BOOL flag_arc,
lpD_POINT b, lpD_POINT p, short *kp)
{
lpGEO_ARC a2d = &el_geo1;
sgFloat xc, yc;
short i;
set_el_geo();
*kp = 0;
if(!test_wrd_arc(a, &flag_arc))
return FALSE;
trans_arc_to_acs(a, flag_arc, a2d, el_g_e, el_e_g);
o_hcncrd(el_g_e, b, p);
if(fabs(p->z) >= eps_d){
el_geo_err = EL_NO_ARC_PLANE;
return FALSE;
}
xc = p->x/2.;
yc = p->y/2.;
if(!(*kp = intersect_2d_cc(0., 0., a->r, xc, yc, hypot(xc, yc), p))){
el_geo_err = EL_NO_TANG;
return FALSE;
}
if(flag_arc)
if(!test_in_arrey(p, kp, OARC, TRUE, a2d)){
el_geo_err = EL_NO_TANG;
return FALSE;
}
for(i = 0; i < *kp; i++)
o_hcncrd(el_e_g, &p[i], &p[i]);
return TRUE;
}