求两个线段交点的函数中,一开始参数用的是Point2f p
int ab_cross_cd(Point2f a, Point2f b, Point2f c, Point2f d,Point2f p) //求ab是否与cd相交,交点为p。1规范相交,0交点是一线段的端点,-1不相交。
{
double s1, s2, s3, s4;
int d1, d2, d3, d4;
//Point2f p;
d1 = dblcmp(s1 = ab_cross_ac(a, b, c), 0);
d2 = dblcmp(s2 = ab_cross_ac(a, b, d), 0);
d3 = dblcmp(s3 = ab_cross_ac(c, d, a), 0);
d4 = dblcmp(s4 = ab_cross_ac(c, d, b), 0);
//如果规范相交则求交点
if ((d1^d2) == -2 && (d3^d4) == -2)
{
p.x = (c.x*s2 - d.x*s1) / (s2 - s1);
p.y = (c.y*s2 - d.y*s1) / (s2 - s1);
return 1;
}
//如果不规范相交
if (d1 == 0 && point_on_line(c, a, b) <= 0)
{
p = c;
return 0;
}
if (d2 == 0 && point_on_line(d, a, b) <= 0)
{
p = d;
return 0;
}
if (d3 == 0 && point_on_line(a, c, d) <= 0)
{
p = a;
return 0;
}
if (d4 == 0 && point_on_line(b, c, d) <= 0)
{
p = b;
return 0;
}
//如果不相交
return -1;
}
在主函数中,先定义了一个Point2f p,然后想传入ab_cross_cd()函数中,结果没有修改p的值。
但是将上面的函数修改为
int ab_cross_cd(Point2f a, Point2f b, Point2f c, Point2f d,Point2f &p)后,就修改了p的值。
原因是:
如果使用&,表示用的是p的引用,不会调用拷贝构造函数(效率也高),即在函数ab_cross_cd()中对p的任何修改都会保存下来,p会被修改;
如果没有使用&,就会调用拷贝构造函数,在函数ab_cross_cd()中修改的是p的拷贝,没有修改p;
很多时候,如果想要提高效率(不调用拷贝构造函数),还不想改变参数,可以使用const &的组合。