Esempio n. 1
0
boolean ScanCellBox(IntPoint3 *vn, IntPoint3 *vp, Point3 *v,
	struct argGroup* args, int *index,float *MinRadius)
{
 Face *f = args->f;
 Line *Lc = args->Lc;
 Plane *p = args->p;
 UG *G  = args->G;
 int i,j,k;
 int CellIndex;
 Plist *P;
 Plane Mp;
 Point3 c;
 float Radius;
 int indpnt=-1;
 boolean Found=FALSE;

 for(i=vn->x; i<=vp->x; i++)
   for(j=vn->y; j<=vp->y; j++)
     for(k=vn->z; k<=vp->z; k++)
	{
	 CellIndex = i + j*G->x + k*G->y*G->x;
	 if(!UGIsMarked(G,CellIndex))
	   {
	    UGMark(G,CellIndex);
	    P=G->C[CellIndex];
	    while(P)
	      {
	       indpnt=P->p;
	       if(G->UsedPoint[indpnt]!=0)
	       if((indpnt!=f->v[0]) &&
		  (indpnt!=f->v[1]) &&
		  (indpnt!=f->v[2]) &&
		   RightSide(p,&(v[indpnt])) )
		   {
		    CalcMiddlePlane(&(v[indpnt]),&(v[f->v[0]]),&Mp);
		    if(CalcLinePlaneInter(Lc,&Mp,&c))
		      {
			Radius=V3SquaredDistanceBetween2Points(&c, &(v[indpnt]));
			if(!RightSide(p,&c)) Radius=-Radius;

			if(Radius==*MinRadius) Error("Cinque punti cocircolari!!\n",EXIT);
			if(Radius<*MinRadius)
				{
				 *MinRadius=Radius;
				 *index=indpnt;
				 Found=TRUE;
				}

		      }
		   }
	       P=P->next;
	      }  /* end while	     */
	   }	 /* end if !IsMarked */
	}	 /* end for	     */


 return Found;
}
Esempio n. 2
0
boolean MakeLastScan(IntPoint3 *Start, IntPoint3 *End, IntPoint3 *Inc, Point3 *v,
	 struct argGroup* args, int *index, float *MinRadius)
{

 Face *f = args->f;
 Line *Lc = args->Lc;
 Plane *p = args->p;
 UG *G  = args->G;
 
 int i,j,k;
 int CellIndex;
 Plist *P;
 Plane Mp;
 Point3 c;
 float Radius;
 int indpnt=-1;

 for(i=Start->x; Inc->x*i <= Inc->x*End->x; i+=Inc->x)
   {
   // printf("LastScan cell x=%d\n",i);
    if(!ExaminableCell(i,Start->y,Start->z,p,G)) i=End->x;
    else for(j=Start->y; Inc->y*j<=Inc->y*End->y; j+=Inc->y)
	  {
//	   printf("LastScan cell y=%d\n",j);
	   if(!ExaminableCell(i,j,Start->z,p,G)) j=End->y;
	   else for(k=Start->z; Inc->z*k<=Inc->z*End->z; k+=Inc->z)
		 {
//		  printf("LastScan cell z=%d\n",k);
		  if(!ExaminableCell(i,j,k,p,G)) k=End->z;
		  else
		   {
		    CellIndex = i + j*G->x + k*G->y*G->x;
		    if(!UGIsMarked(G, CellIndex))
			{
			P=G->C[CellIndex];
//			printf("LastScan found cell x=%d y=%d z=%d\n",i,j,k);
			while(P)
			 {
			  indpnt=P->p;
		//	  printf("LastScan indpnt is: %d\n",indpnt);
			  if((indpnt!=f->v[0]) &&
			     (indpnt!=f->v[1]) &&
			     (indpnt!=f->v[2]) &&
			     RightSide(p,&(v[indpnt])) )
			   {
			    CalcMiddlePlane(&(v[indpnt]),&(v[f->v[0]]),&Mp);
			    if(CalcLinePlaneInter(Lc,&Mp,&c))
			     {
			      Radius=V3SquaredDistanceBetween2Points(&c, &(v[indpnt]));
//			      printf("LastScan Radius: %f\n",Radius);
			      if(!RightSide(p,&c)) Radius=-Radius;
			      if(Radius==*MinRadius) Error("Cinque punti cocircolari!!\n",EXIT);
			      if(Radius<*MinRadius)
				{
//				 printf("LastScan found Radius: %f\n",Radius);
				 *MinRadius=Radius;
				 *index=indpnt;
				}
			     }
			   }
			  P=P->next;
			 }   /* end while		  */
			}    /* end if IsMarked		  */
		   }	     /* end if examinable	  */
		 }  /* end for k      */
	  }	    /* end for j      */
   }		    /* end for i      */

 if(*index==-1) return FALSE;

 return TRUE;
}