/********************************************************************/ /* Copyright (c) 2017 System fugen G.K. and Yuzi Mizuno */ /* All rights reserved. */ /********************************************************************/ #include "MGCLStdAfx.h" #include "mg/Box.h" #include "mg/Vector.h" #include "mg/Position.h" #include "mg/Matrix.h" #include "mg/Transf.h" #include "mg/Straight.h" #include "mg/Plane.h" #include "mg/Tolerance.h" #if defined(_DEBUG) #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // MGBox.cc // Implementation of Class MGBox //////////// 1. Constructor //////////// //Copy constructor. MGBox::MGBox(const MGBox& box2):m_sdim(0), m_range(0){ get_area(box2.sdim()); for(int i=0; i=0.); double hsize=size[i]*0.5; m_range[i]=MGInterval(icentr-hsize, icentr+hsize); } } //中心点と幅を指定しBoxを生成する(すべての辺にたいして同一の値)。 //Construct Box, given center point and a size of each coordinates. //The size is applied to all the coordinates. MGBox::MGBox(const MGPosition& center, double size) :m_sdim(0), m_range(0){ assert (size>=0.); int dim=center.sdim(); get_area(dim); double hsize=size*0.5; for(int i=0; i=dim2 ? dim1:dim2; get_area(dim); for(int i=0; i0); get_area(dim); for(int i=0; i=dim2 ? dim1:dim2; get_area(dim); for(int i=0; i0 && start1=dim) i=0; if(j>=dim2) j=0; } while(k++=dim) i=0; } } //////////Destructor////////////// MGBox::~MGBox(){ if(m_sdim>3) delete[] m_range; } //////////Operator Overload////////// //Assignment. MGBox& MGBox::operator= (const MGBox& box2){ get_area(box2.sdim()); for(int i=0; i=dim2 ? dim1:dim2; if(!dim) return *this; if(dim>dim1) resize(dim); if(finite()){ MGPosition pmin(dim), pmax(dim), p(dim); std::vector vertices=vertex(); int len=(int)vertices.size(),i,j; // for(int k=0; kpmax.ref(j)) pmax(j)=a; } } //Set transformed interval. for(j=0; jdim) resize(dim); return *this; } //自身と与えられたBoxが等しいかどうかを返却する。 //一方のBoxの全ての辺がもう一方の相当する辺に重なる場合 True を返却する。 bool MGBox::operator== (const MGBox& box2) const { int dim1=sdim(); int dim2=box2.sdim(); int dim=dim1dim2){ for(int i=dim2; i> ( const MGPosition & pt) const { int i, dim1=sdim(); if(!dim1) return false; int dim2=pt.sdim(); // ポジションのdataがBoxの全ての辺の範囲内にある場合 // True を返却する。 for(i=0; i> ( const MGBox & box2 ) const { int i, dim1=sdim(); if(!dim1) return false; int dim2=box2.sdim(); if(!dim2) return true; int dim= dim1>box2.m_range[i]) ) return false; } //Check extra dimension of box2. for(i=dim1; ibx1 && x1>bx1) return false; if(y0by1 && y1>by1) return false; if(bx0<=x1 && x1<=bx1 && by0<=y1 && y1<=by1) return true; if(bx0<=x0 && x0<=bx1 && bx0<=x1 && x1<=bx1) return true; if(by0<=y0 && y0<=by1 && by0<=y1 && y1<=by1) return true; v01=MGVector(P1,P0); }else v01=sl.direction(); MGPosition BP0(bx0,by0), BP1(bx1,by1); //corner points of this box to test crossing range. if(x0>bx1 && by0<=y0 && y0<=by1) BP0(0)=bx1; if(x0by1){ if(x0>=bx0){ BP0(1)=by1; if(x0>bx1) BP1(1)=by0; } } if(y0 vertices=vertex(); double d0=plane.distance(vertices[0]); double dmin=d0, dmax=d0; for(int i=1; i<8; i++){ double di=plane.distance(vertices[i]); if(dmin>di) dmin=di; if(dmaxpi){ double len=(m_range[i].low_point()-pi); dist+=len*len; }else if(m_range[i]=dim2 ? dim1:dim2; resize(dim); for(int i=0; i3) delete[] m_range; m_range=m_rData; }else{ if(dim>m_sdim){ if(m_sdim>3) delete[] m_range; m_range= new MGInterval[dim]; } } m_sdim=dim; } //Boxの対角線の両端(high(), low())と中心(mid())を返却する。全ての座標値が //最小の点が low () で、最大の点が high () で返却される。 MGPosition MGBox::high() const { int dim=sdim(); MGPosition high_pt(dim); // 全てのIntervalが少なくとも上方有限の時 // 最大座標値が取得できる for(int i=0; icurrent sdim(), the old data are guaranteed to hold in resized box. void MGBox::resize(int dim){ if(dim==m_sdim) return; if(dim<=3){ if(m_sdim<=3){ m_range=m_rData; for(int i=m_sdim; im_sdim){ MGInterval* rng=new MGInterval[dim]; for(int i=0; i3) delete[] m_range; m_range=rng; } } m_sdim=dim; } //自身のBoxの最大座標値を指定された点に変更する MGBox& MGBox::set_high(const MGPosition& high_pt){ int dim1=sdim(); int dim2=high_pt.sdim(); if(dim2>dim1) resize(dim2); for(int i=0; idim1) resize(dim2); for(int i=0; i3) delete[] m_range; m_sdim=0; m_range=0; } // vertex computes all the vertices of the box. std::vector MGBox::vertex() const{ int dimi=sdim(); double a1,a2,b1,b2; if(!dimi) return std::vector(); else if(dimi==1){ std::vector data(2); double *p1=&a1, *p2=&b1; a1=m_range[0].low_point(); b1=m_range[0].high_point(); data[0]=MGPosition(1,p1); data[1]=MGPosition(1,p2); return data; } a1=m_range[0].low_point(); b1=m_range[0].high_point(); a2=m_range[1].low_point(); b2=m_range[1].high_point(); std::vector data(4); data[0]=MGPosition(a1,a2); data[1]=MGPosition(a1,b2); data[2]=MGPosition(b1,a2); data[3]=MGPosition(b1,b2); int dim=2, dimp1=dim+1; int len=4,len2=len*2,i; while(dim data1=data; data.resize(len2); for(i=0; i