N_PKT6-29PM.CPP
上传用户:shonly
上传日期:2022-06-05
资源大小:1939k
文件大小:120k
源码类别:

多媒体

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "sysdef.h"
  3. #include "math.h"
  4. #include "e_gvar.h"
  5. #include "e_uibas.h"
  6. #include "e_math3d.h"
  7. #include "e_curve.h"
  8. #include "e_surface.h"
  9. #include "e_nc.h"
  10. #include "e_datum.h"
  11. #include "e_system.h"
  12. #include "resource.h"
  13. #include "ToolPage.h"
  14. #include "MillParaPage.h"
  15. #include "ncpktpage.h"
  16. #include "ncplungepage.h"
  17. #include "ncpktproSheet.h"
  18. #include "Nc.h"
  19. //ZERO = 1.0E-5
  20. #define CCW   1    //
  21. #define CW    -1     //
  22. #define EP  10e-1
  23. #define EL  10e-1
  24. #define UPER   10e2
  25. #define LINEZ  10e-2
  26. #define LL  0  //line line bisector
  27. #define LC  1  //line circle bisector 
  28. #define CC  2  //circle circle bisector
  29. #define CCP 3  //concenter circle circle bisector
  30. #define LLP 4  //parallel line line bisector
  31. #define CIC 5  //circle in circle bisector //ellipse
  32. #define INFINITY  1  //
  33. #define LIMITED  0  //
  34. #define STEP  0.2//画平分线的步长
  35. #define SINGLE  0
  36. #define MULI    1
  37. #define VCOMMON 1
  38. #define CLOSED  2
  39. #define SINGLEPLF  0
  40. #define MULIPLF    1
  41. #define ISLAND     0
  42. #define LOOP       1
  43. #define ERRO      -100
  44. #define REFLEX    -1
  45. #define UNREFLEX   1
  46. ///////////////////////
  47. static int myflag=0;
  48. typedef struct bisector{
  49. double t1,t2,tmin,tmax;
  50. int infinite;//limitations/INFINITY/LIMITLINE
  51. int     bitype;//类型LC/CC/LL
  52. int     limit;
  53. double x1,x2,x3,x4,x5,x6,x7,x8;
  54. double y1,y2,y3,y4,y5,y6,y7,y8;
  55. double  a1,a2,a3,a4;
  56. int   m1,m2;
  57. }VBNS,*PVBNS;//表示单个角平分线
  58. typedef struct contournodesingle{
  59. int type;//直线或是弧
  60. PRIMITIVE element;//PRIMITIVE
  61. int reflex;//if 1,means the reflex node;
  62. int clockwise;//,段的方向 CCW OR CW
  63. }VCNS,*PVCNS;//?//单个轮廓线
  64. typedef struct contournodeinform{
  65. PVCNS cns;
  66. struct contournodeinform *ccw,*cw;
  67. }VCNI,*PVCNI;//一组轮廓线
  68. typedef struct besectorinform{
  69. PVBNS bns;//PVBNS
  70. PVCNS selfcns,othercns;//PVCNs
  71. int   flag;//使用过?0/1 
  72. }VBNI,*PVBNI;//单个角平分线,有对应轮廓线的信息
  73. typedef struct bisectorlinkinform {
  74. PVBNI bni;//PVBNI
  75. int clockwise;//角平分线的走向,0(顺)/1(逆)
  76. struct bisectorlinkinform *next,*last;//struct bisectorlinkinform
  77. }VBLI,*PVBLI;//一组角平分线
  78. typedef struct contournodebisectorlink{
  79. PVCNS cns;//PVCNI,节点
  80. PVBLI bli;//ccw direction;PVBLI
  81. int   flag;//是否是终节点?-1/1
  82. struct contournodebisectorlink *ccw,*cw;
  83. }VCNBL,*PVCNBL;//一个VORONOI 单元
  84. typedef struct profilelef{
  85. PVCNBL scnbl,ecnbl;//PVCNBL,一个含有节点和角平分线的voronoi 结构
  86. int    type;//单节点否?SINGLEPLF/MULIPLF
  87. struct profilelef *cw,*ccw;//f
  88. }VPLF,*PVPLF;//树叶
  89. typedef struct profilelink{
  90. PVPLF splf,eplf;//叶子的首末点   
  91. int   ptype;   //whether be a single reflex or a conected closed profile;
  92.    //if ptype= SINGLE and reflex=1,mean the reflexmax profile;
  93.    //if ptype= COMMON means the profile within an closed contour;
  94.                //if ptype= CLOSED means the closed contour include the isle 
  95.                //and the whole closed contour;   
  96.                    //in the other hand,we can only use one int for the useage of the label task,
  97.                    //for the safe reason I use two;
  98. }VPL,*PVPL;//一个轮廓环,树枝/也可是一棵树
  99. ///////////////////////above is the data used ,//ygm
  100. extern __declspec(dllimport) int DrawLine(double x0,double y0,double z0,
  101.  double x1,double y1,double z1,int color);
  102. //////////////////////////////////////////////////////////////////////////////ygm
  103. PVPLF  vmallocplf();//;叶
  104. PVCNBL vmalloccnbl();//;voronoi 节点
  105. PVBLI  vmallocbli();//;平分线连
  106. PVBNI  vmallocbni();//;角平分线
  107. PVCNI  vmalloccni();//;
  108. PVBNS  vmallocbns();//;
  109. PVCNS  vmalloccns();//;
  110. ////////////////...........................
  111. void   vdeletevlf(PVPL vpl);
  112. void   vdeleteplf(PVPLF plf);
  113. void   vdeletebli(PVBLI bli);
  114. //////////////////...............................................
  115. void  vdisplaybnstest(VBNS bi);
  116. void  vdisplayplv(VPL pl);
  117. void  vgainpointseg(PVCNS *c,PXYZ p);//;
  118. void  vdisplaysinglebi(VBNS bi,int color);//;tested
  119. void  vdisplayvoronoi(VCNI cnode);//;tested
  120. /////////////////..................
  121. void  vgainbisectorll(PVCNS l1, PVCNS l2, PVBNS *bi);//;tested unfinished
  122. void  vgainbisectorlc(PVCNS l1, PVCNS c2, PVBNS *bi);//;tested yet unfinished
  123. void  vgainbisectorcc(PVCNS c1, PVCNS c2, PVBNS *bi);//;tested yet unfinished
  124. void  vgainbisector(PVCNS c1, PVCNS c2, PVBNS *bi);
  125. /////////////////..................
  126. void  vgainintersectlll(PVCNS l1,PVCNS l2,PVCNS l3,int *i,double t[2]);//;tested
  127. void  vgainintersectllc(PVCNS l1,PVCNS l2,PVCNS c3,int *i,double t[2]);//;parallel untreated yet tested
  128. void  vgainintersectlcc(PVCNS l1,PVCNS c2,PVCNS c3,int *i,double t[2]);//;testing unfinished
  129. void  vgainintersectccc(PVCNS c1,PVCNS c2,PVCNS c3,int *i,double t[2]);//;testing unfinished
  130. void  vgainintersect(PVCNS c1,PVCNS c2,PVCNS c3,int *i,double t[2]);
  131. void  vgainintersectmvaluebns(PVBNS bns1,PVBNS bns2,double *t,int mblis,int * mvalue);
  132. void  vgainintersectmvaluecns(PVBNS bns,PVCNS c1,PVCNS c2,PVCNS c3,double t,int *mvalue); 
  133. ////////////////....................................................
  134. void vaddpointsegpre(PVCNBL cnbl);//cw 方向
  135. void vaddpointseglast(PVCNBL cnbl);
  136. void  vfindarcendpointo(PARC arc,PXYZ *pt,int *clockwise);
  137. PXYZ  vgetintersectpoint(VBNS bi,double t,int m);//;finished
  138. PXYZ  vgetintersectpointlc(VBNS bi,double t,int m);//;finished
  139. void  vgetvalue(double a,double b,double c,double t[2],int *i);//;tested
  140. void  vgetparaline(PLINE l,double *a,double *b,double *c);//;tested and it is o of the important function
  141. ///////////////......................................................
  142. void  vgetllimit(PVCNS cn,double *a,double *b,double *c,double *t);//parameter line;
  143. void  vgetcflimit(PVCNS cn,double *a,double *b,double *c,double *t);//paraeter line;
  144. void  vgetcslimit(PVCNS cn,double *a,double *b,double *c,double *t);//parameter line;
  145. /////////////.........................................................
  146. void vgainarrangedcnbl(PCURVE curve,PVCNBL *cnbl,int itype);
  147. void  vgainfistbisectorpoint(PVCNBL lcnbl,PVCNBL rcnbl);
  148. void  vgainsinglebisector(PVCNBL cnbl,PVBLI *bt);//;
  149. void  vchangepcurvetocnode(PCURVECMP curcmp,PVCNBL vnode);//
  150. int   vgetlm(PVCNS l);
  151. ///////////////........................................................
  152. int  vgetclockwisebli(PVBLI bli);
  153. double vmultipointvector(PXYZ v1,PXYZ v2);
  154. double vmultiplayvector(PXYZ v1,PXYZ v2);
  155. //////////////........................
  156. PXYZ  vgetplproject(double x,double y,PLINE line);
  157. int   vgetposition(double x,double y,PXYZ p0,PXYZ p1);
  158. int   vgetposition(double x,double y,double x0,double y0,double x1,double y1);//
  159. void  vtransintovcns(PCURVE pi);
  160. PVPL  vgaindoublelink(PCURVECMP cmp);
  161. /////////////..............................................................
  162. int  vgainintersectortl(PVCNBL lcnbl,PVCNS rcns,PVBNS bns,int startflag,int directionflag,PVBLI blif,double *t,int *m,PVBLI *bli);
  163. int  vgainintersectortr(PVCNBL rcnbl,PVCNS lcns,PVBNS bns,int startflag,int directionflag,PVBLI blif,double *t,int *m,PVBLI *bli);
  164. int  vcompareright(int m1,double t1,int m2,double t2);
  165. int  vcomparerights(int m1,double t1, int m2,double t2, int m3,double t3, int m4,double t4, int *mm1,double *tt1,int *mm2,double *tt2);
  166. void vmergesingleprofile(PVPL profile);
  167. int  vjudgeprofilesingle(PVPL profile);
  168. void vdivideprofiletwo(PVPL profile,PVPL pl,PVPL pr);
  169. void vgainsingleplfbli(PVPLF plf);
  170. void vmergetwoprofile(PVPL pl,PVPL pr,PVPL *profile);
  171. ////////////................................................................
  172. void  vchangepcurvetocnblloop(PCURVE curve,PVCNBL *cnbl);
  173. void vgainprofilebycurve(PCURVE curve,PVPL *vpl,int itype);
  174. void vjugedirection(PVCNBL cnbl,int *flag);
  175. double vgainangleofvector(PXYZ v);
  176. void  vmergecontour();
  177. void  vdividetheprofile(PVPL i_pr,PVPL o_prl,PVPL o_prr);
  178. PVPL  vgainvoronoi(PCOMPOSITE cmp,PCURVECMP island[],int num);
  179. //////ygm..///////////////////////////////////////////////////////////////////////
  180. extern __declspec(dllimport) void ReSaveProfileToolRCompPara(PPATH2D path);
  181. extern __declspec(dllimport) int g_pkt_RComp;
  182. extern void PreSetSpeedAndHeight(CSpeedPage *m_Page2);
  183. extern void ModifySpeedAndHeight(CSpeedPage *m_Page2);
  184. ///1999-6-7 ygr
  185. extern void SaveContourToParameter(NCPARA *m_para,char *name,PSELGRP hsel,PCURVECMP curvecmp);
  186. extern void SaveRefPoint2DToParameter(NCPARA *m_para,char *name,XY point);
  187. extern void SaveIntegerToParameter(NCPARA *m_para,char *name,int integer);
  188. void ncCreatPathTree(unsigned long handle,NCPARA para,char *name);
  189. ///1999-6-7 ygr
  190. void PreSetPktParameter(CNcPktSheet *spktSheet);
  191. void ModifyPktParameter(CNcPktSheet *spktSheet);
  192. extern PNCPARA MallocNcpara();
  193. extern void GiveOldParaToNewPara(PNCPARA m_oldpara,PNCPARA m_newpara);
  194. extern void SaveRefPoint3DToParameter(NCPARA *m_para,char *name,XYZ point);
  195. extern void SaveNCWCSToParameter(NCPARA *m_para,char *name,NCWCS wc);
  196. ///////////////////////////////////////////////////////////////////////ygm
  197. ////////////////////////////////////////////////////////////////////////////
  198. int AppNcProfile(int &step,int &flag){return 1;}
  199. void PreSetPktParameter(CNcPktSheet *spktSheet){}
  200. void ModifyPktParameter(CNcPktSheet *spktSheet){}
  201. void PreSetProParameter(CNcProSheet *sproSheet){}
  202. void ModifyProParameter(CNcProSheet *sproSheet){}
  203. //////////////////////////////////////////////
  204. ////////////////////////////////////////////////////////////////////////////
  205. int AppNcPkt(int &step,int &flag)//平面区域加工
  206. {
  207. static    XYZ       point;
  208. static    PCURVECMP pickcur=NULL;
  209. static    PCURVE     cur;
  210. static    PSELGRP   psel=NULL,sel=NULL;
  211. static    PCURVECMP islands=NULL,tisl=NULL;
  212. int ret,num;
  213. double pln_mat[4][4];
  214. PPATH2D path=NULL;
  215. PSELGRP seli=NULL;
  216. PCURVECMP isl=NULL,*islandin=NULL;
  217. CNcPktSheet pktSheet;
  218. static    PATH2D    temppath; //ygr 1999-6-7轨迹重算
  219. NCWCS     wc;
  220. CString sTemp; // gkq: 为了存储资源字符串
  221. ////////////test ygm
  222. PVPL vpl;
  223. VBNS a;
  224. PVCNS l1,l2,l3,c1,c2,c3;
  225. PLINE  line1,line2,line3;
  226. PARC arc1,arc2,arc3;
  227. PVCNBL cnbl;
  228. double t[2];
  229. int i;
  230. // ASSERT(0);
  231. a.x1=56;a.x2=6;a.x3=7;a.x4=2;a.x5=50;a.x6=5;a.x7=2;a.x8=5;
  232. a.y1=44;a.y2=0;a.y3=80;a.y4=2;a.y5=67;a.y6=5;a.y7=4;a.y8=0;
  233. a.m1=1;a.m2=1;a.tmin=1;a.t1=10;a.infinite=0;a.bitype=2;
  234. l1=vmalloccns();l1->clockwise=CCW;l1->type=CAXLINE;l1->reflex=0;
  235. l2=vmalloccns();l2->clockwise=CCW;l2->type=CAXLINE;l2->reflex=0;
  236. l3=vmalloccns();l3->clockwise=CCW;l3->type=CAXLINE;l3->reflex=0;
  237. c1=vmalloccns();c1->clockwise=CW;c1->type=CAXARC;c1->reflex=0;
  238. c2=vmalloccns();c2->clockwise=CW;c2->type=CAXARC;c2->reflex=0;
  239. c3=vmalloccns();c3->clockwise=CCW;c3->type=CAXARC;c3->reflex=0;
  240. //bi=vmallocbns();
  241. line1=l1->element.line=MallocLine();
  242. line1->p0.x=0;line1->p0.y=-1000;line1->p1.x=0;line1->p1.y=1000;
  243. line2=l2->element.line=MallocLine();
  244. line2->p0.x=0;line2->p0.y=0;line2->p1.x=100;line2->p1.y=0;
  245. line3=l3->element.line=MallocLine();
  246. line3->p0.x=100;line3->p0.y=0;line3->p1.x=0;line3->p1.y=100;
  247. arc1=c1->element.arc=MallocArc();
  248. arc1->pc.x=0;arc1->px.x=10;arc1->py.y=10;arc1->a=3.14*2;
  249. arc1->pc.y=-10;
  250. arc1->r=5;
  251. arc2=c2->element.arc=MallocArc();//cw
  252. arc2->pc.x=10;arc2->px.x=10;arc2->px.y=0;
  253. arc2->pc.y=0;arc2->py.x=0;arc2->py.y=10;
  254. arc2->r=10;
  255. arc3=c3->element.arc=MallocArc();
  256. arc3->pc.x=0;
  257. arc3->pc.y=0;
  258. arc3->r=100;
  259. XYZ o;
  260. XYZ v;
  261.     v.x=4;v.y=6;
  262. // PSTR3D o_p;
  263. int yyy = RGB(200,100,0);
  264. vgainintersect(c1,c2,l2,&i,t);
  265. // vdisplaybnstest(*bi);
  266. ///////////////////test
  267. switch(step)
  268. {
  269. case 0://填写参数表
  270. if(g_Mod6 != 1111)
  271. {
  272. AfxMessageBox(IDS_ILLIGIAL_MODE);
  273. uiEndCommand();
  274. return 0;
  275. }
  276. psel=NULL;
  277. islands=NULL;
  278. islandin=NULL;
  279. pickcur=NULL;isl=NULL;
  280. cla_bod=NULL;
  281. cla_isl=NULL;
  282. temppath.para.entity = NULL; //1999-6-9 ygr
  283. temppath.para.parameter = NULL;//1999-6-9 ygr
  284. path=NULL;
  285. uiPromptID(IDS_FILL_NCPARA);
  286. AssignValueToPktCutPara();
  287. uiRegisterPopMenu(IDR_CONTOUR_PICK_TOOLS,0);
  288. //uiPrompt("拾取轮廓:");
  289. uiPromptID(IDS_PICK_CONTOUR);
  290. //vdisplaysinglebi(bi);
  291. break;
  292. case 1://拾取轮廓
  293. ret=CaxGetCloseContour(&pickcur,&psel);
  294. point= PickBuffer[0].pick_pt;///what is the pickBuffer?
  295. if(ret!=PICK_OK)
  296. {
  297. uiEndCommand();
  298. return 1;
  299. }
  300. //// ygr 1999-6-7/// 轨迹重算
  301. //CaxGetNcPlaneMatrix(pln_mat);
  302. //SaveNcPlaneMatrixToParameter(&(temppath.para),"nc_plane_matrix",pln_mat);
  303. GetNCWcsFromSystemWCS(&wc);//get wc
  304. SaveNCWCSToParameter(&(temppath.para),"nc_working_coordinate",wc);
  305. SaveContourToParameter(&(temppath.para),"contour",psel,pickcur);
  306. SaveRefPoint3DToParameter(&(temppath.para),"referance_point",point);
  307. //// ygr 1999-6-7///轨迹重算
  308. for(sel = psel;sel->next != NULL;sel = sel->next)
  309. ;
  310. step = 2;
  311. //uiPrompt("拾取岛:");
  312. uiPromptID(IDS_PICK_ISLANDS);
  313. uiRegisterPopMenu(IDR_ISLAND_PICK_TOOLS,0);
  314. break;
  315. case 2://拾取岛屿
  316. ret = CaxGetIsland(&isl,&seli);
  317. if(ret==PICK_ESC)
  318. goto finish;
  319. else if(ret==PICK_FSH)
  320. goto cal;
  321. else
  322. {
  323. SaveContourToParameter(&(temppath.para),"islands",seli,isl);
  324. if(islands == NULL)
  325. tisl = islands = isl;
  326. else
  327. tisl = tisl->next = isl;
  328. sel->next = seli;
  329. for(sel = seli;sel->next != NULL;sel = sel->next)
  330. ;
  331. }
  332. break;
  333. }
  334. return 1;
  335. cal:
  336. uiRegisterPopMenu();
  337. SaveParameterToPocketPath(&temppath);
  338. if(g_AutoPath==1)
  339. {
  340. PNCPARA para;
  341. para = NULL;
  342. para = MallocNcpara();
  343. GiveOldParaToNewPara(&(temppath.para),para);
  344. g_NcparaList.AddTail(para);
  345. goto finish;
  346. }
  347. num=0;
  348. islandin=NULL;
  349. for(tisl=islands;tisl!=NULL;tisl=tisl->next)
  350. num++;
  351. num--;
  352. if(num>=0)
  353. {
  354. islandin=new PCURVECMP[num+1];
  355. if(islandin==NULL) uiNoMemoryError();
  356. for(int i=0;i<=num;i++)
  357. {
  358. islandin[i]=islands;
  359. islands=islands->next;
  360. }
  361. }
  362. ptx = new PT_SECT[2*MaxPktSegNumber];
  363. pty = new PT_SECT[2*MaxPktSegNumber];
  364. if(ptx==NULL||pty==NULL) uiNoMemoryError();
  365. //uiPrompt("生成加工轨迹,请稍等...");
  366. uiPromptID(IDS_WAITING);
  367. CaxGetNcPlaneMatrix(pln_mat);
  368. cur=pickcur->cmp->curve;
  369. vchangepcurvetocnblloop(pickcur->cmp->curve,&cnbl);
  370. vgainprofilebycurve(pickcur->cmp->curve,&vpl,CCW);
  371. vmergesingleprofile(vpl);
  372. vdisplayplv(*vpl);
  373. // vjugedirection(cnbl,&flag,1);
  374. //va:  t=vgainangleofvector(&v);
  375. //    goto va;
  376. // path=pktFlwPathCreat(pickcur,islandin,num,point,pln_mat);
  377. // path=NULL;
  378. if(path==NULL)
  379. {
  380. delete[] ptx;
  381. delete[] pty;
  382. FreePathPara(temppath.para);
  383. goto finish;
  384. }
  385. //SaveParameterToPocketPath(path);
  386. path->para=temppath.para; 
  387. cursor_off();
  388. InitialUndoBuffer();
  389. GetNCWcsFromSystemWCS(&(path->wc));
  390. CaxDrawPath2D(SavePath2D(path));
  391. //ncCreatPathTree(path->handle,path->para,"平面区域加工");
  392. sTemp.LoadString( IDS_PlanePocketCutStr );
  393. char str[100];
  394. strcpy(str, (LPCTSTR)sTemp);
  395. ncCreatPathTree(path->handle,path->para, str);
  396. uiSetModifiedFlag(TRUE);
  397. cursor_on();
  398. delete[] ptx;
  399. delete[] pty;
  400. if(islandin!=NULL)
  401. delete[] islandin;
  402. islands=NULL;
  403. islandin=NULL;
  404. pickcur=NULL;isl=NULL;
  405. cla_bod=NULL;
  406. cla_isl=NULL;
  407. path=NULL;
  408. finish:
  409. ptx=pty=NULL;
  410. InitialSelgrp(psel);
  411. uiEndCommand();
  412. return 1;
  413. }
  414. /////////...................................................................
  415. PVBNS vmallocbns()
  416. {
  417. PVBNS bi=NULL;
  418. bi = (PVBNS)malloc(sizeof(VBNS));
  419. if(NULL == bi)uiNoMemoryError();
  420. bi->a1=bi->a2=bi->a3=bi->a4=0.0;
  421. bi->x1=bi->x2=bi->x3=bi->x4=bi->x5=bi->x6=bi->x7=bi->x8=0;
  422. bi->y1=bi->y2=bi->y3=bi->y4=bi->y5=bi->y6=bi->y7=bi->y8=0;
  423. bi->m1=bi->m2=1;
  424. bi->tmin=bi->t1=bi->t2=0;
  425. bi->bitype=-1;
  426. bi->infinite = 1;
  427. bi->limit =0;
  428. return bi;
  429. }
  430. PVCNS vmalloccns()
  431. {
  432. PVCNS ci;
  433. ci = NULL;
  434. ci = (PVCNS)malloc(sizeof(VCNS));
  435. if(NULL==ci)uiNoMemoryError();
  436. ci->clockwise = CCW;
  437. ci->element.line=NULL;
  438. ci->reflex=0;
  439. ci->type=CAXLINE;
  440. return ci;
  441. }
  442. PVCNI vmalloccni()
  443. {
  444. PVCNI vi;
  445. vi = NULL;
  446. vi = (PVCNI)malloc(sizeof(VCNI));
  447. if(NULL == vi)uiNoMemoryError();
  448. vi->ccw=NULL;
  449. vi->cw=NULL;
  450. vi->cns=NULL;
  451. return vi;
  452. }
  453. PVBNI vmallocbni()
  454. {
  455. PVBNI bi;
  456. bi = NULL;
  457. bi = (PVBNI)malloc(sizeof(VBNI));
  458. if(NULL == bi)uiNoMemoryError();
  459. bi->bns=NULL;
  460. bi->selfcns=NULL;
  461. bi->othercns=NULL;
  462. bi->flag=0;
  463. return bi;
  464. }
  465. PVBLI  vmallocbli()//;平分线连
  466. {
  467. PVBLI bli=NULL;
  468. bli=new VBLI;
  469. ASSERT(bli);
  470. bli->last=NULL;
  471. bli->next=NULL;
  472. bli->clockwise=CCW;
  473. bli->bni=NULL;
  474. return bli;
  475. }
  476. PVCNBL vmalloccnbl()//;voronoi 节点
  477. {
  478. PVCNBL cnbl;
  479. cnbl=new VCNBL;
  480. cnbl->ccw=NULL;
  481. cnbl->cw=NULL;
  482. cnbl->flag = 0;
  483. cnbl->bli=NULL;
  484. cnbl->cns=NULL;
  485. return cnbl;
  486. }
  487. PVPL vmallocpl()
  488. {
  489. PVPL  pl=NULL;
  490. pl=new VPL;
  491. ASSERT(pl);
  492. pl->eplf=NULL;
  493. pl->ptype=SINGLE;
  494. pl->splf=NULL;
  495. return pl;
  496. }
  497. PVPLF vmallocplf()
  498. {
  499. PVPLF plf=NULL;
  500. plf =(PVPLF)malloc(sizeof(VPLF));
  501. if(NULL==plf)uiNoMemoryError();
  502. plf->ccw=NULL;
  503. plf->cw=NULL;
  504. plf->ecnbl=plf->scnbl=NULL;
  505. plf->type=SINGLEPLF;
  506. return plf;
  507. }
  508. ///
  509. void vdeletebli(PVBLI bli)
  510. {
  511. if(bli!=NULL)
  512. {
  513. if(bli->bni != NULL)
  514. delete bli->bni;
  515. else
  516. AfxMessageBox("you have attempt to deleter NULL bni");
  517. delete bli;
  518. bli = NULL;
  519. }
  520. else{
  521. AfxMessageBox("you have attempt to deleter NULL bli");
  522. }
  523. return ;
  524. }
  525. void vdeleteplf(PVPLF plf)
  526. {
  527. if(!plf)
  528. {
  529. if(plf->type==SINGLE)
  530. {
  531. vdeletebli(plf->scnbl->bli);
  532. delete plf->scnbl;
  533. delete plf;
  534. }
  535. else
  536. {
  537. vdeletebli(plf->scnbl->bli);
  538. delete plf->scnbl;
  539. vdeletebli(plf->ecnbl->bli);
  540. delete plf->ecnbl;
  541. delete plf;
  542. }
  543. }
  544. else
  545. {
  546. AfxMessageBox("you attempt to delete a null plf");
  547. }
  548. return;
  549. }
  550. void vdeletevendpointcnbl(PVCNBL cnbl)
  551. {
  552. ASSERT(cnbl);
  553. PVBLI bli;
  554. PVBLI blit;
  555. if(cnbl->flag==1)
  556. {
  557. bli = cnbl->bli;
  558. while(bli!=NULL){
  559. blit = bli->next;
  560. vdeletebli(bli);
  561. bli = blit;
  562. }
  563. delete cnbl->cns;
  564. delete cnbl;
  565. cnbl = NULL;
  566. }
  567. else 
  568. {
  569. AfxMessageBox("please check the data before you delete the cnbl");
  570. }
  571. return;
  572. }
  573. /////.................................................................
  574. void  vdisplaybnstest(VBNS bi)
  575. {
  576. PLINE line;
  577. double x1,x2,x3,x4,x5,x6,x7,x8,m1;
  578. double y1,y2,y3,y4,y5,y6,y7,y8,m2;
  579. double tmax,t1,t2;
  580. double tt,t0;
  581. double tm;
  582. XYZ p0,p1,p2,p3,p4;
  583. x1=bi.x1;x2=bi.x2;x3=bi.x3;x4=bi.x4;x5=bi.x5;x6=bi.x6;x7=bi.x7;x8=bi.x8;
  584. y1=bi.y1;y2=bi.y2;y3=bi.y3;y4=bi.y4;y5=bi.y5;y6=bi.y6;y7=bi.y7;y8=bi.y8;
  585. t1 = bi.t1;m1 = bi.m1;t0 = bi.tmin;
  586. t2 = bi.t2;m2 = bi.m2;tmax = bi.tmax;
  587. line = MallocLine();
  588. p1.x = p0.x = 0;
  589. p1.y = p0.y = 0;
  590. p1.z = p0.z = 0;
  591. int fff = 0;
  592. for(tm = -UPER;tm<UPER;tm+=STEP)
  593. {
  594. t0 = tm+STEP;
  595. tt = pow(x5+x6*(t0),2)-pow(x7+x8*(t0),2);
  596. if(tt>=0)
  597. {
  598. if(fff==0)
  599. {
  600. p0.x=x1-x2-x3*(t0)+x4*sqrt(tt);
  601. p0.y=y1-y2-y3*(t0)-y4*sqrt(tt);
  602. p1.x=x1-x2-x3*(t0)-x4*sqrt(tt);
  603. p1.y=y1-y2-y3*(t0)+y4*sqrt(tt);
  604. fff=1;
  605. continue;
  606. }
  607. p3.x=x1-x2-x3*(t0)+x4*sqrt(tt);
  608. p3.y=y1-y2-y3*(t0)-y4*sqrt(tt);
  609. p4.x=x1-x2-x3*(t0)-x4*sqrt(tt);
  610. p4.y=y1-y2-y3*(t0)+y4*sqrt(tt);
  611. }
  612. else continue;
  613. p3.z = 0.0;
  614. p4.z = 0.0;
  615. line->p0 = p0;
  616. line->p1 = p3;
  617. p0=p3;
  618. SaveLine(line);
  619. CaxDrawLine(line);
  620. line=NULL;
  621. line= MallocLine();
  622. ////
  623. line->p0 = p1;
  624. line->p1 = p4;
  625. p1 = p4;
  626. SaveLine(line);
  627. CaxDrawLine(line);
  628. line=NULL;
  629. line= MallocLine();
  630. }
  631. return;
  632. }
  633. void  vdisplaysinglebi(VBNS bi,int color)
  634. {
  635. PCURVECMP cur=NULL;
  636. PLINE line;
  637. double x1,x2,x3,x4,x5,x6,x7,x8,m1;
  638. double y1,y2,y3,y4,y5,y6,y7,y8,m2;
  639. double tmax,t1,t2,tmin;
  640. double tm,tstep;
  641. double detax,detay,detax0,detay0;
  642. XYZ p0,p1;
  643. x1=bi.x1;x2=bi.x2;x3=bi.x3;x4=bi.x4;x5=bi.x5;x6=bi.x6;x7=bi.x7;x8=bi.x8;
  644. y1=bi.y1;y2=bi.y2;y3=bi.y3;y4=bi.y4;y5=bi.y5;y6=bi.y6;y7=bi.y7;y8=bi.y8;
  645. t1 = bi.t1;m1 = bi.m1;tmin = bi.tmin;
  646. t2 = bi.t2;m2 = bi.m2;tmax = bi.tmax;
  647. line = MallocLine();
  648. switch (bi.bitype)
  649. {
  650. case LL:
  651.     p1.x = x1-x3*t2;
  652. p1.y = y1-y3*t2;
  653. p0.x = x1-x3*t1;
  654.         p0.y = y1-y3*t1;
  655. p0.z = 0.0;
  656. p1.z = 0.0;
  657. line->p0 = p0;
  658. line->p1 = p1;
  659. //CaxDrawLine(line);
  660. cur=SaveLine(line);
  661. cur->color = color;
  662. CaxDrawCurvecmp(cur);
  663. cur = NULL;
  664. //SaveLine(line);
  665. break;
  666. case CC:
  667. case LC://直线与圆弧求交
  668. if(m1 == m2)
  669. {
  670. tstep = m1*(t2-t1)/6;
  671. p0.x=x1-x2-x3*t1+m1*x4*sqrt(pow(x5+x6*t1,2)-pow(x7+x8*t1,2));
  672. p0.y=y1-y2-y3*t1-m1*y4*sqrt(pow(y5+y6*t1,2)-pow(y7+y8*t1,2));
  673. p0.z = 0.0;
  674. for(tm = t1*m1; t2*m2-tm>=ZERO;tm+=tstep)
  675. {
  676. p1.x=x1-x2-x3*(tm+tstep)*m1+m1*x4*sqrt(pow(x5+x6*(tm+tstep)*m1,2)-pow(x7+x8*(tm+tstep)*m1,2));
  677. p1.y=y1-y2-y3*(tm+tstep)*m1-m1*y4*sqrt(pow(y5+y6*(tm+tstep)*m1,2)-pow(y7+y8*(tm+tstep)*m1,2));
  678. p1.z = 0.0;
  679. line->p0 = p0;
  680. line->p1 = p1;
  681. p0 = p1;
  682. cur=SaveLine(line);
  683. cur->color = color;
  684. CaxDrawCurvecmp(cur);
  685. cur = NULL;
  686. //CaxDrawLine(line);
  687. line=NULL;
  688. line= MallocLine();
  689. }
  690. }
  691. else if(m1 != m2)
  692. {
  693. tstep = (t1-tmin)/3;
  694. detax0 = pow(x5+x6*tmin,2)-pow(x7+x8*tmin,2);
  695. if(detax0 <= ZERO)
  696. detax0 = 0;
  697. else detax0 = sqrt(detax0);
  698. detay0 = pow(y5+y6*tmin,2)-pow(y7+y8*tmin,2);
  699. if(detay0 <= ZERO)
  700. detay0 = 0;
  701. else detay0 = sqrt(detay0);
  702. p0.x=x1-x2-x3*tmin+x4*detax0;
  703. p0.y=y1-y2-y3*tmin-y4*detay0;
  704. for(tm = tmin;t1-tm>ZERO;tm+=tstep)
  705. {
  706. detax = pow(x5+x6*(tm+tstep),2)-pow(x7+x8*(tm+tstep),2);
  707. if(detax <= ZERO)
  708. detax = 0;
  709. else detax = sqrt(detax);
  710. detay = pow(x5+x6*(tm+tstep),2)-pow(x7+x8*(tm+tstep),2);
  711. if(detay <= ZERO)
  712. detay = 0;
  713. else detay = sqrt(detay);
  714. p1.x=x1-x2-x3*(tm+STEP)+m1*x4*detax;
  715. p1.y=y1-y2-y3*(tm+STEP)-m1*y4*detay;
  716. line->p0 = p0;
  717. line->p1 = p1;
  718. p0 = p1;
  719. //
  720. cur = SaveLine(line);
  721. cur->color = color;
  722. CaxDrawCurvecmp(cur);
  723. cur = NULL;
  724. //
  725. line=NULL;
  726. line= MallocLine();
  727. }
  728. tstep = (t2-tmin)/3;
  729. p0.x=x1-x2-x3*tmin+x4*detax0;
  730. p0.y=y1-y2-y3*tmin-y4*detay0;
  731. for(tm = tmin;t2-tm>ZERO;tm+=tstep)
  732. {
  733. detax = pow(x5+x6*(tm+tstep),2)-pow(x7+x8*(tm+tstep),2);
  734. if(detax <= ZERO)
  735. detax = 0;
  736. else detax = sqrt(detax);
  737. detay = pow(x5+x6*(tm+tstep),2)-pow(x7+x8*(tm+tstep),2);
  738. if(detay <= ZERO)
  739. detay = 0;
  740. else
  741. detay = sqrt(detay);
  742. p1.x=x1-x2-x3*(tm+tstep)+m2*x4*detax;
  743. p1.y=y1-y2-y3*(tm+tstep)-m2*y4*detay;
  744. line->p0 = p0;
  745. line->p1 = p1;
  746. p0 = p1;
  747. //
  748. cur = SaveLine(line);
  749. cur->color = color;
  750. CaxDrawCurvecmp(cur);
  751. cur = NULL;
  752. //
  753. line=NULL;
  754. line= MallocLine();
  755. }
  756. }
  757. break;
  758. default:
  759. ASSERT(0);
  760. break;
  761. }
  762. return;
  763. }
  764. void  vdisplayvoronoi(VCNBL cn)
  765. {
  766. PVBNS  bi=NULL;
  767. PVBLI  bil=NULL;
  768. PVCNBL tmnode=NULL;
  769. tmnode = &cn;
  770. int color=RGB(255,0,0);
  771. int colorstep = 20;
  772. do{
  773. color += colorstep;
  774. bil = tmnode->bli;
  775. do{
  776. bi = bil->bni->bns;
  777. vdisplaysinglebi(*bi,color);
  778. bil = bil->last;
  779. }while(bil);
  780. tmnode = tmnode->ccw;
  781. }while(tmnode!=&cn);
  782. return;
  783. }
  784. void vdisplayplv(VPL pl)
  785. {
  786. PVCNBL cnbls,cnble,cnbl;
  787. PVBLI  bli;
  788. PVBNS  bns;
  789. cnbl = cnbls = pl.splf->scnbl;
  790. cnble = pl.eplf->ecnbl;
  791. int colorstep = 20;
  792. while(cnbl!=NULL&&cnbl!=cnble)
  793. {
  794. bli = cnbl->bli;
  795. while(bli!=NULL)
  796. {
  797. if(bli->bni->flag==1);
  798. else{
  799. bns = bli->bni->bns;
  800. vdisplaysinglebi(*bns,RGB(200,0,200)+myflag*colorstep);
  801. //AfxMessageBox("2");
  802. bli->bni->flag =1;
  803. bli=bli->next;
  804. }
  805. }
  806. cnbl = cnbl->ccw;
  807. }
  808. if(cnbl==cnble)
  809. {
  810. bli = cnbl->bli;
  811. while(bli!=NULL)
  812. {
  813. if(bli->bni->flag==1);
  814. else{
  815. bns = bli->bni->bns;
  816. vdisplaysinglebi(*bns,RGB(200,0,200));
  817. bli->bni->flag =1;
  818. bli=bli->next;
  819. }
  820. }
  821. }
  822. cnbl = pl.splf->scnbl;
  823. do
  824. {
  825. bli = cnbl->bli;
  826. while(bli!=NULL)
  827. {
  828. bli->bni->flag =0;
  829. bli=bli->next;
  830. }
  831. cnbl = cnbl->ccw;
  832. }while(cnbl!=NULL&&cnbl!=cnble);
  833. if(cnbl!=NULL)
  834. {
  835. bli = cnbl->bli;
  836. while(bli!=NULL)
  837. {
  838. bli->bni->flag =0;
  839. bli=bli->next;
  840. }
  841. cnbl = cnbl->ccw;
  842. }
  843. }
  844. //////////........................................................
  845. //first we assume that the t1,t2 >=0;
  846. //if return 1 means the first is to the left of t2,m1t1 < m2t2
  847. // 2,vias
  848. //0 means m1t1==m2t2;
  849. int vcompareright(int m1,double t1,int m2,double t2)
  850. {
  851. double tm1,tm2;
  852. tm1 = m1*t1;
  853. tm2 = m2*t2;
  854. if(fabs(tm1-tm2)<=ZERO)
  855. return 0;
  856. else if(tm1-tm2>ZERO)
  857. return 2;
  858. else if(tm1-tm2<-ZERO)
  859. return 1;
  860. }
  861. //find the value of the line direction
  862. void vfindvectorinpositive(PVBNS bns,int m,double t,PXYZ *p)
  863. {//as for the CCP I assume that the p is head for alph adding direction
  864. ASSERT(bns);
  865. PXYZ pp = NULL;
  866. double x1,x0,y1,y0,deta,detax,detay;
  867. if(LLP == bns->bitype)
  868. {
  869. pp = new XYZ;
  870. if(m>0){
  871. pp->x =  bns->x2;
  872. pp->x = -bns->x1;
  873. }
  874. else{
  875. pp->x = -bns->x2;
  876. pp->y =  bns->x1;
  877. }
  878. *p = pp;
  879. }
  880. else if (CCP == bns->bitype)
  881. {
  882. pp = new XYZ;
  883. pp->x = cos(t*m + PI/2);
  884. pp->y = sin(t*m + PI/2);
  885. *p = pp;
  886. }
  887. else if (LL == bns->bitype)
  888. {
  889. pp = new XYZ;
  890. pp->x =  -bns->x3;
  891. pp->y =  -bns->y3;
  892. pp->z =   0;
  893. *p = pp;
  894. }
  895. else if (LC == bns->bitype || CC == bns->bitype)
  896. {
  897. deta = pow(bns->x5 + bns->x6*t,2) - pow(bns->x7 + bns->x8*t,2);
  898. if(deta<-ZERO)ASSERT(0);
  899. if(fabs(deta)<=ZERO){
  900. x0 = -bns->x3; x1 = 0;
  901. y0 = -bns->y3; y1 = 0;
  902. }
  903. else
  904. {
  905. detax = m*bns->x4/sqrt(deta);
  906. x0 = detax*(bns->x5*bns->x6 - bns->x7*bns->x8) - bns->x3;
  907. x1 =  detax*(bns->x6*bns->x6 - bns->x8*bns->x8);
  908. deta = pow(bns->y5 + bns->y6*t,2) - pow(bns->y7 + bns->y8*t,2);//can be deleted safely
  909. detay = -m*bns->y4/sqrt(deta);
  910. y0 = detay*(bns->y5*bns->y6 - bns->y7*bns->y8) - bns->y3;
  911. y1 = detay*(bns->y6*bns->y6 - bns->y8*bns->y8);//please pay attention
  912. }
  913. pp = new XYZ;
  914. pp->x = x0 + t*x1;
  915. pp->y = y0 + t*y1;
  916. pp->z = 0;
  917. *p = pp;
  918. }
  919. }
  920. //I do not know whether this function if ture
  921. //m is the m of bns
  922. int vfinddirection(PVBLI bli,PVBNS bns,double t,int m)
  923. {//t and m is the intersect point of between bli->bni->bns and bns
  924. ASSERT(bns);
  925. PXYZ  pa,pb;
  926. int mm;//mm is the m of bli->bni->bns; 
  927. double tm;
  928. double tt = t;
  929. vfindvectorinpositive(bns,m,tt,&pa);
  930. //
  931. vgainintersectmvaluebns(bli->bni->bns,bns,&tt,m,&mm);
  932. vfindvectorinpositive(bli->bni->bns,mm,tt,&pb);//we know that we must find all the information of bli
  933. tm = vmultiplayvector(pb,pa);
  934. //
  935. tm = tm*m*mm*bli->clockwise;//this if the critical judgement
  936. delete pa;
  937. delete pb;
  938. if(tm>=0)//==0 means parallel if so ,there will no intersect in funture caculation 
  939. {
  940. return CCW;//this mean the t*m >tfirst*mfirst is validative
  941. }
  942. else
  943. {
  944. return CW;//otherwise mean the t*m behand the tfirst*mfirst if validative
  945. }
  946. }
  947. //find the overlaps of m1t1-m2t2 and m3r3-m4t4;
  948. //if return 0,no overlaps;
  949. //if return 1,only one point overlaps;
  950. //if return 2,have segemented overlaps;
  951. int  vcomparerights(int m1,double t1, int m2,double t2, //input
  952. int m3,double t3, int m4,double t4, //input
  953. int *mm1,double *tt1,
  954. int *mm2,double *tt2)
  955. {//I think it will be ok.
  956. int m;
  957. double t;
  958. double tm1,tm2,tm3,tm4;
  959. tm1 = m1*t1; tm2 = m2*t2; tm3 = m3*t3;tm4 = m4*t4;
  960. if(tm1-tm2>ZERO)
  961. {
  962. m=m1; t=t1;
  963. m1=m2; t1=t2;
  964. m2=m; t2=t;
  965. }
  966. if(tm3-tm4>ZERO)
  967. {
  968. m=m3; t=t3;
  969. m3=m4; t3=t4;
  970. m4=m; t4=t;
  971. }
  972. //
  973. if((tm1 >m4*t4)||(tm3 > tm2))
  974. return 0;
  975. //
  976. if(fabs(tm1-tm2)<ZERO)
  977. {
  978. if(tm1>=tm3&&tm1<=tm4)
  979. {
  980. *mm1=*mm2=m1;
  981. *tt1=*tt2=t1;
  982. return 1;
  983. }    
  984. else return 0;
  985. }
  986. if(fabs(tm3-tm4)<ZERO)
  987. {
  988. if(tm3>=tm1&&tm3<=tm2)
  989. {
  990. *mm1=*mm2=m3;
  991. *tt1=*tt2=t3;
  992. return 1;
  993. }    
  994. else return 0;
  995. }
  996. //
  997. if(tm1 >= tm3 && tm1 <= tm4)
  998. {
  999. *tt1 = t1; *mm1 = m1;
  1000. if(m2*t2 >= m4*t4)
  1001. {
  1002. *tt2 = t4;*mm2= m4;
  1003. }
  1004. else if(m2*t2 < m4*t4)
  1005. {
  1006. *tt2 = t2;*mm2= m2;
  1007. }
  1008. return 2;
  1009. }
  1010. else if(tm1 < tm3)
  1011. {
  1012. *tt1=t3; *mm1=m3;
  1013. if(tm2 >= tm4)
  1014. {
  1015. *tt2 = t4;*mm2= m4;
  1016. }
  1017. else if(tm2 >= tm3)
  1018. {
  1019. *tt2 = t2;*mm2= m2;
  1020. }
  1021. return 2;
  1022. }
  1023. }
  1024. void  vgetparaline(PLINE l,double *a,double *b,double *c)
  1025. {
  1026. ASSERT(l);
  1027. double x0,y0,x1,y1;
  1028. double delt;
  1029. x0 = l->p0.x; y0 = l->p0.y;
  1030. x1 = l->p1.x; y1 = l->p1.y;
  1031. if(fabs(x1-x0)<ZERO)*b=0;else *b=x1-x0;
  1032. if(fabs(y1-y0)<ZERO)*a=0;else *a=y0-y1;
  1033. ASSERT(0!=*a||0!=*b);
  1034. delt = sqrt(pow(*a,2)+pow(*b,2));
  1035. *a = *a/delt;*b = *b/delt;
  1036. *c = ((y1-y0)*x0-y0*(x1-x0))/delt;
  1037. return;
  1038. }
  1039. PXYZ  vgetintersectpoint(VBNS bi,double t,int m)
  1040. {
  1041. PXYZ p=new XYZ;
  1042. if(bi.bitype==LL)
  1043. {
  1044. p->x = bi.x1-bi.x2-bi.x3*t;
  1045.         p->y = bi.y1-bi.y2-bi.y3*t;
  1046. p->z = 0.0;
  1047. }
  1048. else
  1049. {
  1050. p->x=bi.x1-bi.x2-bi.x3*t+m*bi.x4*sqrt(pow(bi.x5+bi.x6*t,2)-pow(bi.x7+bi.x8*t,2));
  1051. p->y=bi.y1-bi.y2-bi.y3*t-m*bi.y4*sqrt(pow(bi.y5+bi.y6*t,2)-pow(bi.y7+bi.y8*t,2));
  1052. p->z=0;
  1053. }
  1054. return p;
  1055. }
  1056. //find resultion of ax2+bx+c=0;
  1057. void  vgetvalue(double a,double b,double c,double t[2],int *i)
  1058. {
  1059. double deta;
  1060. if(fabs(a)<ZERO){
  1061. ASSERT(fabs(b)>ZERO);
  1062. if(fabs(b)<ZERO){
  1063. *i=0;
  1064. }
  1065. else{
  1066. t[0]=-c/b;
  1067. *i=1;
  1068. }
  1069. }
  1070. else if(fabs(b)<ZERO)
  1071. {
  1072. ASSERT(fabs(a)>ZERO);
  1073.         if(fabs(c)<ZERO){
  1074. *i=1;
  1075. t[0]=0;
  1076. }
  1077. else if(c<-ZERO){
  1078. *i=0;
  1079. }
  1080. else {
  1081. *i=2;
  1082. t[0]=sqrt(c);
  1083. t[1]=-sqrt(c);
  1084. }
  1085. }
  1086. else
  1087. {
  1088. deta=b*b-4*a*c;
  1089. if(deta<-ZERO){
  1090. *i=0;
  1091. t[0]=0;
  1092. }
  1093. else if(fabs(deta)<ZERO)
  1094. {
  1095. *i=1;
  1096. t[0]=-b/2/a;
  1097. }
  1098. else 
  1099. {
  1100. *i=2;
  1101. t[0]=(-b+sqrt(deta))/2/a;
  1102. t[1]=(-b-sqrt(deta))/2/a;
  1103. }
  1104. }
  1105. return;
  1106. }
  1107. //find the  validate areas;
  1108. void vgettminandtmaxvalue( double a,double b,double c,double t[4],int *i )
  1109. {//i=0 ,mean no area,1 mean 1area,2 mean,two area
  1110. double deta,o,p;
  1111. double tt[2];
  1112. if(fabs(a)<=ZERO)
  1113. {
  1114. if(fabs(b)<=ZERO){
  1115. if(c>=-ZERO){*i = 1;t[0] = 0;t[1] = UPER;}
  1116. else *i = 0;
  1117. }
  1118. else if( b<-ZERO )
  1119. {
  1120. if(fabs(-c/b)<=0) *i = 0;
  1121. else{
  1122. *i = 1;
  1123. t[0] = 0;t[1] = -c/b;
  1124. }
  1125. }
  1126. else
  1127. {
  1128. *i = 1;
  1129. t[1] = UPER;
  1130. if(-c/b>=0)
  1131. t[0] = -c/b;
  1132. else t[0] =0;
  1133. return;
  1134. }
  1135. }
  1136. else{
  1137. deta = b*b-4*a*c;
  1138. if(a>ZERO)
  1139. {
  1140. if(deta<=0){*i=1;t[0]=-UPER;t[1] = UPER;}
  1141. else{
  1142. o = (-b-sqrt(deta))/(2*a);p = (-b+sqrt(deta))/(2*a);
  1143. if(o>=0){*i = 2;t[0]=0;t[1] = o;t[2]=p,t[3] = UPER;}
  1144. else if(p>=0){*i=1;t[0] = p;t[1] =UPER;}
  1145. else if(p<0) {*i=1;t[0] = 0;t[1] =UPER;}
  1146. }
  1147. }
  1148. else if(a<-ZERO)
  1149. {
  1150. if(deta<=0){*i=0;}
  1151. else{
  1152. o = (-b-sqrt(deta))/(2*a);p = (-b+sqrt(deta))/(2*a);
  1153. if(o>=0){*i = 1;t[0]=o;t[1] = p;}
  1154. else if(o<0&&p>=0){*i=1;t[0] = 0;t[1] = p;}
  1155. else if(p<0) {*i=0;}
  1156. }
  1157. }
  1158. }
  1159. return;
  1160. }
  1161. //gain a b c&t ;
  1162. void  vgetllimit(PVCNS cn,double *a,double *b,double *c,double *t)
  1163. {
  1164. ASSERT(cn);
  1165. ASSERT(cn->type==0);
  1166. double x0,y0,x1,y1;
  1167. double delt;
  1168. XYZ p0,p1;
  1169. if(0==cn->clockwise){
  1170. p0 = cn->element.line->p0;
  1171. p1 = cn->element.line->p1;
  1172. }
  1173. else if(1==cn->clockwise){
  1174. p1 = cn->element.line->p0;
  1175. p0 = cn->element.line->p1;
  1176. }
  1177. x0 = p0.x;y0 = p0.y;
  1178. x1 = p1.x;y1 = p1.y;
  1179. if(fabs(x1-x0)<ZERO)*a=0;else *a=x1-x0;
  1180. if(fabs(y1-y0)<ZERO)*b=0;else *b=y1-y0;
  1181. ASSERT(0!=*a&&0!=*b);
  1182. delt = sqrt(pow(*a,2)+pow(*b,2));
  1183. *a = *a/delt;
  1184. *b = *b/delt;
  1185. *c = -((y1-y0)*y0+x0*(x1-x0))/delt;
  1186. *t = 0;
  1187. return;
  1188. }
  1189. void  vgetcflimit(PVCNS cn,double *a,double *b,double *c,double *t)
  1190. {
  1191. ASSERT(cn);
  1192. ASSERT(cn->element.arc);
  1193. PLINE line;
  1194. // XYZ pt,du,duu,dn;
  1195. // GeneratorArcAllValue(cn->element.arc,0.5,&pt,&du,&duu,&dn);
  1196. line->p0=cn->element.arc->pc;
  1197. line->p1=cn->element.arc->px;
  1198. vgetparaline(line,a,b,c);
  1199. *t = cn->element.arc->r;
  1200. return;
  1201. }
  1202. void  vgetcslimit(PVCNS cn,double *a,double *b,double *c,double *t)
  1203. {
  1204. ASSERT(cn);
  1205. ASSERT(cn->element.arc);
  1206. PLINE line;
  1207. line->p0=cn->element.arc->pc;
  1208. line->p1=cn->element.arc->px;
  1209. vgetparaline(line,a,b,c);
  1210. *t = cn->element.arc->r;
  1211. return;
  1212. }
  1213. //
  1214. void  vgainbisectorll(PVCNS l1, PVCNS l2, PVBNS *bi)//ok
  1215. {
  1216. ASSERT(l1);ASSERT(l2);ASSERT(CAXLINE==l1->type);ASSERT(CAXLINE==l2->type);
  1217. PVBNS  bt = NULL;
  1218. *bi = NULL;
  1219. XYZ p0,p1;
  1220. double a1,b1,c1;
  1221. double a2,b2,c2;
  1222. double deta;
  1223. int    m1,m2;
  1224. if(CCW == l1->clockwise)m1 = -1;
  1225. else m1 = 1;
  1226. if(CCW == l2->clockwise)m2 = -1;
  1227. else m2 = 1;
  1228. vgetparaline(l1->element.line,&a1,&b1,&c1);
  1229. vgetparaline(l2->element.line,&a2,&b2,&c2);
  1230. deta = a1*b2 - b1*a2;
  1231. if(fabs(deta)<=ZERO)//处理平行线
  1232. {//Anyway the same line have bisector too; 
  1233. ASSERT(0);//kill it afterwards
  1234. double tmtemp;
  1235. if(m1 == m2) return;
  1236. tmtemp = (c2-c1)/(m1-m2);
  1237. if(tmtemp<-ZERO) return;//we must be sure of the positive of integret
  1238. bt = vmallocbns();
  1239. bt->bitype = LLP;
  1240. bt->tmin = bt->tmax = tmtemp;
  1241. bt->x1 = a1;
  1242. bt->x2 = b1;
  1243. bt->x3 = c1 + m1*bt->tmin;//一般方程a**2+b**2 = 1;
  1244. bt->x4 = l1->element.line->p0.x + a1 * m1*tmtemp;
  1245. bt->y4 = l1->element.line->p0.y + b1 * m1*tmtemp;//find the first point
  1246. *bi = bt;
  1247. //以下对t1,t2赋值
  1248. return;
  1249. }//below 为平分线赋值
  1250. bt = vmallocbns();
  1251.     bt->x1 = (b1*c2-b2*c1)/deta;
  1252.     bt->x3 =-(b1*m2-b2*m1)/deta;
  1253.     bt->y1 = (a2*c1-a1*c2)/deta;
  1254.     bt->y3 =-(a2*m1-a1*m2)/deta;
  1255. bt->bitype = LL;
  1256. bt->infinite = INFINITY;
  1257. //以下对t1,t2赋值
  1258. bt->t1 = 0;
  1259. bt->t2 = UPER;
  1260. bt->m1=1;
  1261. bt->m2=1;
  1262. *bi = bt;
  1263. return ;
  1264. }
  1265. void  vgainbisectorlc(PVCNS l1, PVCNS cc2, PVBNS *bi)
  1266. {
  1267. ASSERT(l1);ASSERT(cc2);ASSERT(CAXARC==cc2->type);ASSERT(CAXLINE==l1->type);
  1268. double xc1,yc1,r1,a2,b2,c2;
  1269. double h,m1,m2;
  1270. double aa,bb,cc,tt[4];
  1271. int    iflag;
  1272. vgetparaline(l1->element.line,&a2,&b2,&c2);
  1273. if(CCW==cc2->clockwise)m1 = 1;
  1274. else m1 = -1;
  1275. if(CCW==l1->clockwise)m2 = -1;
  1276. else m2 = 1;
  1277. // GeneratorArcAllValue(c2->element.arc,1.0,&pt,&du,&duu,&dn);
  1278. xc1=cc2->element.arc->pc.x;
  1279. yc1=cc2->element.arc->pc.y;
  1280. r1 =cc2->element.arc->r;
  1281. h = a2*xc1 + b2*yc1 + c2; 
  1282. PVBNS bt = vmallocbns();
  1283.     //x1-x2-x3*t+x4*sqrt((x5+x6*t)**2-(x7+x8*t)**2);
  1284. bt->x1=xc1;   bt->x2=a2*h;  bt->x3=m2*a2;   bt->x4=b2;  bt->x5=r1;
  1285. bt->x6=m1;    bt->x7=h;     bt->x8=m2;
  1286. bt->y1=yc1;   bt->y2=b2*h;  bt->y3=m2*b2;   bt->y4=a2;  bt->y5=r1;
  1287. bt->y6=m1;    bt->y7=h;     bt->y8=m2;
  1288. bt->m1 = -1;
  1289. bt->m2 = 1;
  1290. //left out for later processing
  1291. /* aa = bt->x6*bt->x6 - bt->x8*bt->x8;
  1292. bb = 2*(bt->x5*bt->x6 - bt->x7*bt->x8);
  1293. cc = bt->x5*bt->x5 - bt->x7*bt->x7;
  1294. vgettminandtmaxvalue(aa,bb,cc,tt,&iflag);
  1295. if(iflag == 1)*/
  1296. //////////assign tmin;
  1297. aa = h*h-r1*r1;//t(2r1m1-2hm2)>=h**2-r1**2;
  1298. bb = 2*(r1*m1-h*m2);
  1299. if(fabs(bb)<=ZERO)
  1300. {
  1301. if(aa<=ZERO)bt->tmin = 0;
  1302. else ASSERT(0);
  1303. }
  1304. else if(bb<-ZERO)
  1305. {
  1306. if(aa/bb>ZERO){bt->tmin = 0;bt->tmax = aa/bb;}
  1307. else ASSERT(0);
  1308. }
  1309. else if(bb>ZERO)
  1310. {
  1311. if(aa<=ZERO)
  1312. bt->tmin = 0;
  1313. else {
  1314. bt->tmin = aa/bb ; 
  1315. }
  1316. }
  1317. //上面可以不要
  1318. bt->t1 = UPER;
  1319. bt->t2 = UPER;
  1320. bt->m1 = -1;
  1321. bt->m2 =  1;
  1322. bt->bitype = LC;
  1323. bt->infinite = INFINITY;
  1324. *bi = bt;
  1325. return;
  1326. }
  1327. void  vgainbisectorcc(PVCNS c1, PVCNS c2, PVBNS *bi)
  1328. {
  1329. ASSERT(c1);ASSERT(c2);ASSERT(CAXARC==c1->type);ASSERT(CAXARC==c2->type);
  1330. double xc1,yc1,r1,xc2,yc2,r2;
  1331. double h,m1,m2;
  1332. double deta,dx,dy,d;
  1333. xc1=c1->element.arc->pc.x;  xc2=c2->element.arc->pc.x;
  1334. yc1=c1->element.arc->pc.y;  yc2=c2->element.arc->pc.y;
  1335. r1 =c1->element.arc->r;     r2 =c2->element.arc->r;
  1336. if(CCW==c1->clockwise)m1 = 1;
  1337. else m1 = -1;
  1338. if(CCW==c2->clockwise)m2 = 1;
  1339. else m2 = -1;
  1340. // ASSERT(pow(xc1-xc2)+pow(yc1-yc2)>ZERO);
  1341. if(pow(xc1-xc2,2) + pow(yc1-yc2,2)<=ZERO)//同心处理
  1342. {
  1343. ASSERT(0);
  1344. double t;
  1345. if(m1 == m2)
  1346. {
  1347. t = -(r1+r2)/(m2+m1);
  1348. if(t<-ZERO)
  1349. {
  1350. *bi = NULL;
  1351. return;
  1352. }
  1353. }
  1354. else if(fabs(m1+m2)<=ZERO)
  1355. {
  1356. t = (r1-r2)/(m2-m1);
  1357. if(t<-ZERO){
  1358. *bi = NULL;
  1359. return;
  1360. }
  1361. }
  1362. PVBNS bt = vmallocbns();
  1363. bt->bitype = CCP;//标识同心
  1364. bt->x1 = (xc1 - xc2)/2;//圆心
  1365. bt->y1 = (yc1 - yc2)/2;//圆心
  1366. bt->x2 = m1*t + r1;//半径
  1367. bt->infinite = 1;
  1368. *bi = bt;
  1369. return;
  1370. }//below non同心处理
  1371. // if(m1*m2<0)
  1372. // {
  1373. // }//圆包含处理#
  1374. PVBNS bt = vmallocbns();
  1375. //
  1376. d=sqrt(pow(xc1-xc2,2)+pow(yc1-yc2,2));
  1377. dx=(xc2-xc1)/d;dy=(yc2-yc1)/d;
  1378. deta=(m2*r2-m1*r1)/d;
  1379. h=(r2*r2-r1*r1-d*d)/2/d;
  1380. //
  1381. bt->x1=xc1;  bt->x2=dx*h;  bt->x3=dx*deta;  bt->x4=dy;  bt->x5=r1;
  1382. bt->x6=m1;   bt->x7=h;     bt->x8=(r2*m2-r1*m1)/d;
  1383. bt->y1=yc1;  bt->y2=dy*h;  bt->y3=dy*deta;  bt->y4=dx;  bt->y5=r1;
  1384. bt->y6=m1;   bt->y7=h;     bt->y8=(r2*m2-r1*m1)/d;
  1385.     // bt->t0 = (d-r1*m1-r2*m2)/2;
  1386. //assign the tmin and the tmax;
  1387. deta = r1*m1-h*bt->y8;
  1388. if(fabs(deta)<ZERO)
  1389. {
  1390. bt->tmin = 0;
  1391. }
  1392. else if(deta<-ZERO)
  1393. {
  1394. bt->tmin=(r1*r1-bt->x8*bt->x8)/2/(bt->x5*bt->x6-bt->x7*bt->x8);
  1395. bt->limit=1;
  1396. }
  1397. else 
  1398. {
  1399. bt->tmin=(r1*r1-bt->x8*bt->x8)/2/(bt->x5*bt->x6-bt->x7*bt->x8);
  1400. bt->limit=0;
  1401. }
  1402. bt->tmin = 0;
  1403. bt->tmax = UPER;
  1404. //不要不要了,酸什么TMIN和TMAX了,去掉去掉
  1405. bt->bitype = CC;
  1406. bt->infinite = INFINITY;
  1407. bt->t1 = UPER;
  1408. bt->t2 = UPER;
  1409. bt->m1 = -1;
  1410. bt->m2 =  1;
  1411. *bi=bt;
  1412. return;
  1413. }
  1414. void  vgainbisector(PVCNS c1, PVCNS c2, PVBNS *bi)
  1415. {
  1416. PVBNS bt;
  1417. if(CAXLINE==c1->type)
  1418. {
  1419. if(CAXLINE==c2->type)
  1420. vgainbisectorll(c1,c2,&bt);
  1421. else if(CAXARC==c2->type)
  1422. vgainbisectorlc(c1,c2,&bt);
  1423. }
  1424. else if(CAXARC==c1->type)
  1425. {
  1426. if(CAXLINE==c2->type)
  1427. vgainbisectorlc(c2,c1,&bt);
  1428. else if(CAXARC==c2->type)
  1429. vgainbisectorcc(c1,c2,&bt);
  1430. }
  1431. *bi = bt;
  1432. }
  1433. //gain the the point of line line line intersect
  1434. //bisector l1&l2 intersect bisector l1&l3
  1435. //it have been ok but need text for further use
  1436. void vgainintersectlll(PVCNS l1,PVCNS l2,PVCNS l3,int *i,double t[2])
  1437. {
  1438. ASSERT(l1);ASSERT(l2);ASSERT(l3);
  1439. ASSERT(CAXLINE==l1->type);
  1440. ASSERT(CAXLINE==l2->type);ASSERT(CAXLINE==l3->type);
  1441. double a1,b1,c1,a2,b2,c2,a3,b3,c3;
  1442. double x0,y0;
  1443. double deta;
  1444. int m1,m2,m3;
  1445. vgetparaline(l1->element.line,&a1,&b1,&c1);
  1446. vgetparaline(l2->element.line,&a2,&b2,&c2);
  1447. vgetparaline(l3->element.line,&a3,&b3,&c3);
  1448. if(CCW == l1->clockwise)m1 = -1;
  1449. else m1 = 1;
  1450. if(CCW == l2->clockwise)m2 = -1;
  1451. else m2 = 1;
  1452. if(CCW == l3->clockwise)m3 = -1;
  1453. else m3 = 1;
  1454. deta = (m1*b1-m3*b3)*(a1*m1-a2*m2)-(b1*m1-b2*m2)*(a1*m1-a3*m3);
  1455. if(fabs(deta)<ZERO)//two line is parallel;//no it is two bisector parallel
  1456. {
  1457. ASSERT(0);    //if have only two line parallel,deta will not be zero 
  1458. *i=0;   //there are not intersect points
  1459. t[0] = UPER;
  1460. return;       //to be simple it is no intersector
  1461. }
  1462. x0 = (b1*m2-b2*m1)*(c1*m3-c3*m1) - (b1*m3-b3*m1)*(c1*m2-c2*m1);
  1463. y0 = (a1*m2-a2*m1)*(c1*m3-c3*m1) - (a1*m3-a3*m1)*(c1*m2-c2*m1);
  1464. x0 =  x0/deta;
  1465. y0 = -y0/deta;
  1466. t[0] = m1*(-a1*x0-b1*y0-c1);
  1467. *i = 1;
  1468.     return;
  1469. }
  1470. //i=0,1,or 2;
  1471. void vgainintersectllc(PVCNS l1,PVCNS l2,PVCNS c3,int *i,double t[2])
  1472. {
  1473. ASSERT(l1);ASSERT(l2);ASSERT(c3);
  1474. ASSERT(CAXLINE==l1->type);
  1475. ASSERT(CAXLINE==l2->type);ASSERT(CAXARC==c3->type);
  1476. //
  1477. double a1,b1,c1,a2,b2,c2,xc3,yc3,r3;
  1478. double a,b,c,deta,x0,x1,y0,y1;
  1479. int m1,m2,m3;
  1480. PVBNS bns = NULL;
  1481. double dtemp;
  1482. //double tt[2];//template uesed
  1483. vgetparaline(l1->element.line,&a1,&b1,&c1);
  1484. vgetparaline(l2->element.line,&a2,&b2,&c2);
  1485. xc3=c3->element.arc->pc.x;
  1486. yc3=c3->element.arc->pc.y;
  1487. r3=c3->element.arc->r;
  1488. if(CCW==l1->clockwise)m1 = -1;
  1489. else m1 = 1;
  1490. if(CCW==l2->clockwise)m2 = -1;
  1491. else m2 = 1;
  1492. if(CCW==c3->clockwise)m3 = 1;
  1493. else m3 = -1;
  1494. deta = a1*b2-b1*a2;
  1495. if(fabs(deta)<=ZERO)// two parallel  line left for later write
  1496. {
  1497. double ta;
  1498. if(m1 == m2)
  1499. {
  1500. *i = 0;
  1501. return;
  1502. }
  1503. //
  1504. ta = (c2-c1)/(m1-m2);
  1505. //t is minor than zero is unbearable so kick it out without mercy
  1506. if(ta<=-ZERO){
  1507. *i = 0;
  1508. return;
  1509. }
  1510. else
  1511. {
  1512. vgainbisectorlc(l1,c3,&bns);
  1513. dtemp = (bns->x5 + bns->x6*ta)*(bns->x5 + bns->x6*ta) -
  1514. (bns->x7 + bns->x8*ta)*(bns->x7 + bns->x8*ta);
  1515. delete bns; bns = NULL;
  1516. if(dtemp<-ZERO){
  1517. *i=0;
  1518. }
  1519. else{
  1520. *i = 1;
  1521. t[0] = t[1] = ta;
  1522. }
  1523. return;//if
  1524. }
  1525. //
  1526. /* tt = a1*xc3 + b1*yc3 + (c1+m1*ta);//tt is the distance between the center of circle and the line.
  1527. if(fabs(tt)-(r3+m3*ta)<=ZERO)
  1528. {
  1529. *i = 1;
  1530. t[0] = ta;
  1531. }
  1532. else if(fabs(tt)-(r3+m3*ta)>ZERO)
  1533. {
  1534. *i = 0;
  1535. }
  1536. //ASSERT(0);
  1537. AfxMessageBox("sorry but I find two duplicit lines");
  1538. return;   */
  1539. }
  1540. x0 = (b1*c2-b2*c1)/deta;
  1541. x1 = (m2*b1-b2*m1)/deta;
  1542. y0 =-(a1*c2-a2*c1)/deta;
  1543. y1 =-(a1*m2-a2*m1)/deta;
  1544.  
  1545. a=x1*x1+y1*y1-1;
  1546. b=2*(x1*(x0-xc3)+y1*(y0-yc3)-r3*m3);
  1547. c=(x0-xc3)*(x0-xc3)+(y0-yc3)*(y0-yc3)-r3*r3;
  1548. vgetvalue(a,b,c,t,i);
  1549. if(*i == 1 && t[0]<-ZERO)
  1550. {
  1551. *i = 0 ;
  1552. }
  1553. if(*i == 2)
  1554. {
  1555. if(t[0]<-ZERO&&t[1]<-ZERO){
  1556. *i = 0;
  1557. }
  1558. else if(t[0]>=-ZERO&&t[1]<-ZERO)
  1559. {
  1560. *i = 1;
  1561. }
  1562. else if (t[0]<-ZERO&&t[1]>=-ZERO)
  1563. {
  1564. *i = 1;
  1565. t[0] = t[1];
  1566. }
  1567. }
  1568. return ;
  1569. }
  1570. //i=0,1,or 2;
  1571. void  vgainintersectlcc(PVCNS l1,PVCNS cc2,PVCNS c3,int *i,double t[2])//
  1572. {
  1573. ASSERT(l1);ASSERT(cc2);ASSERT(c3);
  1574. ASSERT(CAXLINE==l1->type);
  1575. ASSERT(CAXARC==cc2->type);ASSERT(CAXARC==c3->type);
  1576. //
  1577. double a1,b1,c1,xc2,yc2,r2,xc3,yc3,r3;
  1578. double a2,b2,c2,m;
  1579. double a,b,c,deta,x0,x1,y0,y1;
  1580. int m1,m2,m3;
  1581. PVBNS bns= NULL;
  1582. double dtemp;
  1583. //double tt[2];//template uesed
  1584. vgetparaline(l1->element.line,&a1,&b1,&c1);
  1585. xc2 = cc2->element.arc->pc.x;
  1586. yc2 = cc2->element.arc->pc.y;
  1587. r2 = cc2->element.arc->r;
  1588. xc3 = c3->element.arc->pc.x;
  1589. yc3 = c3->element.arc->pc.y;
  1590. r3 = c3->element.arc->r;
  1591. if(CCW==l1->clockwise)m1 = -1;
  1592. else m1 = 1;
  1593. if(CCW==cc2->clockwise)m2 = 1;
  1594. else m2 = -1;
  1595. if(CCW==c3->clockwise)m3 = 1;
  1596. else m3 = -1;
  1597. m  = 2*(r3*m3-r2*m2);
  1598. a2 = 2*(xc3-xc2);
  1599. b2 = 2*(yc3-yc2);
  1600. c2 = xc2*xc2-xc3*xc3+yc2*yc2-yc3*yc3+r3*r3-r2*r2;
  1601. deta = a1*b2-b1*a2;
  1602. if(fabs(deta)<=ZERO)// two parallel  line left for later write
  1603. {//无解
  1604. *i = 0;
  1605. ASSERT(0);
  1606. return;
  1607. }
  1608. if(fabs(a2)<=ZERO && fabs(b2)<=ZERO)//the circle with the same center;
  1609. {
  1610. double ta;
  1611. if(m2 == m3)
  1612. {
  1613. *i = 0;
  1614. return;
  1615. }
  1616. //
  1617. ta = (r2-r3)/(m3-m2);
  1618. //t is minor than zero is unbearable so kick it out without mercy
  1619. if(ta<=-ZERO){
  1620. *i = 0;
  1621. return;
  1622. }
  1623. else 
  1624. {
  1625. vgainbisectorlc(l1,c3,&bns);
  1626. dtemp = (bns->x5 + bns->x6*ta)*(bns->x5 + bns->x6*ta) -
  1627. (bns->x7 + bns->x8*ta)*(bns->x7 + bns->x8*ta);
  1628. delete bns; bns = NULL;
  1629. if(dtemp<-ZERO){
  1630. *i=0;
  1631. }
  1632. else{
  1633. *i = 1;
  1634. t[0] = ta;
  1635. }
  1636. return;
  1637. }
  1638. }
  1639. x0 = (b1*c2-b2*c1)/deta;
  1640. x1 = (m*b1-b2*m1)/deta;
  1641. y0 =-(a1*c2-a2*c1)/deta;
  1642. y1 =-(a1*m-a2*m1)/deta;
  1643.  
  1644. a = x1*x1+y1*y1-1;
  1645. b = 2*(x1*(x0-xc3)+y1*(y0-yc3)-r3*m3);
  1646. c = (x0-xc3)*(x0-xc3)+(y0-yc3)*(y0-yc3)-r3*r3;
  1647. vgetvalue(a,b,c,t,i);
  1648. return ;
  1649. }
  1650. //i=0,1,or 2;//i!=2?
  1651. void vgainintersectccc(PVCNS c1,PVCNS c2,PVCNS c3,int *i,double t[2])
  1652. {
  1653. ASSERT(c1);ASSERT(c2);ASSERT(c3);
  1654. ASSERT(CAXARC==c1->type);
  1655. ASSERT(CAXARC==c2->type);ASSERT(CAXARC==c3->type);
  1656. //
  1657. double xc1,yc1,r1,xc2,yc2,r2,xc3,yc3,r3;
  1658. double a1,b1,cc1,mt1,mt2,a2,b2,cc2;
  1659. double a,b,c,deta,x0,x1,y0,y1;
  1660. int m1,m2,m3;
  1661. PVBNS bns=NULL;
  1662. double dtemp;
  1663. //double tt[2];//template uesed
  1664. xc1 = c1->element.arc->pc.x;
  1665. yc1 = c1->element.arc->pc.y;
  1666. r1 = c1->element.arc->r;
  1667. xc2 = c2->element.arc->pc.x;
  1668. yc2 = c2->element.arc->pc.y;
  1669. r2 = c2->element.arc->r;
  1670. xc3 = c3->element.arc->pc.x;
  1671. yc3 = c3->element.arc->pc.y;
  1672. r3 = c3->element.arc->r;
  1673. if(CCW==c1->clockwise)m1 = 1;
  1674. else m1 = -1;
  1675. if(CCW==c2->clockwise)m2 = 1;
  1676. else m2 = -1;
  1677. if(CCW==c3->clockwise)m3 = 1;
  1678. else m3 = -1;
  1679. mt1 = 2*(r1*m1-r2*m2);
  1680. a1  = 2*(xc1-xc2);
  1681. b1  = 2*(yc1-yc2);
  1682. cc1 = xc2*xc2-xc1*xc1+yc2*yc2-yc1*yc1+r1*r1-r2*r2;
  1683. mt2 = 2*(r1*m1-r3*m3);
  1684. a2  = 2*(xc1-xc3);
  1685. b2  = 2*(yc1-yc3);
  1686. cc2 = xc3*xc3-xc1*xc1+yc3*yc3-yc1*yc1+r1*r1-r3*r3;
  1687. if(fabs(a1)<=ZERO&&fabs(a2)<=ZERO&&fabs(b1)<=ZERO&&fabs(b2)<=ZERO)//三点同心
  1688. {
  1689. *i = 0;ASSERT(0);
  1690. return;
  1691. }
  1692. else if(fabs(a1)<=ZERO&&fabs(b1)<=ZERO)//两点同心
  1693. {
  1694. double ta;
  1695. if(m1 == m2)
  1696. {
  1697. *i = 0;
  1698. return;
  1699. }
  1700. ta = (r1-r2)/(m2-m1);
  1701. if(ta<=-ZERO){
  1702. *i = 0;
  1703. }
  1704. else 
  1705. {
  1706. vgainbisectorlc(c1,c3,&bns);
  1707. dtemp = (bns->x5 + bns->x6*ta)*(bns->x5 + bns->x6*ta) -
  1708. (bns->x7 + bns->x8*ta)*(bns->x7 + bns->x8*ta);
  1709. delete bns; bns = NULL;
  1710. if(dtemp<-ZERO){
  1711. *i=0;
  1712. }
  1713. else{
  1714. *i = 1;
  1715. t[0] = ta;
  1716. }
  1717. }
  1718. return;
  1719. }
  1720. else if(fabs(b2)<=ZERO&&fabs(a2<=ZERO))//两点同心
  1721. {
  1722. double ta;
  1723. if(m1 == m3)
  1724. {
  1725. *i = 0;
  1726. return;
  1727. }
  1728. //
  1729. ta = (r1-r3)/(m3-m1);
  1730. //t is minor than zero is unbearable so kick it out without mercy
  1731. if(ta<=-ZERO){
  1732. *i = 0;
  1733. }
  1734. else 
  1735. {
  1736. vgainbisectorlc(c2,c3,&bns);
  1737. dtemp = (bns->x5 + bns->x6*ta)*(bns->x5 + bns->x6*ta) -
  1738. (bns->x7 + bns->x8*ta)*(bns->x7 + bns->x8*ta);
  1739. delete bns; bns = NULL;
  1740. if(dtemp<-ZERO){
  1741. *i=0;
  1742. }
  1743. else{
  1744. *i = 1;
  1745. t[0] = ta;
  1746. }
  1747. }
  1748. return;
  1749. }
  1750. // above is the processing of the ccp 
  1751. //after the function we can make sure that the intersect point must be the validated one
  1752. //ok?
  1753. deta = a1*b2 - b1*a2;
  1754. if(fabs(deta)<ZERO)// two parallel  line left for later write
  1755. {  //三点一线,好象是三个圆并排在一条直线,不,这也有交点。
  1756. ASSERT(0);
  1757. *i=0;
  1758. return;
  1759. }
  1760. x0 = (b1*cc2-b2*cc1)/deta;
  1761. x1 = (mt2*b1-b2*mt1)/deta;
  1762. y0 =-(a1*cc2-a2*cc1)/deta;
  1763. y1 =-(a1*mt2-a2*mt1)/deta;
  1764.  
  1765. a = x1*x1+y1*y1-1;
  1766. b = 2*(x1*(x0-xc3)+y1*(y0-yc3)-r3*m3);
  1767. c = (x0-xc3)*(x0-xc3)+(y0-yc3)*(y0-yc3)-r3*r3;
  1768. vgetvalue(a,b,c,t,i);
  1769. return ;
  1770. }
  1771. void  vgainintersect(PVCNS c1,PVCNS c2,PVCNS c3,int *i,double t[2])
  1772. {
  1773. int t1,t2,t3 ;
  1774. t1=c1->type ;
  1775. t2=c2->type ;
  1776. t3=c3->type ;
  1777. if(CAXLINE==t1){
  1778. if(CAXLINE==t2){
  1779. if(CAXLINE==t3)
  1780. vgainintersectlll(c1,c2,c3,i,t);
  1781. else if(CAXARC==t3)
  1782. vgainintersectllc(c1,c2,c3,i,t);
  1783. }
  1784. else if(CAXARC==t2)
  1785. {
  1786. if(CAXLINE==t3)
  1787. vgainintersectllc(c1,c3,c2,i,t);
  1788. else if(CAXARC==t3)
  1789. vgainintersectlcc(c1,c2,c3,i,t);
  1790. }
  1791. }
  1792. else if(CAXARC==t1)
  1793. {
  1794. if(CAXLINE==t2){
  1795. if(CAXLINE==t3)
  1796. vgainintersectllc(c2,c3,c1,i,t);
  1797. else if(CAXARC==t3)
  1798. vgainintersectlcc(c2,c3,c1,i,t);
  1799. }
  1800. else if(CAXARC==t2)
  1801. {
  1802. if(CAXLINE==t3)
  1803. vgainintersectlcc(c3,c1,c2,i,t);
  1804. else if(CAXARC==t3)
  1805. vgainintersectccc(c1,c2,c3,i,t);
  1806. }
  1807. }
  1808. }
  1809. double vdis(double x1, double y1, double x2,double y2)
  1810. {
  1811. return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
  1812. }
  1813. //得到T对应的M值
  1814. void vgainintersectmvaluebns(PVBNS bns1,PVBNS bns2,double *t,int mblis,int * mvalue)
  1815. {//mblis is corrispondent to the bns2,and if bns1 =ccp or llp then t is useless
  1816. ASSERT(bns1);ASSERT(bns2);
  1817. double detaa,detab,dtemp,dt,tt;
  1818. double tfn,tsn;
  1819. double tfny,tsny,tfpy,tspy,tfp;
  1820. XYZ p;
  1821. tt = *t;
  1822. dt = tt * mblis ;
  1823. //
  1824. if(LL == bns1->bitype)
  1825. {
  1826. *mvalue = 1;
  1827. return;
  1828. }
  1829. ///////////gain tsn and tsny
  1830. if(bns2->bitype == LLP){
  1831. tsn  = bns2->x4 + bns2->x2 * dt;
  1832. tsny = bns2->y4 + (-1)*bns2->x1 * dt;
  1833. }
  1834. else if(bns2->bitype == CCP){//t represent the value of alph
  1835. tsn  = bns2->x1 + bns2->x2*cos(dt);
  1836. tsny = bns2->y1 + bns2->x2*sin(dt);
  1837. }
  1838. else if(bns2->bitype == LL){
  1839. tsn  = bns2->x1 - bns2->x3 * dt;//if is ll or lc or cc
  1840. tsny = bns2->y1 - bns2->y3 * dt;//mblis ==1 
  1841. }
  1842. else {
  1843. detab = pow(bns2->x5+bns2->x6*tt,2) - pow(bns2->x7+bns2->x8*tt,2);
  1844. if(fabs(detab)<= ZERO){
  1845. detab = 0;
  1846. }
  1847. else if(detab>ZERO){
  1848. detab = sqrt(detab);
  1849. }
  1850. else ASSERT(0);
  1851. tsn  = bns2->x1 -bns2->x2 - bns2->x3 * tt + mblis*bns2->x4*detab; 
  1852. tsny = bns2->y1 -bns2->y2 - bns2->y3 * tt - mblis*bns2->y4*detab;
  1853. }
  1854. ///////////////////
  1855. if(bns1->bitype == LLP){
  1856. if(fabs(bns1->x2)<=ZERO)
  1857. {
  1858. dtemp = (bns1->y4 - tsny )/bns2->x1;
  1859. }
  1860. else dtemp = (tsn - bns1->x4 )/bns2->x2;
  1861. if(dtemp<0){
  1862. *t = -dtemp;//for keep the same formation
  1863. *mvalue = -1;
  1864. }
  1865. else if(dtemp>=0)
  1866. {
  1867. *t = dtemp;
  1868. *mvalue = 1;
  1869. }
  1870. return;
  1871. }
  1872. else if(bns1->bitype == CCP){
  1873. p.x = tsn;
  1874. p.y = tsny;
  1875. dtemp = vgainangleofvector(&p);
  1876. *t = dtemp;//the fist alph value 
  1877. *mvalue = 1;
  1878. return;
  1879. }
  1880. ///////////////////
  1881. //////////////////////////above will 
  1882. if(LC == bns1->bitype || CC == bns1->bitype)
  1883. {
  1884. if(bns2->bitype == LLP||bns2->bitype == CCP)
  1885. tt = bns2->tmin;
  1886. else tt = *t;
  1887. detaa = pow(bns1->x5+bns1->x6*tt,2) - pow(bns1->x7+bns1->x8*tt,2);
  1888. if(detaa<-ZERO)ASSERT(0);
  1889. if(fabs(detaa) <=ZERO)
  1890. {
  1891. *mvalue = 1;
  1892. return ;
  1893. }
  1894. detaa = sqrt(detaa);
  1895. tfn  = bns1->x1 - bns1->x2 - bns1->x3*tt - bns1->x4*detaa;
  1896. tfny = bns1->y1 - bns1->y2 - bns1->y3*tt + bns1->y4*detaa;
  1897. tfn  = bns1->x1 - bns1->x2 - bns1->x3*tt + bns1->x4*detaa;
  1898. tfny = bns1->y1 - bns1->y2 - bns1->y3*tt - bns1->y4*detaa;
  1899. if(vdis(tsn,tsny,tfn,tfny)<=ZERO){
  1900. *mvalue = -1;
  1901. return;
  1902. }
  1903. else if(vdis(tsn,tsny,tfp,tfpy)<=ZERO){
  1904. *mvalue = 1;
  1905. return;
  1906. }
  1907. }
  1908. }
  1909. void  vgainintersectmvaluecns(PVBNS bns,PVCNS c1,PVCNS c2,PVCNS c3,double t,int *mvalue)
  1910. {
  1911. if(LL==bns->bitype)
  1912. {
  1913. *mvalue = 1;
  1914. return;
  1915. }
  1916. if(LLP==bns->bitype){}
  1917. if(LC == bns->bitype||CC == bns->bitype)
  1918. {
  1919. }
  1920. else if(CCP == bns->bitype){}
  1921. }
  1922. ////..............................................................................
  1923. int  vgainbisectorlimitedll(PVCNS l1, PVCNS l2, PVBNS *bi)
  1924. {
  1925. PVBNS bt;
  1926. double t,t1,t2,t3,t4,tt0,tt1;
  1927. double a1,a2,b1,b2,c1,c2;
  1928. vgainbisectorll(l1,l2,&bt);
  1929. if(bt==NULL)
  1930. {
  1931. *bi=bt;
  1932. return 0;
  1933. }
  1934. //以下对t1,t2赋值
  1935. vgetparaline(l1->element.line,&a1,&b1,&c1);
  1936. vgetparaline(l2->element.line,&a2,&b2,&c2);
  1937. t1 = (bt->x1 - l1->element.line->p0.x)/(a1 - bt->x3);
  1938. t2 = (bt->x1 - l1->element.line->p1.x)/(a1 - bt->x3);
  1939. t3 = (bt->x1 - l2->element.line->p0.x)/(a2 - bt->x3);
  1940. t4 = (bt->x1 - l2->element.line->p1.x)/(a2 - bt->x3);
  1941. if(t1>t2)
  1942. {
  1943. t=t1; 
  1944. t1=t2;
  1945. t2=t;
  1946. }
  1947. if(t3>t4)
  1948. {
  1949. t=t3;
  1950. t3=t4;
  1951. t4=t;
  1952. }
  1953. //
  1954. if(fabs(t4-t3)<ZERO&&t4<=t2&&t4>=t1)
  1955. {
  1956. tt0=tt1=t4;
  1957. }
  1958. else if(fabs(t1-t2)<ZERO&&t1<=t4&&t1>=t3){ tt0=tt1=t1; }
  1959. else if(t4<t1){ delete bt;*bi=NULL;return 0; }
  1960. else if(t2<t3){ delete bt;*bi=NULL;return 0; }
  1961. else if(t4>=t1 && t4<=t2)
  1962. {
  1963. if(t3<=t1)
  1964. {
  1965. tt0=t1;tt1=t4;
  1966. }
  1967. else
  1968. {
  1969. tt0=t3;tt1=t4;
  1970. }
  1971. }
  1972. else if(t4>t2)
  1973. {
  1974. tt1=t2;
  1975. if(t3<=t1)
  1976. {
  1977. tt0=t1;
  1978. }
  1979. else if(t3<=t2)
  1980. {
  1981. tt0=t3;
  1982. }
  1983. }
  1984. bt->t1=tt0;
  1985. bt->t2=tt1;
  1986. bt->m1=1;
  1987. bt->m2=1;
  1988. *bi = bt;
  1989. return 1;
  1990. }
  1991. //////........................................
  1992. int  vgainbisectorlimitedlc(PVCNS l1, PVCNS c2, PVBNS *bi)
  1993. {
  1994. PVCNS cns;
  1995. XYZ p;
  1996. double t1,t2,t3,t4,t[2],tt1,tt2,xxa,xxb,h;
  1997. int    m1,m2,m3,m4,i,mm1,mm2,clockwise;
  1998. ////...........................
  1999. PVBNS bia,bib;
  2000. vgainbisectorlc(l1,c2,&bia);
  2001. //////
  2002. p = l1->element.line->p0;
  2003. vgainpointseg(&cns,&p);
  2004. vgainintersectlcc(l1,c2,cns,&i,t);
  2005. //
  2006. if(i==2)AfxMessageBox("lcc find two solution");
  2007. if(i==0)
  2008. {
  2009. delete bia;
  2010. delete cns;
  2011. return 0;
  2012. }
  2013. h=bia->x4*sqrt(pow(bia->x5+bia->x6*t[0],2)-pow(bia->x7+bia->x8*t[0],2));
  2014. xxa = bia->x1 - bia->x2 - bia->x3*t[0] + h;
  2015. vgainbisectorlc(l1,cns,&bib);
  2016. xxb = bib->x1 - bib->x2 - bib->x3*t[0];//h==0 means deta=0;
  2017. if(fabs(xxa-xxb)<=ZERO*10)
  2018. m1=1;
  2019. else
  2020. m1=-1;
  2021. t1=t[0];
  2022. delete cns;
  2023. delete bib;
  2024. cns=NULL;bib=NULL;
  2025. //
  2026. p = l1->element.line->p1;
  2027. vgainpointseg(&cns,&p);
  2028. vgainintersectlcc(l1,c2,cns,&i,t);
  2029. //
  2030. if(i==2)AfxMessageBox("lcc find two solution");
  2031. if(i==0)
  2032. {
  2033. delete bia;
  2034. delete cns;
  2035. return 0;
  2036. }
  2037. h=bia->x4*sqrt(pow(bia->x5+bia->x6*t[0],2)-pow(bia->x7+bia->x8*t[0],2));
  2038. xxa = bia->x1-bia->x2-bia->x3*t[0]+h;
  2039. vgainbisectorlc(l1,cns,&bib);
  2040. xxb = bib->x1-bib->x2-bib->x3*t[0];//h==0 means deta=0;
  2041. if(fabs(xxa-xxb)<=ZERO*10)
  2042. m2=1;
  2043. else
  2044. m2=-1;
  2045. t2=t[0];
  2046. delete cns;
  2047. delete bib;
  2048. cns=NULL;bib=NULL;
  2049. //
  2050. if(m1==m2&&fabs(t1-t2)<ZERO)
  2051. {
  2052. delete bia;
  2053. return 0;
  2054. }
  2055. ///////////
  2056. p = c2->element.arc->px*(c2->element.arc->r/10)+c2->element.arc->pc;
  2057. vgainpointseg(&cns,&p);
  2058. vgainintersectlcc(l1,c2,cns,&i,t);
  2059. //
  2060. if(i==2)AfxMessageBox("lcc find two solution");
  2061. if(i==0)
  2062. {
  2063. delete bia;
  2064. delete cns;
  2065. return 0;
  2066. }
  2067. h=bia->x4*sqrt(pow(bia->x5+bia->x6*t[0],2)-pow(bia->x7+bia->x8*t[0],2));
  2068. xxa = bia->x1-bia->x2-bia->x3*t[0]+h;
  2069. vgainbisectorcc(c2,cns,&bib);
  2070. xxb = bib->x1-bib->x2-bib->x3*t[0];//h==0 means deta=0;
  2071. if(fabs(xxa-xxb)<=ZERO*10)
  2072. m3=1;
  2073. else
  2074. m3=-1;
  2075. t3=t[0];
  2076. delete cns;
  2077. delete bib;
  2078. cns=NULL;bib=NULL;
  2079. //
  2080. // vfindarcendpointo(c2->element.arc,&p,&clockwise);
  2081. vgainpointseg(&cns,&p);
  2082. vgainintersectlcc(l1,c2,cns,&i,t);
  2083. //
  2084. if(i==2)AfxMessageBox("lcc find two solution");
  2085. if(i==0)
  2086. {
  2087. delete bia;
  2088. delete cns;
  2089. return 0;
  2090. }
  2091. h=bia->x4*sqrt(pow(bia->x5+bia->x6*t[0],2)-pow(bia->x7+bia->x8*t[0],2));
  2092. xxa = bia->x1-bia->x2-bia->x3*t[0]+h;
  2093. vgainbisectorcc(c2,cns,&bib);
  2094. xxb = bib->x1-bib->x2-bib->x3*t[0];//h==0 means deta=0;
  2095. if(fabs(xxa-xxb)<=ZERO)
  2096. m4=1;
  2097. else
  2098. m4=-1;
  2099. t4=t[0];
  2100. delete cns;
  2101. delete bib;
  2102. cns=NULL;bib=NULL;
  2103. //
  2104. if(m3==m4&&fabs(t4-t3)<ZERO)
  2105. {
  2106. delete bia;
  2107. return 0;
  2108. }
  2109. //
  2110. if(!vcomparerights(m1,t1,m2,t2,m3,t3,m4,t4,&mm1,&tt1,&mm2,&tt2))
  2111. {
  2112. delete bia;
  2113. bia=NULL;
  2114. return 0;
  2115. }
  2116. bia->m1=mm1;bia->t1=tt1;
  2117. bia->m2=mm2;bia->t2=tt2;
  2118. bia->infinite=LIMITED;
  2119. return 1;
  2120. }
  2121. ////////.............................................
  2122. int  vgainbisectorlimitedcc(PVCNS c1, PVCNS c2, PVBNS *bi)
  2123. {
  2124. PVCNS cns;
  2125. XYZ p;
  2126. double t1,t2,t3,t4,t[2],tt1,tt2,xxa,xxb,h;
  2127. int    m1,m2,m3,m4,i,mm1,mm2;
  2128. ////...........................
  2129. PVBNS bia,bib;
  2130. vgainbisectorcc(c1,c2,&bia);
  2131. //
  2132. p = c1->element.arc->px*(c1->element.arc->r/10)+c1->element.arc->pc;
  2133. vgainpointseg(&cns,&p);
  2134. vgainintersectccc(c1,c2,cns,&i,t);
  2135. //
  2136. if(i==2)AfxMessageBox("lcc find two solution");
  2137. if(i==0)
  2138. {
  2139. delete bia;
  2140. delete cns;
  2141. return 0;
  2142. }
  2143. h=bia->x4*sqrt(pow(bia->x5+bia->x6*t[0],2)-pow(bia->x7+bia->x8*t[0],2));
  2144. xxa = bia->x1 - bia->x2 - bia->x3*t[0] + h;
  2145. vgainbisectorlc(c1,cns,&bib);
  2146. xxb = bib->x1 - bib->x2 - bib->x3*t[0];//h==0 means deta=0;
  2147. if(fabs(xxa-xxb)<=ZERO*10)
  2148. m1=1;
  2149. else
  2150. m1=-1;
  2151. t1=t[0];
  2152. delete cns;
  2153. delete bib;
  2154. cns=NULL;bib=NULL;
  2155. //
  2156. // vfindarcendpointo(c1->element.arc,&p,&clockwise);
  2157. vgainpointseg(&cns,&p);
  2158. vgainintersectccc(c1,c2,cns,&i,t);
  2159. //
  2160. if(i==2)AfxMessageBox("lcc find two solution");
  2161. if(i==0)
  2162. {
  2163. delete bia;
  2164. delete cns;
  2165. return 0;
  2166. }
  2167. h=bia->x4*sqrt(pow(bia->x5+bia->x6*t[0],2)-pow(bia->x7+bia->x8*t[0],2));
  2168. xxa = bia->x1 - bia->x2 - bia->x3*t[0] + h;
  2169. //
  2170. vgainbisectorlc(c1,cns,&bib);
  2171. xxb = bib->x1 - bib->x2 - bib->x3*t[0];//h==0 means deta=0;
  2172. if(fabs(xxa-xxb)<=ZERO*10)
  2173. m2=1;
  2174. else
  2175. m2=-1;
  2176. t2=t[0];
  2177. delete cns;
  2178. delete bib;
  2179. cns=NULL;bib=NULL;
  2180. if(m2==m1&&fabs(t1-t2)<ZERO)
  2181. {
  2182. delete bia;
  2183. return 0;
  2184. }
  2185. //
  2186. p = c2->element.arc->px*(c2->element.arc->r/10)+c2->element.arc->pc;
  2187. vgainpointseg(&cns,&p);
  2188. vgainintersectccc(c1,c2,cns,&i,t);
  2189. //
  2190. if(i==2)AfxMessageBox("lcc find two solution");
  2191. if(i==0)
  2192. {
  2193. delete bia;
  2194. delete cns;
  2195. return 0;
  2196. }
  2197. h=bia->x4*sqrt(pow(bia->x5+bia->x6*t[0],2)-pow(bia->x7+bia->x8*t[0],2));
  2198. xxa = bia->x1 - bia->x2 - bia->x3*t[0] + h;
  2199. vgainbisectorlc(c2,cns,&bib);
  2200. xxb = bib->x1 - bib->x2 - bib->x3*t[0];//h==0 means deta=0;
  2201. if(fabs(xxa-xxb)<=ZERO*10)
  2202. m3=1;
  2203. else
  2204. m3=-1;
  2205. t3=t[0];
  2206. delete cns;
  2207. delete bib;
  2208. cns=NULL;bib=NULL;
  2209. //
  2210. // vfindarcendpointo(c2->element.arc,&p,&clockwise);
  2211. vgainpointseg(&cns,&p);
  2212. vgainintersectccc(c1,c2,cns,&i,t);
  2213. //
  2214. if(i==2)AfxMessageBox("lcc find two solution");
  2215. if(i==0)
  2216. {
  2217. delete bia;
  2218. delete cns;
  2219. return 0;
  2220. }
  2221. h=bia->x4*sqrt(pow(bia->x5+bia->x6*t[0],2)-pow(bia->x7+bia->x8*t[0],2));
  2222. xxa = bia->x1 - bia->x2 - bia->x3*t[0] + h;
  2223. //
  2224. vgainbisectorlc(c2,cns,&bib);
  2225. xxb = bib->x1 - bib->x2 - bib->x3*t[0];//h==0 means deta=0;
  2226. if(fabs(xxa-xxb)<=ZERO*10)
  2227. m4=1;
  2228. else
  2229. m4=-1;
  2230. t4=t[0];
  2231. delete cns;
  2232. delete bib;
  2233. cns=NULL;bib=NULL;
  2234. //
  2235. if(m3==m4&&fabs(t4-t3)<ZERO)
  2236. {
  2237. delete bia;
  2238. return 0;
  2239. }
  2240. //
  2241. if(!vcomparerights(m1,t1,m2,t2,m3,t3,m4,t4,&mm1,&tt1,&mm2,&tt2))
  2242. {
  2243. delete bia;
  2244. bia=NULL;
  2245. return 0;
  2246. }
  2247. bia->m1=mm1;bia->t1=tt1;
  2248. bia->m2=mm2;bia->t2=tt2;
  2249. bia->infinite=LIMITED;
  2250. return 1;
  2251. }
  2252. int  vgainbisectorlimited(PVCNS c1, PVCNS c2, PVBNS *bi)
  2253. {
  2254. PVBNS bt;
  2255. if(CAXLINE==c1->type)
  2256. {
  2257. if(CAXLINE==c2->type)
  2258. vgainbisectorlimitedll(c1,c2,&bt);
  2259. else if(CAXARC==c2->type)
  2260. vgainbisectorlimitedlc(c1,c2,&bt);
  2261. }
  2262. else if(CAXARC==c1->type)
  2263. {
  2264. if(CAXLINE==c2->type)
  2265. vgainbisectorlimitedlc(c2,c1,&bt);
  2266. else if(CAXARC==c2->type)
  2267. vgainbisectorlimitedcc(c1,c2,&bt);
  2268. }
  2269. *bi=bt;
  2270. if(bt==NULL)
  2271. {
  2272. return 0;
  2273. }
  2274. else
  2275. {
  2276. return 1;
  2277. }
  2278. }
  2279. ////////........................................................
  2280. //////////////////////.............................................................
  2281. //make sure the cnbl  must be the double link
  2282. //进行环的转换
  2283. double vmultipointvector(PXYZ v1,PXYZ v2)
  2284. {
  2285. return v1->x*v2->x+v1->y*v2->y;
  2286. }
  2287. double vmultiplayvector(PXYZ v1,PXYZ v2)
  2288. {
  2289. return v1->x*v2->y-v1->y*v2->x;
  2290. }
  2291. double vgainangleofvector(PXYZ v)
  2292. {
  2293. if(fabs(v->x)<ZERO)
  2294. {
  2295. if(v->y>ZERO)
  2296. return PI/2;
  2297. else if(v->y<-ZERO)
  2298. return 1.5*PI;
  2299. else 
  2300. ASSERT(0);
  2301. }
  2302. else if(fabs(v->x)>ZERO)
  2303. {
  2304. if(v->x>ZERO)
  2305. {
  2306. if(v->y>ZERO)
  2307.     return atan(v->y/v->x);
  2308. else if(v->y<-ZERO)
  2309. return 2*PI+atan(v->y/v->x); 
  2310. else 
  2311. return 0;
  2312. }
  2313. else
  2314. {
  2315.    return PI+atan(v->y/v->x);
  2316. }
  2317. }
  2318. }
  2319. double vangleadd(double a1,double a2)
  2320. {
  2321. double t;
  2322. t=a1+a2;
  2323. if(t>=PI*2)
  2324. t=t-PI*2;
  2325. if(t<0.)
  2326. t=t+PI*2;
  2327. return t;
  2328. }
  2329. void vfindarcendpoint(PARC arc,PXYZ *pt)//?
  2330. {
  2331. ASSERT(arc);
  2332. XYZ px,py,pc;
  2333. PXYZ p=new XYZ;
  2334. double a,r,alph,blph;
  2335. int i;
  2336. a=arc->a;
  2337. r=arc->r;
  2338. pc=arc->pc;
  2339. px=arc->px-pc;
  2340. py=arc->py-pc;
  2341. alph=vgainangleofvector(&px);
  2342. blph=vgainangleofvector(&py);
  2343. if(fabs(vangleadd(alph,PI/2)-blph)<EP)
  2344. i=1;
  2345. else
  2346. i=-1;
  2347. alph=vangleadd(alph,i*a);
  2348. *pt=p;
  2349. p->x=pc.x+r*cos(alph);
  2350. p->y=pc.y+r*sin(alph);
  2351. p->z=0;
  2352. return;
  2353. }
  2354. void vfindarcendpointo(PARC arc,PXYZ *pt,int *clockwise)
  2355. {
  2356. ASSERT(arc);
  2357. XYZ px,py;
  2358. PXYZ p = new XYZ;
  2359. double alph,blph;
  2360. px = arc->px - arc->pc;
  2361. py = arc->py - arc->pc; 
  2362. alph = vgainangleofvector(&px);
  2363. blph = vgainangleofvector(&py);
  2364. double t = vangleadd(alph,PI/2);
  2365. if(fabs(t-blph)<=ZERO*10||(blph>t&&2*PI-blph+t<=ZERO*10)||(blph<t&&2*PI -t+blph<=ZERO*10))
  2366. {
  2367. *clockwise = 1;//CCW
  2368. }
  2369. else
  2370. {
  2371. t = vangleadd(alph,-PI/2);
  2372. if(fabs(t-blph)<=ZERO*10||(blph<t&&2*PI-t+blph<=ZERO*10)||
  2373. (blph>t&&2*PI-blph+t<=ZERO*10))
  2374. {
  2375. *clockwise = -1;//CW
  2376. }
  2377. else ASSERT(0);
  2378. }
  2379. alph = vangleadd(alph,*clockwise*arc->a);
  2380. *pt = p;
  2381. p->x = cos(alph);
  2382. p->y = sin(alph);
  2383. p->z = 0;
  2384. return;
  2385. }
  2386. int  vgetclockwisebli(PVBLI bli)
  2387. {
  2388. ASSERT(bli);
  2389. ASSERT(bli->bni);ASSERT(bli->bni->bns);
  2390. PVBNS bns;
  2391. bns = bli->bni->bns;
  2392. double tm1,tm2,t;
  2393. int m;
  2394. tm1 = bns->t1 * bns->m1;
  2395. tm2 = bns->t2 * bns->m2;
  2396. if(tm2 - tm1<-ZERO)
  2397. {
  2398. m = bns->m1;
  2399. t = bns->t1;
  2400. bns->m1 = bns->m2;
  2401. bns->t1 = bns->t2;
  2402. bns->t2 = t;
  2403. bns->m2 = m;
  2404. return CW;
  2405. }
  2406. else if(fabs(tm1-tm2)<ZERO)
  2407. {
  2408. //can be writed in the funture
  2409. }
  2410. return CCW;
  2411. }
  2412. //find t
  2413. /*
  2414. int vjudgepointinareal(PXYZ p,XYZ p0,XYZ p1)
  2415. {
  2416. XYZ v1,v2,v3;
  2417. double t,t1,t2;
  2418. v1=*p-p0;
  2419. v2=p1-p0;
  2420. v3=*p-p1;
  2421. t  = vmultipointvector(&v1,&v2);
  2422. t1 = vmultiplayvector(&v1,&v2);
  2423. t2 = vmultpointvector(&v3,&v1);
  2424. if(t1<-ZERO||t<-ZERO||t2>ZERO)
  2425. return 0;
  2426. if(t>ZERO&&t2<-ZERO&&t>ZERO)
  2427. return 1;
  2428. if(t>-ZERO&&t<ZERO)
  2429. {
  2430. return 2;//end in first point
  2431. }
  2432. if(t2>-ZERO&&t2<ZERO)
  2433. {
  2434. return 3;//end in end point
  2435. }
  2436. }
  2437. int vjudgepointinareaa(PXYZ p,XYZ pc,XYZ px, XYZ py,double r)
  2438. {
  2439. XYZ  v;
  2440. double t,tf,te;
  2441. v = arc->px-arc->pc;
  2442. tf = vgainangleofvector(v);
  2443. v = *p-arc->pc;
  2444. t = vgainangleofvector(v);
  2445. te = tf+arc->a;
  2446. if(te<PI*2)
  2447. {
  2448. if(fabs(tf-t)<ZERO)
  2449. return 2;
  2450. if(fabs(te-t)<ZERO)
  2451. return 3;
  2452. if(t<te&&t>tf)
  2453. return 1;
  2454. }
  2455. else
  2456. {
  2457. te=te-PI*2;
  2458. if(fabs(tf-t)<ZERO)
  2459. return 2;
  2460. if(fabs(te-t)<ZERO)
  2461. return 3;
  2462. if((t<te)||t>tf)
  2463. return 1;
  2464. }
  2465. }
  2466. int vjudgepointinarea(PXYZ p,PVCNS cns)
  2467. {
  2468. ASSERT(p);ASSERT(cns);
  2469. XYZ p1,p2;
  2470. int clocwise,type,juge;
  2471. type=cns->type;
  2472. clocwise=cns->clockwise;
  2473. if(CAXLINE==type)
  2474. {
  2475. if(clowise==CCW)
  2476. {
  2477. judge = vjudgepointinareal(p,cns->element.line->px,cns->element.line->py);
  2478. return judge;
  2479. }
  2480. else if(clocwise==CW)
  2481. {
  2482. judge = vjudgepointinareal(p,cns->element.line->py,cns->element.line->px);
  2483. return judge;
  2484. }
  2485. }
  2486. if(CAXARC==type)
  2487. {
  2488. if(clowise==CCW)
  2489. {
  2490. judge=vjudgepointinareaa(p,cns->element.arc);
  2491. }
  2492. else if(clowise==CW)
  2493. {
  2494. }
  2495. }
  2496. }
  2497. */
  2498. //the arc's own direction,from pfirst to pend.
  2499. double vfindnearestarcpoint(PARC arc,int *i,int *iclockwise)
  2500. {//only for perpendi
  2501. ASSERT(arc);
  2502. XYZ px,py,pc;
  2503. PXYZ p;
  2504. double a,b,c;
  2505. int clockwise;
  2506. pc = arc->pc;
  2507. px = arc->px - pc;
  2508. vfindarcendpointo(arc,&p,&clockwise);
  2509. *iclockwise = clockwise;
  2510. py.x = p->x;
  2511. py.y = p->y;
  2512. delete p;p= NULL;
  2513. //
  2514. a = vgainangleofvector(&px);
  2515. b = vgainangleofvector(&py);
  2516. if(clockwise == CCW)
  2517. {
  2518. c = b - a;
  2519. if(c<=-ZERO)
  2520. {
  2521. b = 2*PI + c; 
  2522. }
  2523. if(PI-a>=ZERO&&b-PI>= -ZERO)
  2524. {
  2525. *i = 1;
  2526. return PI;
  2527. }
  2528. else
  2529. {
  2530. *i=0;
  2531. return a;
  2532. }
  2533. }
  2534. else if(clockwise == CW)
  2535. {
  2536. c = a - b;
  2537. if(c<=-ZERO)
  2538. {
  2539. c = 2*PI + c; 
  2540. }
  2541. if(PI-b>=ZERO&&a-PI>= -ZERO)
  2542. {
  2543. *i = 1;
  2544. return PI;
  2545. }
  2546. else
  2547. {
  2548. *i = 0;
  2549. return a;
  2550. }
  2551. }
  2552. }
  2553. int vgainarcdirection(PARC arc)
  2554. {
  2555. ASSERT(arc);
  2556. XYZ px,py,pc;
  2557. PXYZ p=new XYZ;
  2558. double a,r,alph,blph;
  2559. a=arc->a;
  2560. r=arc->r;
  2561. pc=arc->pc;
  2562. px=arc->px-pc;
  2563. py=arc->py-pc;
  2564. alph=vgainangleofvector(&px);
  2565. blph=vgainangleofvector(&py);
  2566. if(fabs(vangleadd(alph,PI/2)-blph)<EP)
  2567. return CCW;
  2568. else
  2569. return CW;
  2570. }
  2571. int  vlineintarc(PLINE l1,PARC a1,PSTR3D *p)
  2572. {
  2573. PSTR3D o_p;
  2574. o_p=NULL;
  2575. int flag=ciInterLineArcAllActualOnPlane(l1, a1 , &o_p);
  2576. *p = o_p;
  2577. return flag;
  2578. }
  2579. //nead rewrited but it is sufficiant  if only line and without arc
  2580. void vjugedirection(PVCNBL cnbl,int *flag)
  2581. {//没有处理重复段,单段,自交段//I think it will be at fault.find it way out sir
  2582. ASSERT(cnbl);ASSERT(cnbl->cns);
  2583. PVCNBL cnblt = NULL,cnbl1=NULL,cnbl2=NULL;
  2584. double x,y,x0,y0,alph,tempt;
  2585. PXYZ   p;
  2586. int cnblflag,clockwiseflag,cnblflag0 = 0,clockwise;
  2587. if(cnbl->ccw == cnbl && CAXARC == cnbl->cns->type)//圆,弧
  2588. {
  2589. *flag = CCW;
  2590. return;
  2591. }
  2592. else if(cnbl->ccw == cnbl && CAXARC!=cnbl->cns->type)
  2593. {
  2594. AfxMessageBox("find spline,please");
  2595. *flag = ERRO;//erro = 0
  2596. return;
  2597. }
  2598. cnblt=cnbl1=cnbl2=cnbl;
  2599. if(CAXLINE == cnblt->cns->type)
  2600. {
  2601. x0 = cnblt->cns->element.line->p0.x;
  2602. y0 = cnblt->cns->element.line->p0.y;
  2603. }
  2604. else if(CAXARC == cnblt->cns->type)
  2605. {
  2606. alph = vfindnearestarcpoint(cnblt->cns->element.arc,&cnblflag,&clockwise);
  2607. if(cnblflag == 1)
  2608. {
  2609. x0 = cnblt->cns->element.arc->pc.x - cnblt->cns->element.arc->r;
  2610. y0 = cnblt->cns->element.arc->pc.y;
  2611. clockwiseflag = clockwise;
  2612. }
  2613. else if(cnblflag == 0)
  2614. {
  2615. x0 = cos(alph)*cnblt->cns->element.arc->r + cnblt->cns->element.arc->pc.x;
  2616. y0 = sin(alph)*cnblt->cns->element.arc->r + cnblt->cns->element.arc->pc.y;
  2617. }
  2618. }
  2619. else ASSERT(0);
  2620. do
  2621. {
  2622. cnblt = cnblt->ccw;
  2623. if(CAXLINE == cnblt->cns->type)
  2624. {
  2625. x = cnblt->cns->element.line->p0.x;
  2626. y = cnblt->cns->element.line->p0.y;
  2627. if(x-x0<-ZERO||(fabs(x-x0)<=ZERO&&y-y0>=ZERO))
  2628. {
  2629. x0 = x;
  2630. y0 = y;
  2631. cnbl1 = cnblt;
  2632. cnblflag0 = 0;
  2633. }
  2634. }
  2635. else if(CAXARC==cnblt->cns->type)
  2636. {
  2637. alph = vfindnearestarcpoint(cnblt->cns->element.arc,&cnblflag,&clockwise);
  2638. if(cnblflag == 1)
  2639. {
  2640. x = cnblt->cns->element.arc->pc.x - cnblt->cns->element.arc->r;
  2641. y = cnblt->cns->element.arc->pc.y;
  2642. if(x-x0<-ZERO||(fabs(x-x0)<=ZERO&&y-y0>=ZERO))
  2643. {
  2644. x0 = x;
  2645. y0 = y;
  2646. cnbl1 = cnblt;
  2647. clockwiseflag = clockwise;
  2648. cnblflag0 = 1;//this mark that the arc have contain the leftest point.
  2649. }
  2650. }
  2651. else if(cnblflag == 0)
  2652. {//this all be the first point of the segment
  2653. x = cos(alph)*cnblt->cns->element.arc->r + cnblt->cns->element.arc->pc.x;
  2654. y = sin(alph)*cnblt->cns->element.arc->r + cnblt->cns->element.arc->pc.y;
  2655. if(x-x0<-ZERO||(fabs(x-x0)<=ZERO&&y-y0>=ZERO))
  2656. {
  2657. x0 = x;
  2658. y0 = y;
  2659. cnbl1 = cnblt;
  2660. cnblflag0 = 0;
  2661. }
  2662. }
  2663. }
  2664. else ASSERT(0);
  2665. }while(cnblt!=cnbl);
  2666. XYZ p0,p1,p2;//以下代码应该可以简化
  2667. if(cnblflag0 == 1)//if we find the furtherest point in arc then
  2668. {
  2669. *flag = clockwiseflag;
  2670. return ;
  2671. }//below is the case that cnblflag0 = 0. 
  2672. if(CAXARC == cnbl1->cns->type)
  2673. {
  2674. p2 = cnbl1->cns->element.arc->px - cnbl1->cns->element.arc->pc;
  2675. vfindarcendpointo(cnbl1->cns->element.arc,&p,&clockwise);
  2676. delete p; p = NULL;
  2677. if(clockwise == CCW)
  2678. {
  2679. tempt=p2.x;
  2680. p2.x = -p2.y;
  2681. p2.y = tempt;
  2682. }
  2683. else if (clockwise == CW)
  2684. {
  2685. tempt=p2.x;
  2686. p2.x  =  p2.y;
  2687. p2.y  = -tempt;
  2688. }
  2689. }
  2690. else if(CAXLINE==cnbl1->cns->type)
  2691. {
  2692. p2 = cnbl1->cns->element.line->p1 - cnbl1->cns->element.line->p0;
  2693. }
  2694. //
  2695. if(CAXARC == cnbl1->cw->cns->type)
  2696. {
  2697. vfindarcendpointo(cnbl1->cns->element.arc,&p,&clockwise);
  2698. if(clockwise == CCW)
  2699. {
  2700. p1.x = -p->y*10;
  2701. p1.y = p->x*10;
  2702. }
  2703. else if(clockwise == CW)
  2704. {
  2705. p1.x =  p->y*10;
  2706. p1.y = -p->x*10;
  2707. }
  2708. delete p;p=NULL;
  2709. }
  2710. else if(CAXLINE == cnbl1->cw->cns->type)
  2711. {
  2712. p1 = cnbl1->cw->cns->element.line->p1 - cnbl1->cw->cns->element.line->p0;
  2713. }
  2714. if(vmultiplayvector(&p1,&p2)<-ZERO)
  2715. {
  2716. *flag = CW;
  2717. }
  2718. else
  2719. {
  2720. *flag = CCW;
  2721. }
  2722.     return;
  2723. }
  2724. void vreversecns(PVCNS cns,int cnstype)//finished
  2725. {//we make sure that the cn->reflex*cn->clockwise = CCW/1(环),CW/-1(岛)
  2726. //in the meantime we must make sure of the clockwise can use for bisector calculation
  2727. ASSERT(cns);
  2728. PVCNS cn;
  2729. PXYZ  p;
  2730. int clockwise;
  2731. cn = cns;
  2732. XYZ tp;
  2733. if(CAXARC == cn->type)
  2734. {
  2735. vfindarcendpointo(cn->element.arc,&p,&clockwise);
  2736. cn->element.arc->px.x = 10*p->x + cn->element.arc->pc.x;
  2737. cn->element.arc->px.y = 10*p->y + cn->element.arc->pc.y;
  2738. if(clockwise == CW)
  2739. {
  2740. cn->element.arc->py.x = -10*p->y + cn->element.arc->pc.x;
  2741. cn->element.arc->py.y =  10*p->x + cn->element.arc->pc.y;
  2742. cn->clockwise = cnstype * (-1);
  2743. cn->reflex = -1;
  2744. }
  2745. else
  2746. {
  2747. cn->element.arc->py.x =  10*p->y + cn->element.arc->pc.x;
  2748. cn->element.arc->py.y = -10*p->x + cn->element.arc->pc.y;
  2749. cn->clockwise = cnstype;
  2750. cn->reflex = 1;
  2751. }
  2752. delete p;
  2753. }
  2754. else if(CAXLINE == cn->type)
  2755. {
  2756. tp = cn->element.line->p0;
  2757. cn->element.line->p0 = cn->element.line->p1;
  2758. cn->element.line->p1 = tp;
  2759. cn->clockwise = cnstype;
  2760. }
  2761. }
  2762. void varrangecnbl(PVCNBL cnbl , int flag,int cnstype)
  2763. {
  2764. PVCNBL cn,tcnbl;
  2765. cn = cnbl;
  2766. PXYZ p;
  2767. int clockwise;
  2768. if(flag == CCW)
  2769. {
  2770. do{
  2771. if(cn->cns->type == CAXARC)
  2772. {
  2773. vfindarcendpointo(cn->cns->element.arc,&p,&clockwise);//only for the clockwise
  2774. cn->cns->clockwise = -cnstype * clockwise;
  2775. cn->cns->reflex = -clockwise;//
  2776. }
  2777. else
  2778. cn->cns->clockwise = cnstype;
  2779. }while(cn!=0&&cn!=cnbl);
  2780. }
  2781. else{
  2782. do{
  2783. tcnbl   = cn->ccw;
  2784. cn->ccw = cn->cw;
  2785. cn->cw  = tcnbl;
  2786. vreversecns(cn->cns,cnstype);
  2787. cn = cn->ccw;
  2788. }while(cn!=0&&cn!=cnbl);
  2789. }
  2790. }
  2791. //if cnbla and cnblb have reflex rlationship
  2792. //then below insert a reflex between them;
  2793. void vinsertpointseg(PVCNBL cnbla,PVCNBL cnblb)
  2794. {
  2795. ASSERT(cnbla);ASSERT(cnblb);
  2796.     XYZ px,py,pc;
  2797. PXYZ p;
  2798. PVCNBL cnbl;
  2799. PVCNS  c;
  2800. int clockwise;
  2801. cnbl=vmalloccnbl();
  2802. cnbl->cns=vmalloccns();
  2803. if(CAXLINE == cnblb->cns->type)
  2804. {
  2805. //if(cnblb->clockwise == CCW)
  2806. px = cnblb->cns->element.line->p0;
  2807. //else if (cnblb->clockwise == CW)
  2808. // px = cnblb->cns->element.line->p1;
  2809. }
  2810. else if(CAXARC==cnblb->cns->type)
  2811. {
  2812. //if(cnblb->clockwise == CCW)//all directions are in ccw met
  2813. px = cnblb->cns->element.arc->px*(cnblb->cns->element.arc->r/10);
  2814. // else if(cnblb->clockwise == CW)
  2815. // {
  2816. // vfindarcendpointo(arc,&p,&clockwise);
  2817. //}
  2818. }
  2819. vgainpointseg(&c,&px);
  2820. cnbl->cns  = c;
  2821. cnbl->cns->clockwise = cnbl->cns->clockwise;
  2822. cnbl->cw   =cnbla;
  2823. cnbl->ccw  =cnblb;
  2824. cnbla->ccw =cnbl;
  2825. cnblb->cw  =cnbl;
  2826. return;
  2827. }
  2828. //judge whether the cnsf and cnse are reflex relation
  2829. //return REFLEX OF UNREFLEX;
  2830. int vjudgeangle(PVCNS cnsf,PVCNS cnse)
  2831. {
  2832. ASSERT(cnsf);ASSERT(cnse);
  2833. double t;
  2834. XYZ p0,p1,p2;
  2835. PXYZ p = NULL;
  2836. int clockwise;
  2837. if(CAXLINE == cnsf->type)
  2838. {
  2839. p1 = cnsf->element.line->p1 - cnsf->element.line->p0;
  2840. if(CAXLINE == cnse->type)
  2841. {
  2842. p2 = cnse->element.line->p1 - cnse->element.line->p0;
  2843. }
  2844. else if(CAXARC == cnse->type)
  2845. {
  2846. vfindarcendpointo(cnse->element.arc,&p,&clockwise);
  2847. delete p;p=NULL;
  2848. p2 = cnse->element.arc->px - cnse->element.arc->pc;
  2849. t = p2.x;
  2850. if(clockwise == CCW)
  2851. {
  2852. p2.x = -p2.y;
  2853. p2.y = t;
  2854. }
  2855. else{
  2856. p2.x = p2.y;
  2857. p2.y = -t;
  2858. }
  2859. }
  2860. }
  2861. else if(CAXARC == cnsf->type)
  2862. {
  2863. vfindarcendpointo(cnsf->element.arc,&p,&clockwise);
  2864. p1.x = p->x*10;
  2865. p1.y = p->y*10;
  2866. delete p;p=NULL;
  2867. t = p1.x;
  2868. if(clockwise == CCW)
  2869. {
  2870. p1.x = -p1.y;
  2871. p1.y = t;
  2872. }
  2873. else if (clockwise == CW)
  2874. {
  2875. p1.x = p1.y;
  2876. p1.y = -t;
  2877. }
  2878. if(CAXLINE == cnse->type)
  2879. {
  2880. p2 = cnse->element.line->p1 - cnse->element.line->p0;
  2881. }
  2882. else if(CAXARC == cnse->type)
  2883. {
  2884. vfindarcendpointo(cnsf->element.arc,&p,&clockwise);
  2885. delete p; p=NULL;
  2886. p2 = cnse->element.arc->px - cnse->element.arc->pc;
  2887. t = p2.x;
  2888. if(clockwise == CCW)
  2889. {
  2890. p2.x = -p2.y;
  2891. p2.y = t;
  2892. }
  2893. else if(clockwise == CW)
  2894. {
  2895. p2.x = p2.y;
  2896. p2.y = -t;
  2897. }
  2898. }
  2899. }
  2900. t = vmultiplayvector(&p1,&p2);
  2901. //if I let the line's reflex =1 then two if can be compact to one
  2902. if(CAXARC == cnsf->type)
  2903. {
  2904. if(t*cnsf->clockwise*cnsf->reflex>=0)//=0 tangential 
  2905. return UNREFLEX;
  2906. else 
  2907. return REFLEX;
  2908. }
  2909. else if(CAXLINE == cnsf->type)
  2910. {
  2911. if(t*cnsf->clockwise>=0)//=0 tangential
  2912. {
  2913. return UNREFLEX;
  2914. }
  2915. else 
  2916. {
  2917. return REFLEX;
  2918. }
  2919. }
  2920. }
  2921. //request cnbl'loop have been arranged,or cnbl'loop'node'direction
  2922. void  vchangepcurvetocnblloop(PCURVE curve,PVCNBL *cnbl)
  2923. {
  2924. ASSERT(curve);
  2925. PVCNBL cnblt,cnblstf,cnblb;
  2926. PCURVE cur;
  2927. cur = curve;
  2928. do{
  2929. if(curve==cur)
  2930. {
  2931. cnblstf = cnblt = vmalloccnbl();
  2932. *cnbl=cnblstf;
  2933. cnblt->cns = vmalloccns();
  2934. cnblt->cns->type=cur->type;
  2935. cnblt->cns->element=cur->element;
  2936. cnblb=cnblt;
  2937. }
  2938. else
  2939. {
  2940. cnblt=vmalloccnbl();
  2941. cnblt->cns=vmalloccns();
  2942. cnblt->cns->type=cur->type;
  2943. cnblt->cns->element=cur->element;
  2944. cnblt->cw=cnblb;
  2945. cnblb->ccw=cnblt;
  2946. cnblb=cnblt;
  2947. }
  2948.     cur=cur->next;
  2949. }while(cur);
  2950. cnblb->ccw=cnblstf;
  2951. cnblstf->cw=cnblb;
  2952. return;
  2953. }
  2954. void vgainarrangedcnbl(PCURVE curve,PVCNBL *cnbl,int itype)
  2955. {
  2956. PVCNBL cnblt;
  2957. int flag;
  2958. vchangepcurvetocnblloop(curve,&cnblt);
  2959. vjugedirection(cnblt,&flag);
  2960. varrangecnbl(cnblt,flag,itype);
  2961. *cnbl=cnblt;
  2962. return;
  2963. }
  2964. void vpreprossesscnbl(PVCNBL cnbl,PVPL *vpl)
  2965. {
  2966. PVPL pl=NULL;
  2967. PVPLF plfa=NULL,plfb=NULL,plf=NULL,plfsta;
  2968. PVCNBL cnbla,cnblb,cnblsta,cnblf;
  2969. PVCNS  cns,cnsa,cnsb;
  2970. int flag = 1,label = 1,sum = 0;
  2971. int flagangle;
  2972. //
  2973. cnblb = cnbl;
  2974. cnbla = cnbl;
  2975. cnblsta=cnbla;
  2976. //
  2977. do{
  2978. cnsa = cnbla->cns;
  2979. cnblf = cnbla->cw;
  2980. cns = cnbla->cw->cns;
  2981. flagangle = vjudgeangle(cns,cnsa);
  2982. if(UNREFLEX == flagangle)
  2983. {
  2984. flag = 0;
  2985. }
  2986. else if(REFLEX==flagangle)
  2987. {
  2988. //insert an seg
  2989. vinsertpointseg(cnblf,cnbla);
  2990. if(cnblf==cnbl)
  2991. {
  2992. label=0;
  2993. }
  2994. else if(cnblf!=cnbl)
  2995. {
  2996. cnbla=cnblf;
  2997. }
  2998. }
  2999. }while(flag&&label);
  3000. //
  3001. if(!label)//whole loop
  3002. {
  3003. pl=vmallocpl();
  3004. plfa=vmallocplf();
  3005. if(cnbl->ccw==cnbl)
  3006. plfa->type=SINGLEPLF;
  3007. else
  3008. plfa->type=MULIPLF;
  3009. plfa->scnbl = cnbla;
  3010. plfa->ecnbl = cnbl;
  3011. pl->ptype=SINGLE;
  3012. pl->eplf=pl->splf=plfa;
  3013. *vpl = pl;
  3014. return;
  3015. }
  3016. else//not whole loop
  3017. {
  3018. if(cnbla->cw==cnbl)
  3019. {
  3020. pl=vmallocpl();
  3021. plfa=vmallocplf();
  3022. if(cnbl->cw==cnbla)
  3023. plfa->type=SINGLEPLF;
  3024. else
  3025. plfa->type=MULIPLF;
  3026. plfa->scnbl = cnbla->ccw;
  3027. plfa->ecnbl = cnbl;
  3028. plf = vmallocplf();
  3029. plf->type=SINGLEPLF;
  3030. plf->scnbl=plf->ecnbl=cnbla;
  3031. plf->ccw=plfa;
  3032. plf->cw=plfa;
  3033. plfa->ccw=plfa->cw=plf;
  3034. pl->eplf=plf;
  3035. pl->splf=plfa;
  3036. pl->ptype=MULI;
  3037. *vpl=pl;
  3038. return;
  3039. }
  3040. else{
  3041. plfa=vmallocplf();
  3042. plfa->scnbl=cnbla;
  3043. }
  3044. }
  3045. flag=0;
  3046. label=1;
  3047. cnblb=cnbl;
  3048. cnblsta=cnbla;
  3049. plfsta=plfa;
  3050. do{
  3051. cnsb=cnblb->cns;
  3052. cnblf=cnblb->ccw;
  3053. cns=cnblb->ccw->cns;
  3054. flagangle=vjudgeangle(cnsb,cns);
  3055. //
  3056. if(UNREFLEX==flagangle)
  3057. {
  3058. if(flag==0)
  3059. {
  3060. if(cnblb->ccw==cnbla)
  3061. {
  3062. pl=vmallocpl();
  3063. plfa=vmallocplf();
  3064. plfa->type=MULIPLF;
  3065. plfa->scnbl = cnbla->ccw;
  3066. plfa->ecnbl = cnblb;
  3067. //
  3068. plf = vmallocplf();
  3069. plf->type=SINGLEPLF;
  3070. plf->scnbl=plf->ecnbl=cnbla;
  3071. //
  3072. plf->ccw=plfa;
  3073. plf->cw=plfa;
  3074. plfa->ccw=plf;
  3075. plfa->cw=plf;
  3076. //
  3077. pl->eplf=plf;
  3078. pl->splf=plfa;
  3079. pl->ptype=MULI;
  3080. *vpl=pl;
  3081. return;
  3082. }
  3083. plfsta->ecnbl=cnblb;
  3084. if(cnblb==plfsta->scnbl)
  3085. plfsta->type=SINGLEPLF;
  3086. else
  3087. plfsta->type=MULIPLF;
  3088. //
  3089. cnbla = cnblb->ccw;
  3090. cnblb = cnbla;
  3091. flag = 1;
  3092. }
  3093. else{
  3094. if(cnblb->ccw==cnblsta)//end
  3095. {
  3096. plfb=vmallocplf();
  3097. plfb->scnbl=cnbla;
  3098. plfb->ecnbl=cnblb;
  3099. if(cnbla!=cnblb)
  3100. {
  3101. plfb->type=MULIPLF;
  3102. }
  3103. else
  3104. {
  3105. plfb->type=SINGLEPLF;
  3106. }
  3107. plfb->cw=plfa;
  3108. plfa->ccw=plfb;
  3109. //
  3110. plfsta->cw=plfb;
  3111. plfb->ccw=plfsta;
  3112. //
  3113. pl=vmallocpl();
  3114. pl->splf=plfsta;
  3115. pl->eplf=plfb;
  3116. if(plfb==plfsta)
  3117. {
  3118. pl->ptype=SINGLE;
  3119. }
  3120. else
  3121. {
  3122. pl->ptype=MULI;
  3123. }
  3124. //
  3125. label=0;
  3126. *vpl=pl;
  3127. }
  3128. else
  3129. {
  3130. //
  3131. plfb=vmallocplf();
  3132. plfb->scnbl=cnbla;
  3133. plfb->ecnbl=cnblb;
  3134. if(plfb->ecnbl==plfb->scnbl)
  3135. plfb->type=SINGLE;
  3136. else
  3137. plfb->type=MULIPLF;
  3138. //
  3139. plfa->ccw =plfb;
  3140. plfb->cw =plfa;
  3141. plfa=plfb;
  3142. //
  3143. cnbla=cnblb->ccw;
  3144. cnblb=cnbla;
  3145. }
  3146. }
  3147. }
  3148. ///
  3149. else if(REFLEX==flagangle)
  3150. {
  3151. vinsertpointseg(cnblb,cnblf);
  3152. cnblb=cnblf;
  3153. }
  3154. }while(label);
  3155. }
  3156. void vgainprofilebycurve(PCURVE curve,PVPL *vpl,int itype)
  3157. {
  3158. PVCNBL cnbl;
  3159. PVPL  vplt;
  3160. vgainarrangedcnbl(curve,&cnbl,itype);
  3161. vpreprossesscnbl(cnbl,&vplt);
  3162. *vpl=vplt;
  3163. return;
  3164. }
  3165. ////////////.................................................................
  3166. void vgainpointseg(PVCNS *c,PXYZ p)
  3167. {
  3168. ASSERT(p);
  3169. PVCNS cn;
  3170. cn = vmalloccns(); 
  3171. *c = cn;
  3172. cn->element.arc = new ARC;
  3173. cn->type = CAXARC;
  3174. cn->element.arc->r = 0;
  3175. cn->element.arc->a = 2*PI;
  3176. cn->element.arc->pc.x = p->x;
  3177. cn->element.arc->pc.y = p->y;
  3178. cn->element.arc->pc.z = p->z;
  3179.   return;
  3180. }
  3181. void vaddpointsegcnbl(PVCNS *c,PXYZ p,PVCNBL *cnbl)
  3182. {
  3183. ASSERT(p);
  3184. PVCNBL tcnbl=NULL;
  3185. //
  3186. PVCNS cn=new VCNS;
  3187. *c=cn;
  3188.     cn->clockwise=CCW;
  3189. cn->element.arc=new ARC;
  3190. cn->reflex=0;
  3191. cn->type=CAXARC;
  3192. cn->element.arc->r=0;
  3193. cn->element.arc->pc.x=p->x;
  3194. cn->element.arc->pc.y=p->y;
  3195. cn->element.arc->pc.z=p->z;
  3196. //
  3197. tcnbl=new VCNBL;
  3198. tcnbl->bli=new VBLI;
  3199. tcnbl->cns=cn;
  3200. tcnbl->bli->bni=new VBNI;
  3201.   return;
  3202. }
  3203. void vaddpointsegpre(PVCNBL cnbl)//cw 方向
  3204. {
  3205. ASSERT(cnbl);
  3206. ASSERT(cnbl->cns);
  3207. ASSERT(1!=cnbl->flag);
  3208. XYZ px,py;
  3209. PXYZ p;
  3210. int clockwise;
  3211. PVCNS cns = NULL;
  3212. PVCNBL tcnbl = NULL,cnblt;
  3213. tcnbl = vmalloccnbl();
  3214. //
  3215. if(CAXLINE == cnbl->cns->type)
  3216. {
  3217. px = cnbl->cns->element.line->p0;
  3218. py = cnbl->cns->element.line->p1;
  3219. }
  3220. else if(CAXARC == cnbl->cns->type)
  3221. {
  3222. ASSERT(cnbl->cns->element.arc->r!=0);//perhaps if there are problem in reflex assert
  3223. px = cnbl->cns->element.arc->px * (cnbl->cns->element.arc->r/10);
  3224. vfindarcendpointo(cnbl->cns->element.arc,&p,&clockwise);
  3225. py.x = p->x*cnbl->cns->element.arc->r + cnbl->cns->element.arc->pc.x;
  3226. py.y = p->y*cnbl->cns->element.arc->r + cnbl->cns->element.arc->pc.y;
  3227. delete p;p=NULL;
  3228. }
  3229. else 
  3230. ASSERT(0);//not belong to line or arc
  3231. if(cnbl->cns->type == CAXLINE)cnbl->cns->reflex = 1;
  3232. if(CCW == cnbl->cns->clockwise*cnbl->cns->reflex)
  3233. {
  3234. vgainpointseg(&cns,&px);
  3235. }
  3236. else if(CW == cnbl->cns->clockwise*cnbl->cns->reflex)
  3237. {
  3238. vgainpointseg(&cns,&py);
  3239. }
  3240. cnblt = cnbl->cw;
  3241. tcnbl->cns = cns;
  3242. tcnbl->ccw = cnbl;
  3243. cnbl->cw = tcnbl;
  3244. tcnbl->cw = cnblt;
  3245. tcnbl->flag = 1;
  3246. return;
  3247. }
  3248. void vaddpointseglast(PVCNBL cnbl)
  3249. {
  3250. ASSERT(cnbl);ASSERT(cnbl->cns);ASSERT(1!=cnbl->flag);
  3251. XYZ px,py;
  3252. PXYZ p;
  3253. int clockwise;
  3254. PVCNS cns = NULL;
  3255. PVCNBL tcnbl = NULL,cnblt;
  3256. tcnbl = vmalloccnbl();
  3257. //
  3258. if(CAXLINE == cnbl->cns->type)
  3259. {
  3260. px=cnbl->cns->element.line->p0;
  3261. py=cnbl->cns->element.line->p1;
  3262. }
  3263. else if(CAXARC==cnbl->cns->type)
  3264. {
  3265. ASSERT(cnbl->cns->element.arc->r!=0);
  3266. px = cnbl->cns->element.arc->px * (cnbl->cns->element.arc->r/10);
  3267. vfindarcendpointo(cnbl->cns->element.arc,&p,&clockwise);
  3268. py.x = p->x*cnbl->cns->element.arc->r + cnbl->cns->element.arc->pc.x;
  3269. py.y = p->y*cnbl->cns->element.arc->r + cnbl->cns->element.arc->pc.y;
  3270. delete p;p=NULL;
  3271. }
  3272. else 
  3273. ASSERT(0);
  3274. if(cnbl->cns->reflex == CAXLINE)cnbl->cns->reflex = 1;
  3275. if(CCW == cnbl->cns->clockwise*cnbl->cns->reflex)
  3276. {
  3277. vgainpointseg(&cns,&py);
  3278. }
  3279. else if(CW==cnbl->cns->clockwise*cnbl->cns->reflex)
  3280. {
  3281. vgainpointseg(&cns,&px);
  3282. }
  3283. cnblt = cnbl->ccw;
  3284. tcnbl->cns = cns;
  3285. tcnbl->cw = cnbl;
  3286. cnbl->ccw = tcnbl;
  3287. tcnbl->ccw = cnblt;
  3288. tcnbl->flag = 1;
  3289. return;
  3290. }
  3291. //NOTES:I am sure that there are no zerolenght line,duplicity line or arc;
  3292. //在两边都加上平分线
  3293. void vgainsinglebisector(PVCNBL cnbl,PVBLI *obli)
  3294. {
  3295. ASSERT(cnbl);
  3296. PVBLI blis=NULL,blie=NULL,blit = NULL;//blis mean start bli,blie mean end bli
  3297. PVBNI bni=NULL,bnit=NULL;
  3298. PVCNS cns=NULL,cnst=NULL,cnse = NULL;
  3299. PVBNS bns=NULL;
  3300. XYZ  px,py;
  3301. PXYZ p;
  3302. int clockwise;
  3303. //
  3304. cns = cnbl->cns;
  3305. //
  3306. if(CAXLINE == cns->type)
  3307. {
  3308. px = cns->element.line->p0;
  3309. //
  3310. vgainpointseg(&cnst,&px); ASSERT(cnst);
  3311. vgainbisectorlc(cns,cnst,&bns); ASSERT(bns);
  3312. bns->t1 = 0;
  3313. blis = vmallocbli();
  3314. blis->bni = vmallocbni();
  3315. blis->bni->selfcns = cnbl->cns;
  3316. blis->bni->bns = bns;
  3317. //
  3318. bns = NULL;cnst = NULL;
  3319. px = cns->element.line->p1;
  3320. vgainpointseg(&cnst,&px); ASSERT(cnst);
  3321. vgainbisectorlc(cns,cnst,&bns); ASSERT(bns);
  3322. bns->t1 = 0;
  3323. blie = vmallocbli();
  3324. blie->bni = vmallocbni();
  3325. blie->bni->selfcns = cnbl->cns;
  3326. blie->bni->bns = bns;
  3327. //
  3328. bns=NULL;cnst=NULL;
  3329. if(CCW == cns->clockwise)
  3330. {
  3331. *obli = blie;
  3332. blie->clockwise = CCW;
  3333. blis->clockwise = CW;
  3334. blie->next = blis;
  3335. blis->last = blie;
  3336. }
  3337. else if(CW == cns->clockwise)
  3338. {
  3339. *obli = blis;
  3340. blis->clockwise = CCW;
  3341. blie->clockwise = CW;
  3342. blis->next = blie;
  3343. blie->last = blis;
  3344. }
  3345. }
  3346. else if(CAXARC == cns->type)
  3347. {
  3348. if(fabs(cns->element.arc->r)>ZERO)
  3349. {
  3350. px = (cns->element.arc->px - cns->element.arc->pc)*(cns->element.arc->r/10)
  3351.  + cns->element.arc->pc ;
  3352. vfindarcendpointo(cns->element.arc,&p,&clockwise);
  3353. py.x = p->x * cns->element.arc->r + cns->element.arc->pc.x;
  3354. py.y = p->y * cns->element.arc->r + cns->element.arc->pc.y;
  3355. delete p;p=NULL;
  3356. //
  3357. vgainpointseg(&cnst,&px);ASSERT(cnst);
  3358. vgainbisectorcc(cnst,cns,&bns);ASSERT(bns);
  3359. bns->t1 = 0;
  3360. blis = vmallocbli();
  3361. blis->bni = vmallocbni();
  3362. blis->bni->selfcns = cnbl->cns;
  3363. blis->bni->bns = bns;
  3364. bns = NULL;cnst = NULL;
  3365. //
  3366. vgainpointseg(&cnse,&py);ASSERT(cnse);
  3367. vgainbisectorcc(cnse,cns,&bns);ASSERT(bns);
  3368. bns->t1 = 0;
  3369. //
  3370. blie=vmallocbli();
  3371. blie->bni=vmallocbni();
  3372. blie->bni->selfcns = cnbl->cns;//I think this number will be deleted
  3373. blie->bni->bns = bns;
  3374. bns = NULL;cnst = NULL;
  3375. //
  3376. if(cns->clockwise == CW){
  3377. blie->bni->bns->t2 = cns->element.arc->r;
  3378. blis->bni->bns->t2 = cns->element.arc->r;
  3379. }
  3380. if(CCW == cns->clockwise*cns->reflex)
  3381. {
  3382. *obli = blie;
  3383. blie->clockwise = CCW;
  3384. blis->clockwise = CW;
  3385. blie->next = blis;
  3386. blis->last = blie;
  3387. }
  3388. else if(CW == cns->clockwise*cns->reflex)
  3389. {
  3390. *obli = blis;
  3391. blis->clockwise = CCW;
  3392. blie->clockwise = CW;
  3393. blis->next = blie;
  3394. blie->last = blis;
  3395. }
  3396. }
  3397. }
  3398. return;
  3399. }
  3400. ///////////////////////////////////////
  3401. ///////////////////////////////////////
  3402. //得到单树枝,即只有一个树叶的树枝,对其树叶进行赋bisector
  3403. //没有任何角平分线信息,头尾也没有新加节点
  3404. //function
  3405. //加上头尾节点,加上角平分线连,加上角平分线对应关系
  3406. /////////////////////////////
  3407. void vgainsingleplfbli(PVPLF plf)
  3408. {
  3409. ASSERT(plf);
  3410. PVBLI  bli = NULL,tbli = NULL;
  3411. PVCNBL tcnbl = NULL;
  3412. PVCNBL cnbls = NULL,cnble = NULL;
  3413. //是单节点树叶 it's impossible to have zero segment
  3414. if(SINGLEPLF == plf->type)
  3415. vgainsinglebisector(plf->scnbl,&bli);//得到节点的bisector连
  3416. plf->scnbl->bli=bli;
  3417. vaddpointsegpre(plf->scnbl);//在前加上点节点note 没有bli的信息
  3418. vaddpointseglast(plf->ecnbl);//在后加上点节
  3419. //
  3420. cnbls = plf->scnbl->cw;
  3421. cnble = plf->ecnbl->ccw;
  3422. //
  3423. tbli = bli;
  3424. while(tbli->next)
  3425. {
  3426. tbli=tbli->next;
  3427. }
  3428. //
  3429. cnbls->bli=vmallocbli();
  3430. cnbls->bli->bni = vmallocbni();
  3431. cnble->bli = vmallocbli();
  3432. cnble->bli->bni = vmallocbni();
  3433. //
  3434. cnbls->bli->bni->bns  = tbli->bni->bns;
  3435. cnbls->bli->clockwise =-tbli->clockwise;//?
  3436. cnble->bli->bni->bns  = bli->bni->bns;
  3437. cnble->bli->clockwise = -bli->clockwise;//?
  3438. //
  3439. cnbls->bli->bni->othercns = cnbls->ccw->cns;
  3440. cnble->bli->bni->othercns = cnble->cw->cns;
  3441. plf->ecnbl->bli->bni->othercns = cnble->cns;
  3442. plf->ecnbl->bli->next->bni->othercns = cnbls->cns;
  3443. //
  3444. plf->scnbl=cnbls;
  3445. plf->ecnbl=cnble;
  3446. //
  3447. return;
  3448. }//多节点 have the oppotunity to be an point segment
  3449. plf->type = MULIPLF;
  3450. //
  3451. tcnbl = plf->scnbl;
  3452. vaddpointsegpre(tcnbl);
  3453. tcnbl->cw->bli = vmallocbli();
  3454. tcnbl->cw->bli->bni = vmallocbni();
  3455. //
  3456. do
  3457. {
  3458. if(tcnbl->cns->type==CAXARC&&fabs(tcnbl->cns->element.arc->r)<=ZERO)//是点
  3459. {
  3460. tcnbl->bli = vmallocbli();
  3461. tcnbl->bli->bni = vmallocbni(); 
  3462. tcnbl->bli->next = vmallocbli();
  3463. tcnbl->bli->next->bni = vmallocbni();
  3464. tcnbl->bli->next->last = tcnbl->bli;
  3465. //
  3466. tcnbl->bli->next->bni->othercns = tcnbl->cw->cns;
  3467. tcnbl->cw->bli->bni->othercns = tcnbl->cns;
  3468. //
  3469. tcnbl->bli->next->bni->bns = tcnbl->cw->bli->bni->bns;
  3470. tcnbl->bli->next->clockwise = -tcnbl->cw->bli->clockwise;
  3471. tcnbl = tcnbl->ccw;
  3472. }
  3473. else
  3474. {
  3475. vgainsinglebisector(tcnbl,&bli);
  3476. ASSERT(bli);
  3477. tcnbl->bli = bli;
  3478. //
  3479. tcnbl->cw->bli->bni->othercns = tcnbl->cns;
  3480. tcnbl->bli->next->bni->othercns = tcnbl->cw->cns;
  3481. //
  3482. tcnbl->cw->bli->bni->bns = bli->next->bni->bns;
  3483. tcnbl->cw->bli->clockwise = -bli->next->clockwise;
  3484. tcnbl = tcnbl->ccw;
  3485. }
  3486. tcnbl->bli=bli;
  3487. bli=NULL;
  3488. }while(tcnbl != plf->ecnbl);
  3489. //
  3490. vgainsinglebisector(tcnbl,&bli);
  3491. ASSERT(bli);
  3492. tcnbl->bli = bli;
  3493. //
  3494. tcnbl->cw->bli->bni->bns = bli->next->bni->bns;
  3495. tcnbl->cw->bli->clockwise = -bli->next->clockwise;
  3496. //
  3497. tcnbl->cw->bli->bni->othercns = tcnbl->cns;
  3498. tcnbl->bli->next->bni->othercns = tcnbl->cw->cns;
  3499. //给最后的一个节点进行赋值
  3500. vaddpointseglast(tcnbl);
  3501. tcnbl = tcnbl->ccw;
  3502. tcnbl->bli = vmallocbli();
  3503. tcnbl->bli->bni = vmallocbni();
  3504. //
  3505. tcnbl->bli->bni->bns = tcnbl->cw->bli->bni->bns;
  3506. tcnbl->bli->clockwise = -tcnbl->cw->bli->clockwise;
  3507. tcnbl->bli->bni->othercns = tcnbl->cw->cns;
  3508. //
  3509. tcnbl->cw->bli->bni->othercns = tcnbl->cns;
  3510. //
  3511. plf->scnbl=plf->scnbl->cw;
  3512. plf->ecnbl=plf->ecnbl->ccw;
  3513. //
  3514. return;
  3515. }
  3516. //把一个树枝分成两个近似相等的树枝
  3517. //ok
  3518. void vdivideprofiletwo(PVPL vpl,PVPL *pl,PVPL *pr)
  3519. {
  3520. ASSERT(vpl);ASSERT(vpl->ptype!=SINGLE);
  3521. ASSERT(vpl->splf);
  3522. PVPL kpl=NULL;
  3523. int sum=1;
  3524. PVPLF plf=NULL;
  3525. plf = vpl->splf;
  3526. while(plf != vpl->eplf)
  3527. {
  3528. sum++;
  3529. plf=plf->ccw;
  3530. }
  3531. plf = vpl->splf;
  3532. if(sum==2)
  3533. {
  3534. kpl=new VPL;ASSERT(kpl);
  3535. kpl->eplf = kpl->splf = vpl->eplf;
  3536. kpl->ptype=SINGLE;
  3537. *pl=kpl;
  3538. kpl=NULL;
  3539. kpl=new VPL;ASSERT(kpl);
  3540. kpl->eplf = kpl->splf = vpl->splf;
  3541. kpl->ptype=SINGLE;
  3542. *pr=kpl;
  3543. kpl=NULL;
  3544. }
  3545. else if(sum==3)
  3546. {
  3547. kpl = new VPL;ASSERT(kpl);
  3548. kpl->splf = vpl->eplf->cw;
  3549. kpl->eplf = vpl->eplf;
  3550. kpl->ptype = MULIPLF;
  3551. *pl = kpl;
  3552. kpl = NULL;
  3553. kpl = new VPL;ASSERT(kpl);
  3554. kpl->eplf = kpl->splf = vpl->splf;
  3555. kpl->ptype = SINGLE;
  3556. *pr = kpl;
  3557. kpl = NULL;
  3558. }
  3559. else if(sum>3)
  3560. {
  3561. sum = sum/2;
  3562. for(int i=1;i<sum;i++)
  3563. plf = plf->ccw;
  3564. kpl = new VPL;ASSERT(kpl);
  3565. kpl->splf = plf->ccw;
  3566. kpl->eplf = vpl->eplf;
  3567. kpl->ptype = MULIPLF;
  3568. *pl = kpl;
  3569. kpl = NULL;
  3570. kpl = new VPL; ASSERT(kpl);
  3571. kpl->splf = vpl->splf;
  3572. kpl->eplf = plf;
  3573. kpl->ptype = MULIPLF;
  3574. *pr=kpl;
  3575. kpl=NULL;
  3576. }
  3577. delete vpl;   //?
  3578. vpl=NULL;
  3579. return;
  3580. }
  3581. ///////////////////////////////////////////////////////////////////////////
  3582. ///merge
  3583. ///////////////////////////////////////////////////////////////////////////
  3584. //find whether the t is in the limitation of bns 
  3585. //rcnbl=vfindcnblr(blir->bni->othercns,rcnbl)
  3586. //找到blil的另一部分cns对应的cnbl节点
  3587. PVCNBL vfindcnblr(PVCNS cns,PVCNBL rcnbl)
  3588. {
  3589. PVCNBL cnbl;
  3590. cnbl = rcnbl;
  3591. while(cnbl->cns != cns)
  3592. cnbl = cnbl->cw;
  3593. return cnbl;
  3594. }
  3595. //找到blil的另一部分cns对应的cnbl节点
  3596. PVCNBL vfindcnbll(PVCNS cns,PVCNBL lcnbl)
  3597. {
  3598. PVCNBL cnbl;
  3599. cnbl=lcnbl;
  3600. while(cnbl->cns != cns)
  3601. cnbl=cnbl->ccw;
  3602. return cnbl;
  3603. }
  3604. ////.............................................
  3605. //判断t,m 是否在bns中 
  3606. //return 0,mean t is not in bns
  3607. //return 1,mean only in the end point of bns
  3608. //return 2,mean in the middle of bns
  3609. int vjudgetheinbns(PVBNS bns,double t,int m)
  3610. {
  3611. ASSERT(bns);//ASSERT(bns->t1<=bns->t2);
  3612. double tm1,tm2,tm;
  3613. double tt;
  3614. //
  3615. tm = t * m;
  3616. tm1 = bns->t1 * bns->m1;
  3617. tm2 = bns->t2 * bns->m2;
  3618. if((t - bns->tmin)<-ZERO)// t不能小于tmin>=0
  3619. {
  3620. return 0;
  3621. }
  3622. else if(fabs(t-bns->tmin)<ZERO)
  3623. {
  3624. return 1;
  3625. }
  3626. //arrange ,are the bns arrange before?
  3627. //if be arranged bellow can be deleted safely
  3628. if(fabs(tm1-tm2)<=ZERO){ASSERT(0);return 0;}//点角平分线处理
  3629. else if(tm1-tm2>ZERO)
  3630. {
  3631. tt=tm1;
  3632. tm1=tm2;
  3633. tm2=tt;
  3634. }
  3635. //
  3636. /* if(INFINITY == bns->infinite) //下面是两个未arrange的算法
  3637. {
  3638. if(bns->t1 == UPER&&bns->t2 == UPER)
  3639. return 2;
  3640. else if(bns->t1 != UPER)
  3641. {
  3642. if(fabs(tm1-tm)<=ZERO)
  3643. return 1;
  3644. else if(tm-tm1>ZERO)
  3645. return 2;
  3646. else return 0;
  3647. }
  3648. else// bns->t2!=UPPER 
  3649. {
  3650. if(fabs(tm2-tm)<=ZERO)
  3651. return 1;
  3652. else if(tm2-tm>ZERO)
  3653. return 2;
  3654. else return 0;
  3655. }
  3656. }
  3657. else//neither bns->t1 nor bns->t2 ==uper  
  3658. */ {
  3659. if(fabs(tm - tm1)<=ZERO||fabs(tm-tm2)<=ZERO)return 1;
  3660. else if(tm-tm1>ZERO&&tm-tm2<-ZERO)
  3661. return 2;
  3662. else return 0;
  3663. }
  3664. }
  3665. //
  3666. PVBLI vfindimlimitedbli(PVBLI bli,int flag)
  3667. {
  3668. PVBLI blit=NULL;
  3669. int m;
  3670. if(flag ==2)//meet with right
  3671. {
  3672.     blit = bli;
  3673. while(blit->next)
  3674. {
  3675. blit = blit->next;
  3676. }
  3677. }
  3678. else if(flag == 1)//meet with left
  3679. {
  3680. blit = bli;
  3681. while(blit->last)
  3682. {
  3683. blit = blit->last;
  3684. }
  3685. }
  3686. while(blit)
  3687. {
  3688. if((blit->clockwise==CCW && flag == 1)||(blit->clockwise==CW && flag==2))
  3689. {
  3690. if(blit->bni->bns->t2 == UPER)
  3691. break;
  3692. }
  3693. else if((blit->clockwise==CW && flag==1)||(blit->clockwise==CCW && flag==2))
  3694. {
  3695. if(blit->bni->bns->t1 ==UPER)
  3696. break;
  3697. }
  3698. if(flag == 2)
  3699. blit = blit->last;
  3700. else if(flag == 1)
  3701. blit = blit->next;
  3702. }
  3703. if(blit)
  3704. return blit;
  3705. else
  3706. ASSERT(0);
  3707. return NULL;
  3708. }
  3709. //for unexpected dealing with
  3710. //make sure that pbl>=0,rcnblin!=NULL,and so on and the blistart is the first bli needed
  3711. void vregendercnblunexpectedl(PVCNBL *lcnblin,PVCNBL rcnbl,PVBLI blistart,PVBLI bliend,
  3712. PVBLI pbufl[],int pbl,PVBLI *bliout)
  3713. {
  3714. PVCNBL lcnbl = *lcnblin;
  3715. PVBLI  blia  = NULL;
  3716. int i;
  3717. if(lcnbl->flag == 1)
  3718. {
  3719. if(pbl == 0)
  3720. {
  3721. pbufl[0]->clockwise = -pbufl[0]->clockwise;
  3722. lcnbl->bli = pbufl[0];
  3723. pbufl[0]->next = blistart;
  3724. if(blistart)
  3725. {
  3726. blistart->last = pbufl[0];
  3727. }
  3728. else{
  3729. ASSERT(0);
  3730. }
  3731. return ;
  3732. }
  3733. for( i = pbl; i>=0; i--)
  3734. {
  3735. pbufl[i]->clockwise *=-1;
  3736. if(i==pbl)
  3737. {
  3738. lcnbl->bli = pbufl[i];
  3739. }
  3740. else if (i==0)
  3741. {
  3742. pbufl[i]->last = pbufl[i+1];
  3743. pbufl[i+1]->next = pbufl[i];
  3744. //
  3745. pbufl[i]->next = blistart;
  3746. if(blistart != NULL)
  3747. {
  3748. blistart->last = pbufl[i];
  3749. }
  3750. }
  3751. else
  3752. {
  3753. pbufl[i]->last = pbufl[i+1];
  3754. pbufl[i+1]->next = pbufl[i];
  3755. }
  3756. }
  3757. return;
  3758. }
  3759. else
  3760. {
  3761. //above is the finding of the first/(last in sequential meaning) bli
  3762. blia = vfindimlimitedbli(blistart,1);
  3763. if(pbl == 0)
  3764. {
  3765. pbufl[0]->next = blistart;
  3766. pbufl[0]->clockwise *=-1;//it is so important that it safe to never touch it
  3767. if(blistart){
  3768. blistart->last = pbufl[0];
  3769. }
  3770. else ASSERT(0);
  3771. if(blia)
  3772. {
  3773. pbufl[0]->last = blia;
  3774. blia->next = pbufl[0];
  3775. }
  3776. else
  3777. {
  3778. lcnbl->bli = pbufl[0];
  3779. }
  3780. }
  3781. else{//为伊消得人憔悴
  3782. for(i=0;i<=pbl;i++)
  3783. {
  3784. pbufl[i]->clockwise *=-1;
  3785. if(i == 0)
  3786. {
  3787. pbufl[i] ->next = blistart;
  3788. if(blistart){
  3789. blistart->last = pbufl[i];
  3790. }
  3791. else ASSERT(0);
  3792. }
  3793. else if(i == pbl)
  3794. {
  3795. pbufl[i]->next = pbufl[i-1];//与前面取得联系
  3796. pbufl[i-1]->last = pbufl[i];
  3797. if(blia)
  3798. {
  3799. pbufl[i]->last = blia;
  3800. blia->next = pbufl[i];
  3801. }
  3802. else
  3803. {
  3804. lcnbl->bli = pbufl[i];
  3805. }
  3806. }
  3807. else 
  3808. {
  3809. pbufl[i]->next = pbufl[i-1];
  3810. pbufl[i-1]->last = pbufl[i];
  3811. }
  3812. }
  3813. }
  3814. }
  3815. return ;
  3816. }
  3817. //for the unexpected dealing with the merge processing 
  3818. void vregendercnblunexpectedr(PVCNBL *rcnblin,PVCNBL lcnbl,PVBLI blistart,PVBLI bliend,
  3819. PVBLI pbufr[],int pbr,PVBLI *bliout)
  3820. {
  3821. PVCNBL rcnbl = *rcnblin;
  3822. PVBLI  blia  = NULL;
  3823. int i ;
  3824. if(rcnbl->flag == 1)
  3825. {
  3826. if(pbr == 0)
  3827. {
  3828. if(blistart == NULL)
  3829. {
  3830. rcnbl->bli = pbufr[0];
  3831. ASSERT(0);
  3832. }
  3833. else
  3834. {
  3835. pbufr[0]->last = blistart;
  3836. blistart->next = pbufr[0];
  3837. }
  3838. }
  3839. for(i = 0;i<= pbr;i++)
  3840. {
  3841. if(i == 0)
  3842. {
  3843. if(blistart == NULL)
  3844. {
  3845. rcnbl->bli = pbufr[i];
  3846. ASSERT(0);
  3847. }
  3848. else
  3849. {
  3850. pbufr[i]->last = blistart;
  3851. blistart->next = pbufr[i];
  3852. }
  3853. }
  3854. else if (i == pbr)
  3855. {
  3856. pbufr[i]->last = pbufr[i-1];//
  3857. pbufr[i-1]->next = pbufr[i];//
  3858. }
  3859. else 
  3860. {
  3861. pbufr[i]->last = pbufr[i-1];
  3862. pbufr[i-1]->next = pbufr[i];
  3863. }
  3864. }//return;
  3865. }
  3866. else
  3867. {
  3868. //above is the finding of the first/(last in sequential meaning) bli
  3869. blia = vfindimlimitedbli(blistart,2);
  3870. if(pbr == 0)
  3871. {
  3872. if(blistart == NULL)
  3873. {
  3874. rcnbl->bli = pbufr[0];
  3875. if(!blia){
  3876. pbufr[0]->next = blistart->next; 
  3877. ASSERT(0);
  3878. blistart->next->last = pbufr[0];
  3879. }//it never happens,if so it must be rewrited
  3880. ASSERT(0);
  3881. return;
  3882. }
  3883. else
  3884. {
  3885. pbufr[0]->last = blistart;//have been fixed 6-15p.m. 
  3886. blistart->next = pbufr[0];
  3887. pbufr[0]->next = blia;
  3888. blia->last = pbufr[0];
  3889. }
  3890. }
  3891. else{
  3892. for( i = 0; i<=pbr; i++)
  3893. {
  3894. if(i == 0)
  3895. {
  3896. if(blistart == NULL)
  3897. {
  3898. rcnbl->bli = pbufr[i];
  3899. ASSERT(0);//it never happens(?)6-15PM
  3900. }
  3901. else
  3902. {
  3903. blistart->next = pbufr[i];
  3904. pbufr[i]->last = blistart;
  3905. }
  3906. }
  3907. else if(i == pbr)
  3908. {
  3909. pbufr[i]->last = pbufr[i-1];
  3910. pbufr[i-1]->next = pbufr[i];//
  3911. if(blia)
  3912. {
  3913. pbufr[i]->next = blia;
  3914. blia->last = pbufr[i];
  3915. }
  3916. }
  3917. else 
  3918. {
  3919. pbufr[i]->last = pbufr[i-1];
  3920. pbufr[i-1]->next = pbufr[i];
  3921. }
  3922. }
  3923. }
  3924. }
  3925. return ;
  3926. }
  3927. //找到最近的一个交点,t/大小,blit/所处角平分线连的位子,lrflag/交于那边;
  3928. //bns input tfirst,mfirst,and out put tend and mend,
  3929. //startflag input the start place of 
  3930. //bisector,blil,blir out put... ,irflag out put....
  3931. //blil input the first lcnbl bli ,the blir input the first rcnbl
  3932. //blil and blif output the bli have been update according to the startflag
  3933. //lrflag out put the first intersect bli of cnbls.
  3934. //lrflag = 1 intersect first with lcnbl blil be regenerated
  3935. //lrflag = 2 rcnbl be regenerated
  3936. //lrflag = 0 all blir and blil be regenerated;
  3937. //lrflag = -1 no firstpoint been found;  
  3938. void vfindfirstpoint(PVCNBL rcnbl,PVCNBL lcnbl,PVBNS bns,int startflag,int directionflag,//input//startflag useless
  3939.  PVBLI *blil,PVBLI *blir,int *lrflag)//output
  3940.  // bli
  3941. {
  3942. ASSERT(rcnbl);ASSERT(lcnbl);
  3943. ASSERT(rcnbl->bli);ASSERT(lcnbl->bli);
  3944. //all are template useing parameters
  3945. double tl,tr,tfirst;
  3946. int    ml,mr,flagl,flagr;
  3947. int    mfirst;
  3948. double tmfirst,tml,tmr;
  3949. //
  3950. PVBLI blitl,blitr;
  3951. //
  3952. tfirst = bns->t1;
  3953. //I think this is the wrong statement
  3954. mfirst  = bns->m1;//bns have been the bisector of the validate bisector of lcnbl and rcnbl
  3955. tmfirst = tfirst * mfirst; 
  3956. //
  3957. if(rcnbl->flag==0 && lcnbl->flag==0)
  3958. {
  3959. //this function are writed
  3960. flagl = vgainintersectortl(lcnbl,rcnbl->cns,bns,startflag,directionflag,*blil,&tl,&ml,&blitl);//函数体中得保证有解(唯一)
  3961. flagr = vgainintersectortr(rcnbl,lcnbl->cns,bns,startflag,directionflag,*blir,&tr,&mr,&blitr);//函数体中得保证有解
  3962. if(0==flagl&&0==flagr)
  3963. {
  3964. *lrflag = -1;
  3965. return ;
  3966. }
  3967. else if (0==flagl&&flagr)
  3968. {
  3969. *blir = blitr;
  3970. bns->t2 = tr;
  3971. bns->m2 = mr;
  3972. *lrflag = 2;
  3973. return ;
  3974. }
  3975. else if (flagl && 0==flagr)
  3976. {
  3977. *blil = blitl;
  3978. bns->t2 = tl;
  3979. bns->m2 = ml;
  3980. *lrflag = 1;
  3981. return ;
  3982. }
  3983. tml = tl*ml; tmr = tr*mr;
  3984. if(fabs(tmfirst-tml)<ZERO||fabs(tmfirst-tmr)<ZERO)
  3985. {
  3986. ASSERT(0);//
  3987. }
  3988. else if(tmfirst-tml>ZERO && tmfirst-tmr>ZERO)
  3989. {
  3990. if(fabs(tmr-tml)<=ZERO)
  3991. {
  3992. bns->t2 = tl;
  3993. bns->m2 = ml;
  3994. *blil = blitl;
  3995. *blir = blitr;
  3996. *lrflag = 0;
  3997. }
  3998. else if(tmr-tml>ZERO)
  3999. {
  4000. bns->t2 = tr;
  4001. bns->m2 = mr;
  4002. *blir = blitr;
  4003. *lrflag = 2;
  4004. }
  4005. else
  4006. {
  4007. bns->t2 = tl;
  4008. bns->m2 = ml;
  4009. *blil = blitl;
  4010. *lrflag = 1;
  4011. }
  4012. }
  4013. else if(tmfirst-tml<-ZERO && tmfirst-tmr<-ZERO)
  4014. {
  4015. if(fabs(tmr-tml)<=ZERO)
  4016. {
  4017. bns->t2 = tl;
  4018. bns->m2 = ml;
  4019. *blil = blitl;
  4020. *blir = blitr;
  4021. *lrflag = 0;
  4022. }
  4023. else if(tmr-tml>ZERO)
  4024. {
  4025. bns->t2 = tl;
  4026. bns->m2 = ml;
  4027. *blil = blitl;
  4028. *lrflag = 1;
  4029. }
  4030. else
  4031. {
  4032. bns->t2 = tr;
  4033. bns->m2 = mr;
  4034. *blir = blitr;
  4035. *lrflag = 2;
  4036. }
  4037. }
  4038. else if((tmfirst-tml)*(tmfirst-tmr)<-ZERO)
  4039. {
  4040. if((tmfirst>=0 && tml>=0 )||( tmfirst<0 && tml<0 ))
  4041. {
  4042. bns->t2 = tl;
  4043. bns->m2 = ml;
  4044. *blil = blitl;
  4045. *lrflag = 1;
  4046. }
  4047. else if((tmfirst>=0 && tmr>=0 )||( tmfirst<0 && tmr<0 ))
  4048. {
  4049. bns->t2 = tr;
  4050. bns->m2 = mr;
  4051. *blir = blitr;
  4052. *lrflag =2;
  4053. }
  4054. else
  4055. ASSERT(0);//tfirst 在两者之间
  4056. }
  4057. }
  4058. else if(lcnbl->flag==1 && rcnbl->flag==0)
  4059. {
  4060. //如果flag==0应该有解
  4061. flagl = vgainintersectortr(rcnbl,lcnbl->cns,bns,startflag,directionflag,*blir,&tr,&mr,&blitr);//函数体中得保证有解
  4062. if(flagl == 0)
  4063. {
  4064. //AfxMessageBox("bisector meet with nothing ");
  4065. *lrflag = -1;
  4066. return;
  4067. }
  4068. tmr = tr*mr;
  4069. if(fabs(tmfirst-tmr)<ZERO)
  4070. ASSERT(0);
  4071. bns->t2 = tr;
  4072. bns->m2 = mr;
  4073. *blir = blitr;
  4074. *lrflag = 2;
  4075. }
  4076. else if(lcnbl->flag==0 && rcnbl->flag==1)
  4077. {//why I put the blil into blir
  4078. flagr = vgainintersectortl(lcnbl,rcnbl->cns,bns,startflag,directionflag,*blil,&tl,&ml,&blitl);//函数体中得保证有解
  4079. if(flagr == 0)
  4080. {
  4081. //AfxMessageBox("bisector meet with nothing");
  4082. *lrflag = -1;
  4083. return ;
  4084. }
  4085. tml = tl*ml;
  4086. if(fabs(tmfirst-tml)<ZERO)
  4087. ASSERT(0);
  4088. bns->t2 = tl;
  4089. bns->m2 = ml;
  4090. *blil = blitl;
  4091. *lrflag = 1;
  4092. }
  4093. else 
  4094. {
  4095. ASSERT(0);
  4096. }
  4097. }
  4098. //删除lcnbl中的角平分线,加入栈中的角平分线
  4099. //lcnbl is the main process-needed objector,blistart&bliend is the limitation of voronoi 
  4100. //diagram .pbufl[]and it mark pbl is the collection of all the bisector information need
  4101. //be inputed into lcnbl voronoi diagram;
  4102. //and we are sure that all bisectors have limitations.
  4103. void vregendercnbll(PVCNBL *lcnblin,PVCNBL rcnbl,PVBLI blistart,PVBLI bliend,
  4104. PVBLI pbufl[],int pbl,PVBLI *bliout)
  4105. {
  4106. if(pbl <= -1)//if no bli appears
  4107. {
  4108. if(blistart->bni->flag)
  4109. blistart->bni->flag = 0;
  4110. return ;
  4111. }
  4112. //
  4113. ASSERT(*lcnblin);ASSERT(blistart);ASSERT(bliend);ASSERT(rcnbl);
  4114. PVBLI  bli,blit,blia,blis,blie;
  4115. double tm,tm1,tm2;
  4116. double  t1,t2;
  4117. int  mvalue;
  4118. int i,flag1 = 0;
  4119. PVCNBL  lcnbl = *lcnblin ;
  4120. //gain blis;
  4121. if(pbufl[0]->clockwise == CW)
  4122. {
  4123. vgainintersectmvaluebns(blistart->bni->bns,
  4124. pbufl[0]->bni->bns,pbufl[0]->bni->bns->t2,&mvalue);
  4125. t1 = pbufl[0]->bni->bns->t2;
  4126. }
  4127. else
  4128. {
  4129. vgainintersectmvaluebns(blistart->bni->bns,
  4130. pbufl[0]->bni->bns,pbufl[0]->bni->bns->t1,&mvalue);
  4131. t1 = pbufl[0]->bni->bns->t1;
  4132. }
  4133. tm = t1 * mvalue;
  4134. tm1 = blistart->bni->bns->t1 * blistart->bni->bns->m1;
  4135. tm2 = blistart->bni->bns->t2 * blistart->bni->bns->m2;
  4136. //merge terminited,means the lcnbl and rcnbl meet in the place of t=0
  4137. //删去bisector
  4138. if(rcnbl->flag == 1 && lcnbl->flag == 1 && pbufl[pbl]->bni->bns->t2!=0)
  4139. {//make all bli out of in the buf  
  4140. if(pbl == 0)
  4141. {
  4142. pbufl[0]->clockwise *=-1;//I add it 6-15
  4143. lcnbl->bli = pbufl[0];
  4144. pbufl[0]->next = blistart;
  4145. if(blistart)
  4146. blistart->last = pbufl[0];
  4147. else ASSERT(0);
  4148. return;
  4149. }
  4150. for(i = pbl;i>=0;i--)
  4151. {
  4152. pbufl[i]->clockwise *=-1;//I add it 6-15 it cause me a lot of time
  4153. if(i == pbl)
  4154. {
  4155. lcnbl->bli = pbufl[i];
  4156. }
  4157. else if(i == 0)
  4158. {
  4159. pbufl[i]->last = pbufl[i+1];
  4160. pbufl[i+1]->next = pbufl[i];
  4161. pbufl[i]->next = blistart;
  4162. if(blistart)
  4163. blistart->last = pbufl[i];
  4164. else ASSERT(0);
  4165. }
  4166. else
  4167. {
  4168. pbufl[i]->last = pbufl[i+1];
  4169. pbufl[i+1]->next = pbufl[i];
  4170. }
  4171. }
  4172. return ;
  4173. }
  4174. //
  4175. if(rcnbl->flag == 1&&lcnbl->flag == 1 && pbufl[pbl]->bni->bns->t2!=0)
  4176. {
  4177. ASSERT(0);
  4178. }
  4179. if((CCW == blistart->clockwise && fabs(tm-tm2)<=ZERO) ||
  4180. (CW == blistart->clockwise && fabs(tm-tm1)<=ZERO))
  4181. {
  4182. blis = blistart;
  4183. }
  4184. else if((CCW == blistart->clockwise && fabs(tm-tm1)<=ZERO) ||
  4185. (CW == blistart->clockwise && fabs(tm-tm2)<=ZERO))
  4186. {
  4187. blis = blistart->last;
  4188. }
  4189. else if(tm-tm1>ZERO&&tm-tm2<-ZERO||(tm-tm2>ZERO&&tm-tm1<-ZERO))
  4190. {
  4191. blis = blistart->last;
  4192. if(blistart->clockwise == CCW)//modify the original
  4193. {
  4194. blistart->bni->bns->t1 = t1;
  4195. blistart->bni->bns->m1 = mvalue;
  4196. }
  4197. else
  4198. {
  4199. blistart->bni->bns->t2 = t1;
  4200. blistart->bni->bns->m2 = mvalue;
  4201. }
  4202. }
  4203. else ASSERT(0);
  4204. //when the bisector have meet nothing but it isn't wrong so have to be delt with
  4205. if(blistart->bni->flag)
  4206. {
  4207. if(blistart == blis)
  4208. {
  4209. blia = blistart->next;
  4210. }
  4211. else
  4212. {
  4213. blia = blistart;
  4214. }
  4215. vregendercnblunexpectedl(lcnblin,rcnbl,blia,bliend,pbufl,pbl,bliout);
  4216. /////
  4217. blistart->bni->flag = 0;
  4218. return;
  4219. }
  4220. //gain blie
  4221. if(pbufl[pbl]->clockwise ==CW)
  4222. {
  4223. t2 = pbufl[pbl]->bni->bns->t1;
  4224. vgainintersectmvaluebns(bliend->bni->bns,
  4225. pbufl[pbl]->bni->bns,pbufl[pbl]->bni->bns->t1,&mvalue);
  4226. }
  4227. else
  4228. {
  4229. t2 = pbufl[pbl]->bni->bns->t2;
  4230. vgainintersectmvaluebns(bliend->bni->bns,
  4231. pbufl[pbl]->bni->bns,pbufl[pbl]->bni->bns->t2,&mvalue);
  4232. }
  4233. tm = t2 * mvalue;
  4234. tm1 = bliend->bni->bns->t1 * bliend->bni->bns->m1;
  4235. tm2 = bliend->bni->bns->t2 * bliend->bni->bns->m2;
  4236. if((CCW == bliend->clockwise && fabs(tm-tm1) <= ZERO) ||
  4237. (CW == bliend->clockwise && fabs(tm-tm2) <= ZERO))
  4238. {
  4239. blie = bliend;
  4240. flag1 = 1;
  4241. }
  4242. else if((CCW == bliend->clockwise && fabs(tm-tm2)<=ZERO) ||
  4243. (CW == bliend->clockwise && fabs(tm-tm1)<=ZERO))
  4244. {
  4245. blie = bliend->next;
  4246. }
  4247. else if(tm-tm1>ZERO && tm-tm2<-ZERO || (tm-tm2>ZERO && tm-tm1<-ZERO))
  4248. {
  4249. blie = bliend->next;
  4250. if(bliend->clockwise == CCW)
  4251. {
  4252. bliend->bni->bns->t2 = t2;
  4253. bliend->bni->bns->m2 = mvalue;
  4254. }
  4255. else
  4256. {
  4257. bliend->bni->bns->t1 = t2;
  4258. bliend->bni->bns->m1 = mvalue;
  4259. }
  4260. }
  4261. else ASSERT(0);
  4262. //添上bisector from blifirst to bliend
  4263. bli = NULL;
  4264. for(i=0;i<=pbl;i++)
  4265. {
  4266. bli = pbufl[i];
  4267. bli->clockwise = -bli->clockwise;
  4268. //assign clockwise
  4269. //assign link info  ??
  4270. if(pbl == 0)//if there is only one besector in the voronoi diagram
  4271. {
  4272. if(blistart == blis)
  4273. {
  4274. if(blistart->next != NULL)
  4275. {
  4276. bli->next = blistart->next;
  4277. blistart->next->last = bli;
  4278. }
  4279. //
  4280. if(bliend == blie)
  4281. {
  4282. ASSERT(0);//the have the duplicited objector
  4283. }
  4284. else
  4285. {
  4286. bli->last = bliend;
  4287. bliend->next = bli;
  4288. }
  4289. }
  4290. else
  4291. {
  4292. bli->next = blistart;
  4293. blistart->last = bli;
  4294. if(bliend != blie)
  4295. {
  4296. bli->last = bliend;
  4297. bliend->next = bli;
  4298. }
  4299. else if(bliend == blie)
  4300. {
  4301. if(bliend->last !=NULL)
  4302. {
  4303. bli->last = bliend->last;
  4304. bliend->last->next = bli;
  4305. }
  4306. else{
  4307. lcnbl->bli = bli;
  4308. }
  4309. }
  4310. }
  4311. }
  4312. else //at least have two besector;
  4313. {
  4314. if(i==0)//Assign the first 
  4315. {
  4316. if(blistart == blis)
  4317. {
  4318. if(blistart->next != NULL)
  4319. {
  4320. bli->next = blistart->next;
  4321. blistart->next->last = bli;
  4322. }
  4323. }
  4324. else
  4325. {
  4326. bli->next = blistart;
  4327. blistart->last = bli;
  4328. }
  4329. blia = bli;
  4330. bli = NULL;
  4331. }
  4332. //assing the last;
  4333. else if(i==pbl)
  4334. {
  4335. //
  4336. if(bliend != blie)
  4337. {
  4338. bli->last = bliend;
  4339. bliend->next = bli;
  4340. }
  4341. else if(bliend == blie)
  4342. {
  4343. if(bliend->last !=NULL)
  4344. {
  4345. bli->last = bliend->last;
  4346. bliend->last->next = bli;
  4347. }
  4348. else{
  4349. lcnbl->bli = bli;
  4350. }
  4351. }
  4352. //
  4353. bli->next = blia;
  4354. blia->last = bli;
  4355. }
  4356. else//assign the middle objector
  4357. {
  4358. bli->next = blia;
  4359. blia->last = bli;
  4360. blia = bli;
  4361. }
  4362. }
  4363. bli = NULL;
  4364. }
  4365. //before delete the rebundant bisector we must find the next lcnbl first;
  4366. lcnbl = vfindcnbll(bliend->bni->othercns,lcnbl);//
  4367. //
  4368. bli = lcnbl->bli;
  4369. while(bli!=NULL)
  4370. {
  4371. if(bli->bni->bns == bliend->bni->bns)
  4372. break;
  4373. bli = bli->next;
  4374. }
  4375. ASSERT(bli);
  4376. *lcnblin = lcnbl;
  4377. *bliout = bli;
  4378. //delete rebundant bisector;information of bnses is left untouched
  4379. blit = blis;
  4380. if(blis == blie&&blis!=NULL)
  4381. {
  4382. delete blis;
  4383. return;
  4384. }
  4385. else if(blis == bliend || blie == blistart ) 
  4386. {
  4387. return;
  4388. }
  4389. else
  4390. {
  4391. while(blit != blie && blit!=NULL){
  4392. blia = blit->last;
  4393. vdeletebli(blit);//? I do not know whether I can delete all node including bns
  4394. blit = blia;
  4395. }
  4396. if(blit!=NULL)
  4397. {
  4398. if(flag1)
  4399. blit->bni->flag = 1;
  4400. else{
  4401. vdeletebli(blit);
  4402. }
  4403. }
  4404. return;
  4405. }
  4406. //
  4407. }//ok
  4408. //删除rcnbl中的角平分线,加入栈中的角平分线
  4409. void vregendercnblr(PVCNBL *rcnblin,PVCNBL lcnbl,PVBLI blistart,PVBLI bliend,
  4410. PVBLI pbufr[],int pbr,PVBLI *bliout)
  4411. {
  4412. if(pbr <= -1) return ;
  4413. ASSERT(*rcnblin);ASSERT(blistart);ASSERT(bliend);ASSERT(lcnbl);
  4414. PVBLI   bli,blit,blia,blis,blie;
  4415. double  tm,tm1,tm2;
  4416. double  t1,t2;
  4417. int     mvalue;
  4418. int     i;
  4419. PVCNBL   rcnbl = *rcnblin;
  4420. //删去bisector
  4421. //gain blis first;
  4422. if(pbufr[0]->clockwise == CW)
  4423. {
  4424. t1 = pbufr[0]->bni->bns->t2;
  4425. vgainintersectmvaluebns(blistart->bni->bns,
  4426. pbufr[0]->bni->bns,pbufr[0]->bni->bns->t2,&mvalue);
  4427. }
  4428. else
  4429. {
  4430. t1 = pbufr[0]->bni->bns->t1;
  4431. vgainintersectmvaluebns(blistart->bni->bns,
  4432. pbufr[0]->bni->bns,pbufr[0]->bni->bns->t1,&mvalue);
  4433. }
  4434. tm  = t1 * mvalue;
  4435. tm1 = blistart->bni->bns->t1 * blistart->bni->bns->m1;
  4436. tm2 = blistart->bni->bns->t2 * blistart->bni->bns->m2;
  4437. if(rcnbl->flag == 1&&lcnbl->flag ==1)
  4438. {
  4439. if(pbr == 0)
  4440. {
  4441. if(blistart)
  4442. {
  4443. blistart->next = pbufr[0];
  4444. pbufr[0]->last = blistart;
  4445. }
  4446. else 
  4447. {
  4448. rcnbl->bli = pbufr[0];
  4449. ASSERT(0);
  4450. }
  4451. return;
  4452. }
  4453. for(i=0;i<=pbr;i++)
  4454. {
  4455. if(i == 0)
  4456. {
  4457. if(blistart)
  4458. {
  4459. blistart->next = pbufr[i];
  4460. pbufr[i]->last = blistart;
  4461. }
  4462. else ASSERT(0);
  4463. }
  4464. else
  4465. {
  4466. pbufr[i]->last = pbufr[i-1];
  4467. pbufr[i-1]->next = pbufr[i];
  4468. }
  4469. }
  4470. return ;
  4471. }
  4472. if((CCW == blistart->clockwise && fabs(tm2-tm)<=ZERO) ||
  4473. (CW == blistart->clockwise && fabs(tm1-tm)<=ZERO))
  4474. {
  4475. blis = blistart->next;
  4476. }
  4477. else if((CCW == blistart->clockwise && fabs(tm1-tm)<=ZERO) ||
  4478. (CW == blistart->clockwise && fabs(tm2-tm)<=ZERO))
  4479. {
  4480. blis = blistart;
  4481. }
  4482. else if(tm-tm1>ZERO&&tm-tm2<-ZERO||(tm-tm2>ZERO&&tm-tm1<-ZERO))
  4483. {
  4484. blis = blistart->next;
  4485. if(blistart->clockwise == CCW)
  4486. {
  4487. blistart->bni->bns->t2 = t1;
  4488. blistart->bni->bns->m2 = mvalue;
  4489. }
  4490. else
  4491. {
  4492. blistart->bni->bns->t1 = t1;
  4493. blistart->bni->bns->m1 = mvalue;
  4494. }
  4495. }
  4496. else ASSERT(0);
  4497. if(blistart->bni->flag)
  4498. {
  4499. if(blistart == blis)
  4500. {
  4501. blia = blistart->last;
  4502. }
  4503. else
  4504. {
  4505. blia = blistart;
  4506. }
  4507. vregendercnblunexpectedr(rcnblin,lcnbl,blia,bliend,pbufr,pbr,bliout);
  4508. /////
  4509. blistart->bni->flag = 0;
  4510. return;
  4511. }
  4512. //gain blie
  4513. if(pbufr[pbr]->clockwise == CW)
  4514. {
  4515. t2 = pbufr[pbr]->bni->bns->t1;
  4516. vgainintersectmvaluebns(bliend->bni->bns,
  4517. pbufr[pbr]->bni->bns,pbufr[pbr]->bni->bns->t1,&mvalue);
  4518. }
  4519. else
  4520. {
  4521. t2 = pbufr[pbr]->bni->bns->t2;
  4522. vgainintersectmvaluebns(bliend->bni->bns,
  4523. pbufr[pbr]->bni->bns,pbufr[pbr]->bni->bns->t2,&mvalue);
  4524. }
  4525. tm = t2 * mvalue;
  4526. tm1 = bliend->bni->bns->t1 * bliend->bni->bns->m1;
  4527. tm2 = bliend->bni->bns->t2 * bliend->bni->bns->m2;
  4528. if((CCW == bliend->clockwise && fabs(tm-tm2)<=ZERO) ||
  4529. (CW == bliend->clockwise && fabs(tm-tm1)<=ZERO))
  4530. {
  4531. blie = bliend;
  4532. }
  4533. else if((CCW == bliend->clockwise && fabs(tm-tm1)<=ZERO) ||
  4534. (CW == bliend->clockwise && fabs(tm-tm2)<=ZERO))
  4535. {
  4536. blie = bliend->last;
  4537. }
  4538. else if(tm-tm1>ZERO&&tm-tm2<-ZERO||(tm-tm2>ZERO&&tm-tm1<-ZERO))
  4539. {
  4540. blie = bliend->last;
  4541. if(bliend->clockwise == CCW)
  4542. {
  4543. bliend->bni->bns->t1 = t2;
  4544. bliend->bni->bns->m1 = mvalue;
  4545. }
  4546. else
  4547. {
  4548. bliend->bni->bns->t2 = t2;
  4549. bliend->bni->bns->m2 = mvalue;
  4550. }
  4551. }
  4552. else ASSERT(0);
  4553. //below is the dealing with the special case.
  4554. //添上bisector from blifirst to bliend
  4555. bli = NULL;
  4556. for(i=0;i<=pbr;i++)
  4557. {
  4558. bli = pbufr[i];
  4559. //assign clockwise
  4560. //assign link info  ??
  4561. if(pbr == 0)//if there is only one besector in the voronoi diagram
  4562. {
  4563. if(blistart == blis)
  4564. {
  4565. if(blistart->last == NULL)
  4566. {
  4567. rcnbl->bli = bli;//bli->last=NULL;bli->next=NULL;
  4568. }
  4569. else
  4570. {
  4571. bli->last = blistart->last;
  4572. blistart->last->next = bli;
  4573. }
  4574. //
  4575. if(bliend == blie)
  4576. {
  4577. ASSERT(0);//the have the duplicited objector
  4578. }
  4579. else
  4580. {
  4581. bli->next = bliend;
  4582. bliend->last = bli;
  4583. }
  4584. }
  4585. else
  4586. {
  4587. bli->last = blistart;
  4588. blistart->next = bli;
  4589. if(bliend != blie)
  4590. {
  4591. bli->next = bliend;
  4592. bliend->last = bli;
  4593. }
  4594. else if(bliend == blie)
  4595. {
  4596. if(bliend->next !=NULL)
  4597. {
  4598. bli->next = bliend->next;
  4599. bliend->next->last = bli;
  4600. }
  4601. }
  4602. }
  4603. }
  4604. else //at least have two besector;
  4605. {
  4606. if(i == 0)//Assign the first 
  4607. {
  4608. if(blistart == blis)
  4609. {
  4610. if(blistart->last == NULL)
  4611. {
  4612. rcnbl->bli = bli;//bli->last=NULL;bli->next=NULL;
  4613. }
  4614. else
  4615. {
  4616. bli->last = blistart->last;
  4617. blistart->last->next = bli;
  4618. }
  4619. }
  4620. else
  4621. {
  4622. bli->last = blistart;
  4623. blistart->next = bli;
  4624. }
  4625. blia = bli;
  4626. bli = NULL;
  4627. }
  4628. //assing the last;
  4629. else if(i == pbr)
  4630. {
  4631. //
  4632. if(bliend != blie)
  4633. {
  4634. bli->next = bliend;
  4635. bliend->last = bli;
  4636. }
  4637. else if(bliend == blie)
  4638. {
  4639. if(bliend->next !=NULL)
  4640. {
  4641. bli->next = bliend->next;
  4642. bliend->next->last = bli;
  4643. }
  4644. }
  4645. //
  4646. bli->last = blia;
  4647. blia->next = bli;
  4648. }
  4649. else//assign the middle objector
  4650. {
  4651. bli->last = blia;
  4652. blia->next = bli;
  4653. blia = bli;
  4654. }
  4655. }
  4656. bli = NULL;
  4657. }
  4658. //before deleter the rebundant bisector we must assignt the rcnble and bliout first;
  4659. rcnbl = vfindcnblr(bliend->bni->othercns,rcnbl);//
  4660. //
  4661. bli = rcnbl->bli;
  4662. while(bli != NULL)
  4663. {
  4664. if(bli->bni->bns == bliend->bni->bns)
  4665. break;
  4666. bli = bli->next;
  4667. }
  4668. ASSERT(bli);
  4669. *rcnblin = rcnbl;
  4670. *bliout = bli;
  4671. //delete rebundant bisector;information of bnses is left untouched
  4672. blit = blis;
  4673. if(blis == blie&&blis!=NULL)
  4674. {
  4675. delete blis;
  4676. return;
  4677. }
  4678. else if( blis == bliend ) 
  4679. {
  4680. return;
  4681. }
  4682. else
  4683. {
  4684. while(blit!=blie && blit!=NULL){
  4685. blia = blit->next;
  4686. vdeletebli(blit);//? I do not know whether I can delete all node including bns
  4687. blit = blia;
  4688. }
  4689. if(blit!=NULL)
  4690. vdeletebli(blit);
  4691. return;
  4692. }
  4693. //
  4694. }//ok?
  4695. //find intersection t;and the label of bli;
  4696. // blif is the first bli of lcnbl (**not rcnbl**)
  4697. // bli output the first bli of lcnbl regenerted.
  4698. // bns input the the bisector of lcnbl and rcns,because(???)
  4699. // the bisector must be gennerated in the first processing
  4700. //求得角平分线与左边沃诺图区的交点
  4701. //是否需要传入bns?//如果没有交点,返回0;否则返回1
  4702. int vgainintersectortl(PVCNBL lcnbl,PVCNS rcns,PVBNS bns,int startflag,int directionflag,PVBLI blif,double *t,int *m,PVBLI *bli)
  4703. {
  4704. //如果与一条边有两个"有效"交点,只取一个最近点。
  4705. ASSERT(rcns);ASSERT(lcnbl);
  4706. ASSERT(lcnbl->flag!=1);
  4707. ASSERT( blif );
  4708. //
  4709. PVCNS cns;
  4710. PVBLI blig;
  4711. int i,flag1,flag2;
  4712. double tg[2];
  4713. int   mm[2],mvalue;
  4714. int tmlabel = 0;
  4715. //
  4716. double tmfirst = bns->t1 * bns->m1;//how about the validation of m1?
  4717. //                                 //is m1 belong to bns?looking into it afterwards
  4718. blig = blif;
  4719. cns  = blig->bni->othercns;
  4720. /*
  4721. vgainintersect(lcnbl->cns,rcns,cns,&i,tg);
  4722. if(i == 2)//有可能与同一条角平分线有两个交点???
  4723. {
  4724. return 1;
  4725. }
  4726. */
  4727. blig = blig->last;
  4728. int flag = 1;
  4729. while0( blig && flag)
  4730. {
  4731. cns = blig->bni->othercns;
  4732. vgainintersect(lcnbl->cns,rcns,cns,&i,tg);//????
  4733. if(i == 1)
  4734. {
  4735. if(tg[0] - bns->tmin<-ZERO)
  4736. {
  4737. blig = blig->last;
  4738. continue;
  4739. }
  4740. }
  4741. else if(i==2)
  4742. {
  4743. if(tg[0]-bns->tmin < -ZERO && tg[1] - bns->tmin < -ZERO)
  4744. {
  4745. blig = blig->last;
  4746. continue;
  4747. }
  4748. else if(tg[0] - bns->tmin < -ZERO)
  4749. {
  4750. i = 1;
  4751. tg[0] = tg[1];
  4752. }
  4753. else if(tg[1] - bns->tmin < -ZERO)
  4754. {
  4755. i = 1;
  4756. }
  4757. }
  4758. if(i == 0){
  4759. blig = blig->last;
  4760. continue;
  4761. }
  4762. else if(i == 1)
  4763. {
  4764. vgainintersectmvaluebns(bns,blig->bni->bns,tg[0],1,&mvalue);
  4765. mm[0] = mvalue;
  4766. //
  4767. vgainintersectmvaluebns(blig->bni->bns,bns,tg[0],&mvalue);
  4768. flag1 = vjudgetheinbns(blig->bni->bns,tg[0],mvalue);
  4769. if(flag1 == 0)
  4770. {
  4771. blig = blig->last;
  4772. continue;
  4773. }
  4774. else if(flag1 != 0)
  4775. {
  4776. if((tg[0]*mm[0] - tmfirst)*directionflag>=0)
  4777. {//this statement can confirm t*m is in validative position against tmfirst;
  4778. *bli = blig;
  4779. *t = tg[0];
  4780. *m = mm[0];
  4781. flag = 0;
  4782. }
  4783. else 
  4784. {
  4785. blig = blig->last;
  4786. continue;
  4787. }
  4788. }
  4789. }
  4790. else if(i==2)
  4791. {
  4792. vgainintersectmvaluebns(bns,blig->bni->bns,tg[0],&mvalue);
  4793. mm[0] = mvalue;
  4794. vgainintersectmvaluebns(bns,blig->bni->bns,tg[1],&mvalue);
  4795. mm[1] = mvalue;
  4796. //
  4797. vgainintersectmvaluebns(blig->bni->bns,bns,tg[0],&mvalue);
  4798. flag1 = vjudgetheinbns(blig->bni->bns,tg[0],mvalue);
  4799. //
  4800. vgainintersectmvaluebns(blig->bni->bns,bns,tg[1],&mvalue);
  4801. flag2 = vjudgetheinbns(blig->bni->bns,tg[1],mvalue);
  4802. if(0 == flag1 ) 
  4803. {
  4804. if(0 == flag2)
  4805. {
  4806. blig = blig->last;
  4807. continue;
  4808. }
  4809. else if(0 != flag2)
  4810. {
  4811. if((tg[1]*mm[1] - tmfirst)*directionflag>=0)
  4812. {
  4813. *bli = blig;
  4814. *t = tg[1];
  4815. *m = mm[1];
  4816. flag = 0;
  4817. }
  4818. else
  4819. {
  4820. blig = blig->last;
  4821. continue;
  4822. }
  4823. }
  4824. }
  4825. else if(flag1 != 0 )
  4826. {
  4827. if(0 == flag2)
  4828. {
  4829. if((tg[0]*mm[0] - tmfirst)*directionflag>=0){
  4830. *bli = blig;
  4831. *t = tg[0];
  4832. *m = mm[0];
  4833. flag = 0;
  4834. }
  4835. else {
  4836. blig =blig->last;
  4837. continue;
  4838. }
  4839. }
  4840. else if(0 != flag2)
  4841. {
  4842. double tg1,tg2;
  4843. tg1 = tg[0]*mm[0];
  4844. tg2 = tg[1]*mm[1];
  4845. if((tg1-tmfirst)*directionflag>=0)
  4846. {
  4847. if((tg2-tmfirst)*directionflag>=0)
  4848. {
  4849. if((tg1-tg2)*directionflag>=0)
  4850. {
  4851. tg[0] = tg[1];
  4852.         mm[0] = mm[1];
  4853. }
  4854. /*else
  4855. {tg[0]=tg[0];mm[0]=mm[0];//so it can be left out
  4856. }*/
  4857. }
  4858. /*else 
  4859. {
  4860. }*/
  4861. }
  4862. else 
  4863. {
  4864. if((tg2-tmfirst)*directionflag>=0)
  4865. {
  4866. tg[0] = tg[1];
  4867.         mm[0] = mm[1];
  4868. }
  4869. else 
  4870. {
  4871. blig = blig->last;
  4872. continue;
  4873. }
  4874. }
  4875. *bli = blig;
  4876. *t = tg[0];
  4877. *m = mm[0];
  4878. flag = 0;
  4879. }
  4880. //flag = 0;
  4881. }
  4882. }
  4883. blig = blig->last;
  4884. }
  4885. if(flag == 1){
  4886. //AfxMessageBox("you have counter no intersector,so you have to return and leave the processing to the uper functions");
  4887. return 0;
  4888. }//
  4889. return 1;
  4890. }
  4891. //求得角平分线与右边沃诺图区的交点
  4892. int vgainintersectortr(PVCNBL rcnbl,PVCNS lcns,PVBNS bns,int startflag,int directionflag,PVBLI blif,double *t,int *m,PVBLI *bli)
  4893. {
  4894. //如果与一条边有两个交点,只取一个最近点。
  4895. ASSERT(lcns);ASSERT(rcnbl);
  4896. ASSERT(rcnbl->flag!=1);
  4897. ASSERT(blif);
  4898. //
  4899. PVCNS cns;
  4900. PVBLI blig;
  4901. int i,flag1,flag2;
  4902. double tg[2],tmfirst,dtemp;
  4903. int   mm[2],mvalue;
  4904. //
  4905. *bli=NULL;
  4906. tmfirst = bns->m1*bns->t1;
  4907. //
  4908. blig = blif;
  4909. //
  4910. blig = blif->next;
  4911. int flag = 1;
  4912. while( blig && flag)
  4913. {
  4914. cns = blig->bni->othercns;
  4915. vgainintersect(rcnbl->cns,lcns,cns,&i,tg);//
  4916. if(i == 0){
  4917. blig = blig->next;
  4918. continue;
  4919. }
  4920. else if(i == 1)
  4921. {
  4922. dtemp = tg[0];
  4923. flag1 = vjudgetheinbns(blig->bni->bns,dtemp,1);
  4924. flag2 = vjudgetheinbns(blig->bni->bns,dtemp,-1);
  4925. if(flag1 == 0&&flag2 == 0)
  4926. {
  4927. blig = blig->next;
  4928. continue;
  4929. }
  4930. if(flag1&&flag2)
  4931. {
  4932. mvalue = -1;
  4933. vgainintersectmvaluebns(bns,blig->bni->bns,&dtemp,1,&mvalue);
  4934. mm[0] = mvalue;
  4935. vgainintersectmvaluebns(blig->bni->bns,bns,&dtemp,&mvalue);
  4936. flag1 = vjudgetheinbns(blig->bni->bns,dtemp,mvalue);
  4937. }
  4938. else{
  4939. if(flag1)mvalue = 1;
  4940. if(flag2)mvalue = -1;
  4941. }
  4942. dtemp = tg[0];
  4943. vgainintersectmvaluebns(bns,blig->bni->bns,&dtemp,1,&mvalue);
  4944. mm[0] = mvalue;
  4945. vgainintersectmvaluebns(blig->bni->bns,bns,&dtemp,&mvalue);
  4946. flag1 = vjudgetheinbns(blig->bni->bns,dtemp,mvalue);
  4947. }
  4948. else if(i==2)
  4949. {
  4950. }
  4951. blig=blig->next;//this if the only diffirence between vgainbisectortr
  4952.                 //and vgainbisectortl;
  4953. }
  4954. if(flag == 1){
  4955. //AfxMessageBox("you have counter no intersector,so you have to return and leave the processing to the uper functions");
  4956. return 0;
  4957. }//
  4958. return 1;
  4959. }
  4960. //.....................................................................
  4961. void vmergetwoprofile(PVPL pl,PVPL pr,PVPL *vpl)
  4962. {
  4963. ASSERT(pl);ASSERT(pr);ASSERT(pl->eplf);ASSERT(pl->splf);
  4964. ASSERT(pr->splf);ASSERT(pr->eplf);
  4965. //template used 
  4966. PVCNBL  lcnbl,rcnbl,tlcnbl,trcnbl,cnbl=NULL;
  4967. PVBLI   bli;
  4968. PVBNS   bns = NULL;
  4969. int     clockwiseflag = 1;
  4970. int     directionflag = 0;
  4971. //initial
  4972. int     mfirst = 1;
  4973. int     mblis  = 1;//mblis = ?
  4974. double  tfirst = 0;
  4975. int     startflag = 0;//=0,from l and r,=1 start from l,=2  start from r only
  4976. //
  4977. PVBLI   blir,blil;
  4978. PVBLI   blistr,blistl;
  4979. //flag tab
  4980. double  mtemp;
  4981. int     lrflag;
  4982. //stack
  4983. PVBLI pbufl[40],pbufr[40];//栈
  4984. int   pbl = -1, pbr = -1;
  4985. //
  4986. tlcnbl = pl->splf->scnbl;
  4987. trcnbl = pr->eplf->ecnbl;
  4988. //
  4989. lcnbl = tlcnbl->ccw; //leave the point segment out
  4990. rcnbl = trcnbl->cw;  //leave the point segment out
  4991. lcnbl->cw = rcnbl;
  4992. rcnbl->ccw = lcnbl;
  4993. //vdeletevendpointcnbl(tlcnbl);
  4994. //vdeletevendpointcnbl(trcnbl); //flag=1 mean the pointsegment for ending
  4995. //initial
  4996. blil = lcnbl->bli;
  4997. while(blil->next!=NULL)
  4998. {
  4999. blil = blil->next;
  5000. }
  5001. blir = rcnbl->bli;
  5002. blistl = blil;
  5003. blistr = blir;
  5004. //
  5005. int iflag=1;
  5006. while(iflag)
  5007. {
  5008. if(!(1==rcnbl->flag && 1==lcnbl->flag))// if not all met the end of cnbl node.
  5009. {
  5010. bns = NULL;
  5011. vgainbisector(lcnbl->cns,rcnbl->cns,&bns);//关键的函数,可以是无穷函数
  5012. //放入角平分线作为参数传入bns不能释放
  5013. if(bns == NULL)     //只有终止时才会有空或,交点到无穷远
  5014. {
  5015. return ; //应该得到一条无限的角平分线,并结束缝合
  5016. }//it is impossible
  5017. else
  5018. {
  5019. bns->t1 = tfirst;//I think/wonder the statement can be delete safely 
  5020. if( pbl == -1  )//如果两边都空或左空
  5021. {
  5022. vgainintersectmvaluebns(bns,blistl->bni->bns,&tfirst,mblis,&mfirst);
  5023. bns->m1 = mfirst;
  5024. bns->t1 = tfirst;
  5025. directionflag = vfinddirection(blil,bns,tfirst,mfirst);
  5026. }
  5027. else if(pbr == -1 )//右空
  5028. {
  5029. vgainintersectmvaluebns(bns,blistr->bni->bns,&tfirst,mblis,&mfirst);
  5030. bns->m1 = mfirst;
  5031. bns->t1 = tfirst;
  5032. directionflag = vfinddirection(blir,bns,tfirst,mfirst);
  5033. }
  5034. }
  5035. //give the vfindfirstpoint a direction
  5036. ASSERT(directionflag);
  5037. //
  5038. //找到最近的一个交点,t/大小,blit/所处角平分线连的位子,lrflag/交于那边;
  5039. vfindfirstpoint(rcnbl,lcnbl,bns,startflag,directionflag,//VIF(very impotant function)
  5040. &blil,&blir ,&lrflag );//i=0 none intersect,i=1 left,i=2,right;
  5041. //对tfirst进行赋值运算//可行
  5042. if(lrflag == -1)//there aren't any intersect point meet the needs
  5043. {//应有特殊处理//modified in 6-17
  5044. bli = vmallocbli();
  5045. bli->bni = vmallocbni();
  5046. bli->bni->bns = bns;
  5047. if(directionflag == CCW)
  5048. {
  5049. bli->bni->bns->m2 = 1;
  5050. clockwiseflag = 1;
  5051. }
  5052. else if(directionflag == CW)
  5053. {
  5054. bli->bni->bns->m2 = -1;
  5055. clockwiseflag = -1;
  5056. }
  5057. //
  5058. pbl++;
  5059. pbufl[pbl] = bli;
  5060. bli->bni->selfcns = lcnbl->cns;
  5061. bli->bni->othercns = rcnbl->cns;
  5062. bli->clockwise = clockwiseflag;
  5063. bli = NULL;
  5064. //
  5065. bli = vmallocbli();
  5066. bli->bni = vmallocbni();
  5067. bli->bni->bns = bns;
  5068. pbr++;
  5069. pbufr[pbr] = bli;
  5070. bli->bni->selfcns = rcnbl->cns;
  5071. bli->bni->othercns = lcnbl->cns;
  5072. bli->clockwise = clockwiseflag;
  5073. bli = NULL;
  5074. //
  5075. *vpl = pl;
  5076. pl->ptype = VCOMMON;
  5077. blistr->bni->flag = 1;
  5078. blistl->bni->flag = 1;//bni->flag have left for the special processing
  5079. vregendercnblr(&rcnbl,lcnbl,blistr,blir,pbufr,pbr,&bli);//
  5080. vregendercnbll(&lcnbl,rcnbl,blistl,blil,pbufl,pbl,&bli);//
  5081. pl->splf->scnbl = pr->splf->scnbl; 
  5082. pl->eplf->ecnbl = pl->eplf->ecnbl;
  5083. return;
  5084. }
  5085. //
  5086. tfirst = bns->t2;
  5087. //在此之前,bns还没有被排列,即bli中的clockwise没有被更新
  5088. bli = vmallocbli();
  5089. bli->bni =vmallocbni();
  5090. bli->bni->bns = bns;
  5091. clockwiseflag = vgetclockwisebli(bli);
  5092. //
  5093. //
  5094. pbl++;
  5095. pbufl[pbl] = bli;
  5096. bli->bni->selfcns = lcnbl->cns;
  5097. bli->bni->othercns = rcnbl->cns;
  5098. bli->clockwise = clockwiseflag;
  5099. bli = NULL;
  5100. //
  5101. bli = vmallocbli();
  5102. bli->bni = vmallocbni();
  5103. bli->bni->bns = bns;
  5104. pbr++;
  5105. pbufr[pbr] = bli;
  5106. bli->bni->selfcns = rcnbl->cns;
  5107. bli->bni->othercns = lcnbl->cns;
  5108. bli->clockwise = clockwiseflag;
  5109. bli = NULL;
  5110. //bns = NULL;//in this time the bns can't be put zero
  5111. //压栈
  5112. //
  5113. if(lrflag == 1)//先与左边相交
  5114. {
  5115. //删除lcnbl中的角平分线,加入栈中的角平分线
  5116. vregendercnbll(&lcnbl,rcnbl,blistl,blil,pbufl,pbl,&bli);//?
  5117. pbl=-1;//清空栈
  5118. //找到blil的另一部分cns对应的cnbl节点
  5119. startflag = 1;
  5120. //
  5121. blil = blistl = bli;
  5122. mblis = bli->bni->bns->m2;
  5123. bli = NULL;
  5124. }   
  5125. else if(lrflag == 2) //intersect with right
  5126. {
  5127. vregendercnblr(&rcnbl,lcnbl,blistr,blir,pbufr,pbr,&bli);//?
  5128. pbr = -1;//清空栈
  5129. //清空并更新
  5130. startflag = 2;
  5131. //
  5132. blir = blistr = bli;
  5133. mblis = bli->bni->bns->m1;
  5134. }
  5135. else if(lrflag == 0)//intersect with two all simultaniously
  5136. {
  5137. cnbl = rcnbl;
  5138. vregendercnblr(&rcnbl,lcnbl,blistr,blir,pbufr,pbr,&bli);//
  5139. blir = blistr = bli;
  5140. bli  = NULL;
  5141. //
  5142. vregendercnbll(&lcnbl,cnbl,blistl,blil,pbufl,pbl,&bli);//
  5143. blil = blistl = bli;
  5144. mblis = bli->bni->bns->m2;
  5145. bli = NULL;
  5146. //
  5147. pbr=-1;pbl=-1;//清空栈
  5148. //请空并更新
  5149. startflag = 0;
  5150. }
  5151. }
  5152. //
  5153. else if(1==rcnbl->flag&&1==lcnbl->flag)//both left and right  end
  5154. {
  5155. *vpl = pl;
  5156. pl->ptype = VCOMMON;
  5157. if(tfirst<=ZERO)//this is the end of the whole merge processing.
  5158. {
  5159. tlcnbl = lcnbl->cw;
  5160. trcnbl = rcnbl->ccw;
  5161. tlcnbl->ccw = trcnbl;
  5162. trcnbl->cw  = tlcnbl;
  5163. vdeletevendpointcnbl(lcnbl);
  5164. vdeletevendpointcnbl(rcnbl);
  5165. pl->splf->scnbl = trcnbl;
  5166. pl->eplf->ecnbl = tlcnbl;
  5167. }
  5168. else
  5169. {
  5170. vregendercnblr(&rcnbl,lcnbl,blistr,blir,pbufr,pbr,&bli);//
  5171. vregendercnbll(&lcnbl,rcnbl,blistl,blil,pbufl,pbl,&bli);//
  5172. pbr=-1;pbl=-1;//清空栈
  5173. pl->splf->scnbl = pr->splf->scnbl; 
  5174. pl->eplf->ecnbl = pl->eplf->ecnbl;
  5175. }
  5176. return;
  5177. }
  5178.     }
  5179. }
  5180. //计算卧诺图
  5181. void  vmergesingleprofile(PVPL profile)
  5182. {
  5183. ASSERT(profile);
  5184. PVPL pl,pr,midprofile;
  5185. PVBNS bns;
  5186. PVCNBL cnbl;
  5187. PVBLI bli;
  5188. int i = 0;
  5189. if(SINGLE == profile->ptype)//判断是否是叶子/单树枝ok
  5190. {
  5191. vgainsingleplfbli(profile->eplf);//给叶子赋值//ok perhaps
  5192. if(0)
  5193. {
  5194. cnbl = profile->eplf->scnbl;
  5195. do{
  5196. bli = cnbl->bli;
  5197. do{
  5198. vdisplaysinglebi(*bli->bni->bns,RGB(0,0,255));
  5199. AfxMessageBox("show the result");
  5200. bli = bli->next;
  5201. }while(bli);
  5202. cnbl = cnbl->ccw;
  5203. }while(cnbl!=profile->eplf->ecnbl);
  5204. }
  5205. return;
  5206. }
  5207. vdivideprofiletwo(profile,&pl,&pr);//均分树枝;//ok
  5208. vmergesingleprofile(pl);
  5209. if(i)
  5210. {
  5211. vdisplayplv(*pl);
  5212. AfxMessageBox("show the result");
  5213. }
  5214. vmergesingleprofile(pr);
  5215. if(i)
  5216. {
  5217. vdisplayplv(*pr);
  5218. AfxMessageBox("show the result");
  5219. }
  5220. vmergetwoprofile(pl,pr,&midprofile);//缝合枝枝叶叶waiting
  5221. myflag++;
  5222. if(i)
  5223. {
  5224. vdisplayplv(*midprofile);
  5225. AfxMessageBox("show the result");
  5226. }
  5227. profile->eplf  = midprofile->eplf ;
  5228. profile->splf  = midprofile->splf ;
  5229. profile->ptype = midprofile->ptype;
  5230. }
  5231. /*the end*/