Ios 线条图+;该线与self相交,并检测绘制线内的ccsprite
我用下面的代码画出了这条线,它的效果非常好 现在我想 1> 检测直线是否与自身相交。 2) 检测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
- (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方法中检测使用绘制线的像素值绘制的线的像素值。
或者您可以参考详细的方法。这里也做了同样的工作。当您自己构建路径时,应该不需要测试像素。而是使用用于创建路径的点 找到一个好的线段相交算法应该不会太难。这个问题的首要答案似乎有一个很好的方法: 找到命中目标后,使用准确的命中点和点的历史来构建多边形 从那里,您应该能够执行“多边形中的点”测试 关于性能的一些提示:
我希望这对您有所帮助。我想在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");
}