10

我正在使用以下代码画线,效果非常好,

http://www.merowing.info/2012/04/drawing-smooth-lines-with-cocos2d-ios-inspired-by-paper/

现在我想......

1> 检测线是否与自身相交。2) 检测 CCSprite 是否在该闭合线内。

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

  1. 第一种方法

    - (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;
    }
    

这就是我调用此方法的方式,我已将我的点存储在来自 pangesture 识别器方法的 arrLinePoints 中

  if ([self lineIntersectOccured:[[arrlinePoints objectAtIndex:0] CGPointValue] pointEnd:[[arrlinePoints objectAtIndex:[arrlinePoints count] - 1] CGPointValue]] )
  {
      NSLog(@"Line Intersected");
  }

即使在以下情况下,这也给了我真实的

在此处输入图像描述

我还通过将视图添加到 CCDirector 的视图中尝试了使用不同方法的相同功能

UIBezierPath 相交

但这带来了性能问题,我的 fps 降低到几乎 3 到 6。而且那个交叉点问题仍然存在。

相交的完美情况是

在此处输入图像描述

请尽快提供帮助!感谢大家的支持。

4

2 回答 2

3

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

找到一个好的线段相交算法应该不会太难。似乎这个问题的最高答案有一个很好的方法: 确定两条线段是否相交?

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

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

一些性能提示:

  1. 在寻找交点时,只检查最新的线段是否与其他线段发生碰撞(之前没有相交的所有线这次都不会相交)
  2. 当您可以断定两个点都在线段的一个极端时,您可能会跳过线段,例如,如果: current.ax < current.bx && (foreign.ax < current.ax && foreign.bx < current 。斧头)

我希望这可以帮助你。

于 2013-04-03T18:55:01.203 回答
1

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

于 2013-04-01T15:40:30.187 回答