double FramedFace::do_calculateMaxWidth(const VertexVector& vertices) const { double maxHeight=1000000.0; int vertexNum=(int) vertices.size(); for (int i=0;i<vertexNum;i++) { int a1=i; //verticies for 1st angle int a2=i+1; int a3=i+2; a1%=vertexNum; a2%=vertexNum; a3%=vertexNum; int b1=i+1; //verticies for 2nd angle int b2=i+2; int b3=i+3; b1%=vertexNum; b2%=vertexNum; b3%=vertexNum; double angle1=Point::angleMeasure(vertices.at(a1), vertices.at(a2), vertices.at(a3))/2.0; //1st angle measure double angle2=Point::angleMeasure(vertices.at(b1), vertices.at(b2), vertices.at(b3))/2.0; //2nd angle measure double edgeLength=Point::distance(vertices.at(a2), vertices.at(b2)); double heightForEdge=edgeLength/(1.0/tan(angle1)+1.0/tan(angle2)); /*if (heightForEdge<maxHeight) { maxHeight=heightForEdge; }*/ maxHeight=fmin(heightForEdge,maxHeight); } return maxHeight; }
void FramedFace::generateInnerPoints(double frameWidth,const VertexVector& vertices) { int faceSize=(int) vertices.size(); inners.resize(faceSize); Point bisector; double angle,factor; for (int i=0;i<faceSize;i++) { int index1=(i-1)%faceSize; int index2=i%faceSize; int index3=(i+1)%faceSize; if (index1==-1) { index1=faceSize-1; } Point v1=vertices.at(index1); Point v2=vertices.at(index2); Point v3=vertices.at(index3); bisector=Point::angleBisector(v1, v2, v3); angle=Point::angleMeasure(v1, v2, v3)/2.0; factor=frameWidth/sin(angle)/Point::distance(v2, bisector); inners.at(i)=Point::extendLine(v2, bisector, factor); } }
std::vector<Triangle> FramedFace::connectInnerPoints(const VertexVector& vertices) { int faceSize=(int) inners.size(); std::vector<Triangle> generatedTriangles; generatedTriangles.reserve(2*faceSize); for (int i=0;i<faceSize;i++) { int index1=(i)%faceSize; int index2=(i+1)%faceSize; Point v1=vertices.at(index1); Point v2=vertices.at(index2); generatedTriangles.push_back( Triangle(v1,inners.at(index2),inners.at(index1)) ); generatedTriangles.push_back( Triangle(v1,v2,inners.at(index2)) ); } return generatedTriangles; }
std::vector<std::pair<Triangle, int>> FramedFace::makeTriangleEdgePairs(double frameWidth,const VertexVector& vertices,const EdgeVector& edges) { int faceSize=(int) edges.size(); std::vector<std::pair<Triangle, int>> pairs; pairs.reserve(2*faceSize); for (int i=0;i<faceSize;i++) { int index1=(i)%faceSize; int index2=(i+1)%faceSize; int edgeIndex=edges.at(i); Point v1=vertices.at(index1); Point v2=vertices.at(index2); pairs.push_back( std::pair<Triangle,int>( Triangle(v1,inners.at(index2),inners.at(index1)) , edgeIndex) ); pairs.push_back( std::pair<Triangle,int>( Triangle(v1,v2,inners.at(index2)) , edgeIndex) ); } return pairs; }