请教:优化这个函数里的代码,高手请进~~

genieyyt 2009-01-21 10:26:03
注重效率,在汇编层面上哪怕能减少一行,也给分~~
typedef struct { /* Line Information */
long x1; /* start point */
long y1;
long x2; /* end point */
long y2;
double ki; /* slope */
double y0; /* y clip */
long sx; /* on sort line */
long rx;
long f; /* line course flag */
/* 0 : Even/Odd rule */
/* 1 : Non-Zero winding rule */
} LineInfo ;
/********************************************************************

Class : CALC
Method : calculateCrossing
Arg1 : 1st line information pointer
Arg2 : 2nd line information pointer
Arg3 : Y Coordinate on Crossing
Return : true:crossing/false:not crossing

********************************************************************/

bool
CALC::calculateCrossing(LineInfo *line1,LineInfo *line2,long *cross_y)
{
long y;
double f_ki,f_y,tmp_y;
int flag = 0;
bool ret;

ret = false; /* not crossing */
if (line1->y1 == line2->y1)
if (line1->x1 == line2->x1) return(ret);
if (line1->y1 == line2->y2)
if (line1->x1 == line2->x2) return(ret);
if (line1->y2 == line2->y1)
if (line1->x2 == line2->x1) return(ret);
if (line1->y2 == line2->y2)
if (line1->x2 == line2->x2) return(ret);

if((line1->y1 == line1->y2) || (line2->y1 == line2->y2)) {
/* y1 == y2 then horizontal */
return(ret);
}

f_ki = line2->ki - line1->ki;
if(f_ki != 0) { /* == 0 then parallel */
if(line1->ki == 0) {
f_y = line1->x1 * line2->ki + line2->y0;
} else if(line2->ki == 0) {
f_y = line2->x1 * line1->ki + line1->y0;
} else {
tmp_y = (line2->ki * line1->y0) - (line1->ki * line2->y0);
f_y = tmp_y / f_ki;
if ((f_y * f_ki) != tmp_y)
flag = 1; /* float devision diff */
}
y = (long)f_y; /* y-axis down */
if ((double)y != f_y) y++; /* y-axis up */
else if (flag) y++;

if(((line1->y1 < y) && (y < line1->y2))
&& ((line2->y1 < y) && (y < line2->y2))) {
/* in y-axis */

ret = true; /* crossing */
*cross_y = y ;
}
}

return(ret);
}
...全文
196 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
waizqfor 2009-01-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hemiya 的回复:]
C/C++ code
/*
if (line1->y1 == line2->y1)
if (line1->x1 == line2->x1) return(ret);
if (line1->y1 == line2->y2)
if (line1->x1 == line2->x2) return(ret);
if (line1->y2 == line2->y1)
if (line1->x2 == line2->x1) return(ret);
if (line1->y2 == line2->y2)
if (line1->x2 == line2->x2) return(ret);

if((line1->y1 == line1->y2) || (…
[/Quote]
简单的优化也就像这样了 还有就是同类变量最好写在一起 减少不必要的代码行数
hemiya 2009-01-21
  • 打赏
  • 举报
回复
建议楼主行注释不要写c风格的
/*....*/
要写c++风格的
//....
看我4楼的回复就明白了.
xiaoyisnail 2009-01-21
  • 打赏
  • 举报
回复
if/else块把最可能的情况写在前面,可以减少很多判断的次数
tanmeining 2009-01-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hemiya 的回复:]
C/C++ code
/*
if (line1->y1 == line2->y1)
if (line1->x1 == line2->x1) return(ret);
if (line1->y1 == line2->y2)
if (line1->x1 == line2->x2) return(ret);
if (line1->y2 == line2->y1)
if (line1->x2 == line2->x1) return(ret);
if (line1->y2 == line2->y2)
if (line1->x2 == line2->x2) return(ret);

if((line1->y1 == line1->y2) || (…
[/Quote]

顶,我还看成了if (line1->y1 == line2->y1) 则line1->x1 = line2->x1,郁闷,太粗心了...
tanmeining 2009-01-21
  • 打赏
  • 举报
回复
其他的具体算法,不懂你那是做什么的,所以不敢动。
同时觉得仅仅缩减10+行左右的汇编代码并不能将效率提高多少,建议搂主还是在循环中着手试下...
比如for循环i++之类的改成++i这样子,还有就是算法方面再考虑考虑是否有更精简的.
hemiya 2009-01-21
  • 打赏
  • 举报
回复

/*
if (line1->y1 == line2->y1)
if (line1->x1 == line2->x1) return(ret);
if (line1->y1 == line2->y2)
if (line1->x1 == line2->x2) return(ret);
if (line1->y2 == line2->y1)
if (line1->x2 == line2->x1) return(ret);
if (line1->y2 == line2->y2)
if (line1->x2 == line2->x2) return(ret);

if((line1->y1 == line1->y2) || (line2->y1 == line2->y2)) {
/* y1 == y2 then horizontal */
return(ret);
}
*/
if (((line1->y1 == line2->y1) && (line1->x1 == line2->x1)) ||
((line1->y1 == line2->y2) && (line1->x1 == line2->x2)) ||
((line1->y2 == line2->y1) && (line1->x2 == line2->x1)) ||
((line1->y2 == line2->y2) && (line1->x2 == line2->x2)) ||
((line1->y1 == line1->y2) || (line2->y1 == line2->y2)))
return (ret);
tanmeining 2009-01-21
  • 打赏
  • 举报
回复

typedef struct { /* Line Information */
long x1; /* start point */
long y1;
long x2; /* end point */
long y2;
double ki; /* slope */
double y0; /* y clip */
long sx; /* on sort line */
long rx;
long f; /* line course flag */
/* 0 : Even/Odd rule */
/* 1 : Non-Zero winding rule */
} LineInfo ;
/********************************************************************

Class : CALC
Method : calculateCrossing
Arg1 : 1st line information pointer
Arg2 : 2nd line information pointer
Arg3 : Y Coordinate on Crossing
Return : true:crossing/false:not crossing

********************************************************************/

bool
CALC::calculateCrossing(LineInfo *line1,LineInfo *line2,long *cross_y)
{
long y;
double f_ki,f_y,tmp_y;
int flag = 0;
bool ret = false; //modefied

//ret = false; /* not crossing */
if((line1->y1 == line1->y2) || (line2->y1 == line2->y2))
{
/* y1 == y2 then horizontal */
return(ret);
}

if (line1->y1 == line2->y1)
{
if (line1->x1 == line2->x1)
return(ret);
}else
if (line1->y1 == line2->y2)
{
if (line1->x1 == line2->x2)
return(ret);
}else
if (line1->y2 == line2->y1)
{
if (line1->x2 == line2->x1)
return(ret);
}else
if (line1->y2 == line2->y2)
{
if (line1->x2 == line2->x2)
return(ret);
}

f_ki = line2->ki - line1->ki;
if(f_ki)
{ /* == 0 then parallel */
if(!line1->ki)
{
f_y = line1->x1 * line2->ki + line2->y0;
}else
if(!line2->ki)
{
f_y = line2->x1 * line1->ki + line1->y0;
}else
{
tmp_y = (line2->ki * line1->y0) - (line1->ki * line2->y0);
f_y = tmp_y / f_ki;
if ((f_y * f_ki) != tmp_y)
flag = 1; /* float devision diff */
}
y = (long)f_y; /* y-axis down */
if ((double)y != f_y)
{
++y; /* y-axis up */
}else
if (flag)
{
++y;
}

if(((line1->y1 < y) && (y < line1->y2))
&& ((line2->y1 < y) && (y < line2->y2)))
{
/* in y-axis */

ret = true; /* crossing */
*cross_y = y;
}
}

return(ret);
}

taodm 2009-01-21
  • 打赏
  • 举报
回复
换一台最强劲的计算机,程序性能立即提高30%。
genieyyt 2009-01-21
  • 打赏
  • 举报
回复
代码没对整齐,在贴遍代码
typedef struct { /* Line Information */
long x1; /* start point */
long y1;
long x2; /* end point */
long y2;
double ki; /* slope */
double y0; /* y clip */
long sx; /* on sort line */
long rx;
long f; /* line course flag */
/* 0 : Even/Odd rule */
/* 1 : Non-Zero winding rule */
} LineInfo ;
/********************************************************************

Class : CALC
Method : calculateCrossing
Arg1 : 1st line information pointer
Arg2 : 2nd line information pointer
Arg3 : Y Coordinate on Crossing
Return : true:crossing/false:not crossing

********************************************************************/

bool
CALC::calculateCrossing(LineInfo *line1,LineInfo *line2,long *cross_y)
{
long y;
double f_ki,f_y,tmp_y;
int flag = 0;
bool ret;

ret = false; /* not crossing */
if (line1->y1 == line2->y1)
if (line1->x1 == line2->x1) return(ret);
if (line1->y1 == line2->y2)
if (line1->x1 == line2->x2) return(ret);
if (line1->y2 == line2->y1)
if (line1->x2 == line2->x1) return(ret);
if (line1->y2 == line2->y2)
if (line1->x2 == line2->x2) return(ret);

if((line1->y1 == line1->y2) || (line2->y1 == line2->y2)) {
/* y1 == y2 then horizontal */
return(ret);
}

f_ki = line2->ki - line1->ki;
if(f_ki != 0) { /* == 0 then parallel */
if(line1->ki == 0) {
f_y = line1->x1 * line2->ki + line2->y0;
} else if(line2->ki == 0) {
f_y = line2->x1 * line1->ki + line1->y0;
} else {
tmp_y = (line2->ki * line1->y0) - (line1->ki * line2->y0);
f_y = tmp_y / f_ki;
if ((f_y * f_ki) != tmp_y)
flag = 1; /* float devision diff */
}
y = (long)f_y; /* y-axis down */
if ((double)y != f_y) y++; /* y-axis up */
else if (flag) y++;

if(((line1->y1 < y) && (y < line1->y2))
&& ((line2->y1 < y) && (y < line2->y2))) {
/* in y-axis */

ret = true; /* crossing */
*cross_y = y ;
}
}

return(ret);
}
Allen_zhang 2009-01-21
  • 打赏
  • 举报
回复
你这个是算两条直线有没有交点吧?

不过这个可能有问题
因为这样算会有数学误差的
zh_zhen 2009-01-21
  • 打赏
  • 举报
回复
1.多用加减和位运算,少用乘除;
2.多用整数运算,少用浮点运算;
3.浮点运算不当用==、!等运算符;
4.代码长短和运行效率没有必然关系。
genieyyt 2009-01-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 iambic 的回复:]
拿中文解释下你这是算啥的。
[/Quote]
在2维坐标平面
给出2条线(起点终点斜率),
判断相交不相交,相交算2线的交点y值
nullah 2009-01-21
  • 打赏
  • 举报
回复
up
herman~~ 2009-01-21
  • 打赏
  • 举报
回复
学习
yshuise 2009-01-21
  • 打赏
  • 举报
回复
第一:初略看了一下,if else 需要调整
第二:加inline关键字
iambic 2009-01-21
  • 打赏
  • 举报
回复
拿中文解释下你这是算啥的。
genieyyt 2009-01-21
  • 打赏
  • 举报
回复
补充一下环境
HOSTTYPE=powermac
VENDOR=apple
MACHTYPE=powerpc
编译器优化选项 -O2

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧