Ios 线条图+;该线与self相交,并检测绘制线内的ccsprite

Ios 线条图+;该线与self相交,并检测绘制线内的ccsprite,ios,cocos2d-iphone,ccsprite,line-intersection,line-drawing,Ios,Cocos2d Iphone,Ccsprite,Line Intersection,Line Drawing,我用下面的代码画出了这条线,它的效果非常好 现在我想 1> 检测直线是否与自身相交。 2) 检测CCSprite是否在此封闭线内 在搜索过程中,我遇到了许多关于线交点的逻辑,但没有一个是准确的。我给出了其中一个检测交叉点的方法,但它也会在没有线的交叉点时检测 第一种方法 - (BOOL) lineIntersectOccured:(CGPoint)t1 pointEnd:(CGPoint)t2 { BOOL result = NO; int pointsCount = [arr

我用下面的代码画出了这条线,它的效果非常好

现在我想

1> 检测直线是否与自身相交。 2) 检测CCSprite是否在此封闭线内

在搜索过程中,我遇到了许多关于线交点的逻辑,但没有一个是准确的。我给出了其中一个检测交叉点的方法,但它也会在没有线的交叉点时检测

  • 第一种方法

    - (BOOL) lineIntersectOccured:(CGPoint)t1 pointEnd:(CGPoint)t2
    {
        BOOL result = NO;
        int pointsCount = [arrlinePoints count];
    
        CGPoint cp1;
        CGPoint cp2;
    
        for(int i = 0, j = 1; j < pointsCount; i++,j++)
        {
            [[arrlinePoints objectAtIndex:i] getValue:&cp1];
            [[arrlinePoints objectAtIndex:j] getValue:&cp2];
    
            // lines connected do not need to be included.
            if((cp2.x == t1.x && cp2.y == t1.y) || (cp1.x == t2.x && cp1.y == t2.y))
            {
                continue;
            }
    
            CGPoint diffLA = CGPointMake(cp2.x - cp1.x,cp2.y - cp1.y);
            CGPoint diffLB = CGPointMake(t2.x - t1.x, t2.y - t1.y);
    
            float compA = diffLA.x*cp1.y - diffLA.y * cp1.x;
            float compB = diffLB.x*t1.y - diffLB.y*t1.x;
    
            BOOL compA1 = (diffLA.x*t1.y - diffLA.y*t1.x) < compA;
            BOOL compA2 = (diffLA.x*t2.y - diffLA.y*t2.x) < compA;
            BOOL compB1 = (diffLB.x*cp1.y - diffLB.y*cp1.x) < compB;
            BOOL compB2 = (diffLB.x*cp2.y - diffLB.y*cp2.x) < compB;
    
            if(((!compA1 && compA2) || (compA1 && !compA2)) && ((!compB1 && compB2) || (compB1 && !compB2)))
            {
                result = YES;
            }
        }
        return result;
    }
    
    即使在以下情况下,这也给了我真实的感觉

    我还尝试了相同的功能和不同的方法,将视图添加到CCDirector的视图中

    但这会带来性能问题,我的fps几乎降低到3到6。而且,交叉点问题仍然是一样的

    交叉口的最佳位置是

    请尽快帮忙!
    感谢大家的支持。

    虽然没有实现,但我想您可以在TouchsMoved方法中检测使用绘制线的像素值绘制的线的像素值。
    或者您可以参考详细的方法。这里也做了同样的工作。

    当您自己构建路径时,应该不需要测试像素。而是使用用于创建路径的点

    找到一个好的线段相交算法应该不会太难。这个问题的首要答案似乎有一个很好的方法:

    找到命中目标后,使用准确的命中点和点的历史来构建多边形

    从那里,您应该能够执行“多边形中的点”测试

    关于性能的一些提示:

  • 在搜索交点时,仅检查最新线段是否与其他线段发生碰撞(以前未相交的所有直线这次将不会彼此相交)
  • 如果可以断定两个点都位于线段的一个端点上,则可以跳过线段,例如,如果: current.a.x
    我希望这对您有所帮助。

    我想在Cocos2d中检测同一条线的交点。尽管未实现,我想你可以在
    touchesMoved
    方法中检测绘制线的像素值。看看scribus/lib2geom函数find_self_cross。这可能是一个很好的建议。线段建议+1和第二个性能建议(第一个我认为是垃圾)我编辑了第一条建议,希望能澄清它,减少垃圾。
      if ([self lineIntersectOccured:[[arrlinePoints objectAtIndex:0] CGPointValue] pointEnd:[[arrlinePoints objectAtIndex:[arrlinePoints count] - 1] CGPointValue]] )
      {
          NSLog(@"Line Intersected");
      }