/** 检查某点是否包含在多边形的范围内(只用与判断在多边形内部,不包含点在多边形边上的情况)~ */
- (BOOL) checkPointWithinPolygon:(PolyVerticesWrapper*)pvw point:(b2Vec2)point {
int verticesCount = [pvw verticesCount];
b2Vec2 *ptPolygon = [pvw vertices];
int nCross = 0;
for (int i = 0; i < verticesCount; ++ i) {
float j = ptPolygon[i].x;
float k = ptPolygon[i].y;
float m = ptPolygon[(i + 1) % verticesCount].x;
float n = ptPolygon[(i + 1) % verticesCount].y;
b2Vec2 p1(j, k);
b2Vec2 p2(m, n);
//求解 y=p.y与 p1 p2 的交点
if ( p1.y == p2.y ) { // p1p2与 y=p0.y平行
continue;
}
if ( point.y < fminf(p1.y, p2.y) ) {//交点在p1p2延长线上
continue;
}
if ( point.y > fmaxf(p1.y, p2.y) ) {//交点在p1p2延长线上
continue;
}
//求交点的 X坐标
double x = (double)(point.y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x;
if ( x > point.x ) { // 只统计单边交点
nCross++;
}
}
if(nCross%2 != 0) { //单边交点为偶数,点在多边形之外
return YES;
} else {
return NO;
}
}
public int ptInPolygon1(Point3d pt, Polyline pPolyline)
{
int count = pPolyline.NumberOfVertices;
//构建多边形外接矩形
double maxx = double.MinValue, maxy = double.MinValue, minx = double.MaxValue, miny = double.MaxValue;
for (int i = 0; i < count; i++)
{
}
if (pt.X > maxx || pt.Y > maxy || pt.X < minx || pt.Y < miny)
{
return -1;
}
Line line1 = new Line(new Point3d(maxx, pt.Y, 0), new Point3d(minx, pt.Y, 0));
int crossCount = 0;
using (Transaction tran = pDatabase.TransactionManager.StartTransaction())
{
BlockTableRecord pBlockTableRecord = tran.GetObject(pDatabase.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
Point3dCollection crossPoint = new Point3dCollection();
line1.IntersectWith(pPolyline, Intersect.OnBothOperands, crossPoint, 0, 0);
if (crossPoint.Count >= 1)
{
for (int n = 0; n < crossPoint.Count; n++)
{
Point3d crossPt = crossPoint[n];
if (crossPt.X > pt.X)
{
crossCount++;
Circle pCircle = new Circle(crossPt, Vector3d.ZAxis, 2);
pBlockTableRecord.AppendEntity(pCircle);
tran.AddNewlyCreatedDBObject(pCircle, true);
}
}
}
Circle circle = new Circle(pt, Vector3d.ZAxis, 2);
pBlockTableRecord.AppendEntity(circle);
tran.AddNewlyCreatedDBObject(circle, true);
pBlockTableRecord.AppendEntity(line1);
tran.AddNewlyCreatedDBObject(line1, true);
tran.Commit();
}
return crossCount % 2;
}