123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- #include "math/CCVertex.h"
- #include "base/ccMacros.h"
- NS_CC_BEGIN
- void ccVertexLineToPolygon(Vec2 *points, float stroke, Vec2 *vertices, unsigned int offset, unsigned int nuPoints)
- {
- nuPoints += offset;
- if(nuPoints<=1) return;
- stroke *= 0.5f;
- unsigned int idx;
- unsigned int nuPointsMinus = nuPoints-1;
- for(unsigned int i = offset; i<nuPoints; i++)
- {
- idx = i*2;
- Vec2 p1 = points[i];
- Vec2 perpVector;
- if(i == 0)
- perpVector = (p1 - points[i+1]).getNormalized().getPerp();
- else if(i == nuPointsMinus)
- perpVector = (points[i-1] - p1).getNormalized().getPerp();
- else
- {
- Vec2 p2 = points[i+1];
- Vec2 p0 = points[i-1];
- Vec2 p2p1 = (p2 - p1).getNormalized();
- Vec2 p0p1 = (p0 - p1).getNormalized();
-
- float angle = acosf(p2p1.dot(p0p1));
- if(angle < CC_DEGREES_TO_RADIANS(70))
- perpVector = p2p1.getMidpoint(p0p1).getNormalized().getPerp();
- else if(angle < CC_DEGREES_TO_RADIANS(170))
- perpVector = p2p1.getMidpoint(p0p1).getNormalized();
- else
- perpVector = (p2 - p0).getNormalized().getPerp();
- }
- perpVector = perpVector * stroke;
- vertices[idx].set(p1.x + perpVector.x, p1.y + perpVector.y);
- vertices[idx + 1].set(p1.x - perpVector.x, p1.y - perpVector.y);
- }
-
- offset = (offset==0) ? 0 : offset-1;
- for(unsigned int i = offset; i<nuPointsMinus; i++)
- {
- idx = i*2;
- const unsigned int idx1 = idx+2;
- Vec2 p1 = vertices[idx];
- Vec2 p2 = vertices[idx+1];
- Vec2 p3 = vertices[idx1];
- Vec2 p4 = vertices[idx1+1];
- float s;
-
- bool fixVertex = !ccVertexLineIntersect(p1.x, p1.y, p4.x, p4.y, p2.x, p2.y, p3.x, p3.y, &s);
- if(!fixVertex)
- if (s<0.0f || s>1.0f)
- fixVertex = true;
- if(fixVertex)
- {
- vertices[idx1] = p4;
- vertices[idx1+1] = p3;
- }
- }
- }
- bool ccVertexLineIntersect(float Ax, float Ay,
- float Bx, float By,
- float Cx, float Cy,
- float Dx, float Dy, float *T)
- {
- float distAB, theCos, theSin, newX;
-
- if ((Ax==Bx && Ay==By) || (Cx==Dx && Cy==Dy)) return false;
-
- Bx-=Ax; By-=Ay;
- Cx-=Ax; Cy-=Ay;
- Dx-=Ax; Dy-=Ay;
-
- distAB = sqrtf(Bx*Bx+By*By);
-
- theCos = Bx/distAB;
- theSin = By/distAB;
- newX = Cx*theCos+Cy*theSin;
- Cy = Cy*theCos-Cx*theSin; Cx = newX;
- newX = Dx*theCos+Dy*theSin;
- Dy = Dy*theCos-Dx*theSin; Dx = newX;
-
- if (Cy == Dy) return false;
-
- *T = (Dx+(Cx-Dx)*Dy/(Dy-Cy))/distAB;
-
- return true;
- }
- NS_CC_END
|