如果你有2个点,(x1,y1)和(x2,y2),它们代表一个矩形的两个相对的角,还有另外两个点,(x3,y3)和(x4,y4),它们代表a的2个端点线段,如何检查线段是否与矩形相交?
(线段只是给定端点之间包含的段.它不是由这两个点定义的无限长度线.)
我需要一个快速算法来检查两条非无限线是否正在交叉.必须快速,因为它会在手机上运行很多.
该算法只需要返回yes或no,它不必确切地找出线交叉的位置!
我看过这里:你如何检测两个线段相交的位置? 但是这个线程是一个丛林,人们一直在说"这就是答案"但是其他两个人说这是错误的,因为这个和那个错误.
请帮我找到一个好的和有效的算法.
为了清楚起见:我需要一个你给出的函数
lineApointAx
lineApointAy
lineApointBx
lineApointBy
lineBpointAx
lineBpointAy
lineBpointBx
lineBpointBy
......并且返回true或false,具体取决于两条线是否交叉.
如果你回答(伪)代码,而不是公式,我将不胜感激.
我正在使用以下代码绘制线条,它的工作效果令人惊叹,
http://www.merowing.info/2012/04/drawing-smooth-lines-with-cocos2d-ios-inspired-by-paper/
现在我想......
1>检测线是否与自身相交.2)检测CCSprite是否在此闭合线内.
在搜索时,我遇到了LineIntersection的许多逻辑,但没有一个是准确的.我给它们中的一个检测交叉点,但是当没有交叉线时它也检测到它.
第一种方法
- (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 = …Run Code Online (Sandbox Code Playgroud)可能重复:
如何检测两个线段相交的位置?
确定两个线段是否相交?
给定两条线l1 =((A0,B0),(A1,B1))和l2 =((A2,B2),(A3,B3)); Ax,Bx是整数,(Ax,Bx)指定行的开始和结束.
是否存在仅使用整数运算来确定l1和l2是否相交的算法?(只需要一个布尔答案.)
我自己的方法是用定点算术计算交点附近的点.然后用以下等式代替解(a,b):
I:abs((A0 + a*(A1-A0)) - (A2 + b*(A3-A2)))<公差
II:abs((B0 + a*(B1-B0)) - (B2 + b*(B3-B2)))<公差
如果I和II都评估为true,我的方法应该返回true.
我的C++ - 代码:
vec.h:
#ifndef __MY_VECTOR__
#define __MY_VECTOR__
#include <stdarg.h>
template<typename VType, unsigned int dim>
class vec {
private:
VType data[dim];
public:
vec(){}
vec(VType v0, ...){
data[0] = v0;
va_list l;
va_start(l, v0);
for(unsigned int i=1; i<dim; ++i){
data[i] = va_arg(l, VType);
}
va_end(l);
}
~vec(){}
VType& operator[](unsigned int i){
return data[i];
}
VType …Run Code Online (Sandbox Code Playgroud)